You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java加密Zip文件后用OpenSSL解密失败问题排查

Java加密Zip的OpenSSL/Python解密方案

错误原因分析

你之前用OpenSSL解密失败的核心问题是Java加密逻辑和OpenSSL默认解密逻辑不兼容:

  • Java采用PBKDF2WithHmacSHA256派生密钥,而OpenSSL默认aes-256-cbc命令使用自有MD5迭代的密钥派生算法
  • 你构造的Salted__头是OpenSSL默认加密的格式,但Java加密并未生成这个结构,强行套用只会导致解密错乱

正确解密方案

方案1:用OpenSSL 3.0+解密

OpenSSL 3.0新增的kdf命令支持PBKDF2,可直接生成与Java一致的密钥,执行以下步骤:

  1. 解码Base64并拆分IV与密文
# 解码Base64到临时二进制文件
openssl base64 -d -in input.enc -out temp.bin
# 提取前16字节作为IV
dd if=temp.bin of=iv.bin bs=1 count=16
# 提取剩余内容作为密文
dd if=temp.bin of=ciphertext.bin bs=1 skip=16
  1. 用PBKDF2生成256位AES密钥
    注意:盐值MySalt转十六进制为4d7953616c74,密码需保留末尾空格:
openssl kdf -pbkdf2 -iter 65536 -digest sha256 -salt 4d7953616c74 -keyout key.bin -keylen 32 -pass pass:"__hello123__world123__again123__ "
  1. 执行解密
    指定密钥、IV,禁用OpenSSL默认的盐处理逻辑:
openssl aes-256-cbc -d -nosalt -K $(xxd -p key.bin) -iv $(xxd -p iv.bin) -in ciphertext.bin -out decrypted.zip

方案2:用Python解密

Python的pycryptodome库可直接实现与Java一致的加密逻辑,操作更简洁:

  1. 安装依赖
pip install pycryptodome
  1. 解密代码
import base64
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

# 与Java完全一致的配置参数
PASSWORD = b"__hello123__world123__again123__ "
SALT = b"MySalt"
ITERATIONS = 65536
KEY_LENGTH = 32  # 256位密钥

# 读取并解码加密文件
with open("input.enc", "rb") as f:
    encrypted_data = f.read()
decoded_data = base64.b64decode(encrypted_data)

# 拆分IV(前16字节)和密文
iv = decoded_data[:16]
ciphertext = decoded_data[16:]

# 用PBKDF2生成密钥
aes_key = PBKDF2(PASSWORD, SALT, dkLen=KEY_LENGTH, count=ITERATIONS, hmac_hash_module='SHA256')

# 解密并去除PKCS5填充
cipher = AES.new(aes_key, AES.MODE_CBC, iv)
plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)

# 保存解密后的Zip文件
with open("decrypted.zip", "wb") as f:
    f.write(plaintext)

内容的提问来源于stack exchange,提问作者TenG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:28:13