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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:10:17