Python cryptography AES256-CBC加密后Rust OpenSSL解密失败求助
解决Python cryptography与Rust OpenSSL AES-CBC解密适配问题
核心问题根源
之前用Python调用OpenSSL命令行加密时,OpenSSL默认走带salt的特定加密格式+PKCS#7填充逻辑,而cryptography库是裸加密实现,必须手动对齐这些细节,才能让Rust端正常解密。
具体修正步骤
1. 对齐OpenSSL的salt与密钥派生逻辑
OpenSSL命令行加密AES256-CBC时,会自动生成8字节随机salt,前缀固定为salted__,再通过EVP_BytesToKey(旧版默认)或PBKDF2(新版默认)从密码+盐生成密钥和IV。如果你的Rust代码是按这个格式解析的,cryptography需要手动实现这套流程:
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import padding from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC from cryptography.hazmat.primitives import hashes from cryptography.hazmat.backends import default_backend import os def openssl_compatible_aes256cbc_encrypt(password, plaintext): # 生成OpenSSL标准的8字节随机salt salt = os.urandom(8) # 用OpenSSL旧版默认的EVP_BytesToKey逻辑(MD5摘要+1次迭代)生成密钥+IV kdf = PBKDF2HMAC( algorithm=hashes.MD5(), length=32 + 16, # AES256密钥32字节 + CBC-IV16字节 salt=salt, iterations=1, backend=default_backend() ) key_iv = kdf.derive(password.encode('utf-8')) key = key_iv[:32] iv = key_iv[32:] # 应用PKCS#7填充(OpenSSL默认填充方式) padder = padding.PKCS7(128).padder() padded_plaintext = padder.update(plaintext) + padder.finalize() # 执行加密 cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend()) encryptor = cipher.encryptor() ciphertext = encryptor.update(padded_plaintext) + encryptor.finalize() # 拼接OpenSSL标准格式:salted__前缀 + salt + 密文 return b'salted__' + salt + ciphertext
2. 确认填充方式匹配
OpenSSL默认使用PKCS#7填充(与PKCS#5兼容,因AES块大小为128位),务必确保cryptography代码中用的是padding.PKCS7(128),不要用ZeroPadding或其他填充方式。
3. 对齐IV生成逻辑
如果Rust代码是按OpenSSL逻辑从密码+盐派生IV,绝对不能手动生成独立IV并附加到数据中,必须和密钥用同一套派生流程生成。
4. 验证数据格式一致性
用OpenSSL命令行加密一个测试文件,对比cryptography生成的加密数据:
openssl enc -aes-256-cbc -pass pass:your_password -in test.txt -out test_openssl.enc
查看test_openssl.enc的前16字节:前8字节是salted__,后8字节是随机salt。确保cryptography生成的文件开头完全一致。
常见踩坑点
- 漏掉
salted__前缀或salt,导致Rust端解析密钥/IV时完全错误 - 密钥派生的摘要算法、迭代次数和OpenSSL不匹配(比如用SHA256但OpenSSL旧版默认是MD5)
- 填充方式选错,比如用ZeroPadding替代PKCS#7
- IV生成逻辑独立于密钥,和OpenSSL的派生逻辑冲突
内容的提问来源于stack exchange,提问作者Nil
相关产品推荐
相关产品推荐

