Python中PBKDF2生成AES-256-CBC密钥/IV错误,求排查解决
问题:将OpenSSL批处理解密逻辑转为Python代码时的密钥/IV生成异常
原批处理解密命令
我原本用以下批处理命令完成解密,运行正常:
openssl enc -d -aes-256-cbc -md sha256 -salt -pbkdf2 -in input.tgz.enc -out output.tgz -pass file:symetric_key
基础疑问
作为加密新手,我了解到OpenSSL会从symetric.key文件计算所需的IV、盐值和密钥,想确认:OpenSSL使用-pass file:symetric_key时,是否会读取文件中不带换行符\n的第一行作为密码?
当前Python实现代码
我尝试把解密逻辑转成Python代码,如下:
import hashlib from Crypto.Cipher import AES from Crypto.Util.Padding import unpad encrypted_recording = b'Salted__"\x05\x32df......' # 示例加密数据开头 symetric_key_path = "symetric.key" with open(symetric_key_path, "rb") as f: # 读取ASCII格式的密钥 symetric_key = f.readline() symetric_key = symetric_key.strip(b"\n") # 从加密数据、密钥生成AES所需的key和iv def get_key_and_iv(encrypted_recording, symetric_key): """用PBKDF2生成密钥和IV,用于后续AES解密""" # 提取加密数据中的8字节盐值(Salted__标识后8字节) salt = encrypted_recording[8:16] # 通过PBKDF2生成32字节密钥+16字节IV,共48字节 key_and_iv = hashlib.pbkdf2_hmac('sha256', symetric_key, salt, 64000, 48) key = key_and_iv[:32] iv = key_and_iv[32:48] return key, iv # 执行解密 def decrypt_encrypted_recording(encrypted_recording, key, iv): cipher = AES.new(key=key, mode=AES.MODE_CBC, iv=iv) # 跳过开头16字节的Salted__标识+盐值 encrypted_data = encrypted_recording[16:] decrypted_data = cipher.decrypt(encrypted_data) # 去除PKCS7填充 decrypted_data = unpad(decrypted_data, block_size=AES.block_size) return decrypted_data
遇到的异常问题
- 我通过批处理命令输出了正确的密钥和IV十六进制值,用
binascii.unhexlify转换后传入decrypt_encrypted_recording,可以正常解密数据。 - 但用自己写的
get_key_and_iv函数生成的密钥和IV却不正确,导致解密失败。 - 已排查的点:加密和解密用的是相同命令及默认参数;密钥文件本身无问题;尝试过调整PBKDF2迭代次数、保留/去除密钥的换行符;加密前后未对数据做额外编码处理。
内容的提问来源于stack exchange,提问作者Doma96
相关产品推荐
相关产品推荐

