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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:47:44