Python中TripleDes解密失败求助:误用AES库问题排查
3DES解密失败排查(误用AES模块)
我需要使用TripleDES进行解密操作,但目前误用Python的Crypto.Cipher库中的AES模块尝试解密3DES密钥时失败。
密钥生成代码
m = md5(key.encode('ISO-8859-1')).digest() cipher = AES.new(m, AES.MODE_ECB)
解密步骤代码
x = bytes(password, 'ISO-8859-1') b = cipher.decrypt(x)
预期与实际结果
- 预期返回:类似
0412719876FEDCBA的十六进制字符串 - 实际返回字节数据:
b'\x1e\xec\xd6A\xb13\xcf\x14N9\xa3\xb6\xdfZ\xf5\xbe'
- 转换为十六进制后:
ac6b1433d25c07bd3853b293cbf719db
排查思路
- 算法误用修正:必须替换为
Crypto.Cipher.TripleDES模块,3DES和AES是完全不同的对称加密算法,密钥长度、分组逻辑均不匹配,用AES处理3DES加密的数据必然得到错误结果。 - 密钥适配检查:3DES支持16字节(双密钥)或24字节(三密钥)长度,你当前用MD5生成的16字节摘要可直接作为双密钥使用,但要确认加密端的密钥生成逻辑和此完全一致。
- 模式与填充验证:
- 确认加密端是否同样使用ECB模式(ECB无IV,但安全性弱,若加密端用了其他模式如CBC,需补充IV参数)。
- 检查填充规则:若加密时用了PKCS#5/PKCS#7填充,解密后需手动去除填充;若未填充,待解密数据长度必须是8字节的整数倍(3DES分组大小为8字节)。
- 编码一致性保障:全程保持
ISO-8859-1编码,确保加密和解密阶段的字符串转字节逻辑完全一致。 - 结果格式转换:解密得到的字节数据需转换为十六进制字符串,可使用
b.hex().upper()(或小写)得到类似预期格式的结果。
内容的提问来源于stack exchange,提问作者Patrick Vieira Santos
相关产品推荐
相关产品推荐

