Rijndael-128/CBC256算法Python解密问题求助
解决方案与Python解密代码
问题原因
CBC模式要求加密数据长度必须是AES块大小(16字节)的整数倍,报错说明你传入的加密数据(value解码后)长度不符合要求,或解密后需要去除填充字节。另外需明确:你提到的Rijndael-128搭配32字节密钥,实际对应AES-256-CBC模式(密钥长度256位),IV必须为16字节(与块大小一致)。
解决步骤
- 解析Base64解码后的JSON结构,提取
iv和value字段 - 对
iv和value分别做Base64解码,得到二进制原始数据 - 使用AES-256-CBC初始化解密器,传入密钥、IV
- 解密后去除PKCS#7填充(加密场景下最常用的标准填充方式)
完整代码
首先安装依赖库:
pip install pycryptodome
解密代码:
import base64 import json from Crypto.Cipher import AES from Crypto.Util.Padding import unpad # 替换为你的32字节密钥(bytes类型,若为字符串需先转对应编码) input_key = b"your_32_byte_secret_key_here" # 替换为Base64解码后的完整JSON字符串 base64_decoded_json = '''{ "iv":"zv2rEAMi38LKD2FJlIeMMg==", "value":"UnnuNWqoZIgiALa4IchFA4ReYcBYwIdtpQEefEmt/ViEMgBVMhfCAydGo1tXVRAdNNRSfMm6VelGT5vORxTFM/03t3id5f5RQaPxSQ1rDRsn2yGyANDLF04szC+FhvVXiW5SBVAEtpFe....." }''' # 解析JSON数据 data = json.loads(base64_decoded_json) # Base64解码IV和加密内容 iv = base64.b64decode(data["iv"]) encrypted_value = base64.b64decode(data["value"]) # 初始化AES解密器 cipher = AES.new(input_key, AES.MODE_CBC, iv) # 解密并去除填充 try: decrypted_bytes = unpad(cipher.decrypt(encrypted_value), AES.block_size) # 转换为明文字符串(若原始明文是二进制数据,直接使用decrypted_bytes即可) plaintext = decrypted_bytes.decode("utf-8") print("解密结果:", plaintext) except ValueError as e: print(f"解密失败:{e},请检查密钥正确性、加密数据完整性")
注意事项
- 务必替换示例中
value字段的截断内容(.....)为数据库中取出的完整Base64编码值 - 密钥必须严格为32字节长度,若密钥是字符串,需确保编码后长度符合要求(如
input_key = "your_key".encode("utf-8"),需保证结果是32字节) - 若加密时使用了非PKCS#7的填充方式(如零填充),需替换
unpad为对应逻辑
内容的提问来源于stack exchange,提问作者Ati Srv
相关产品推荐
相关产品推荐

