Python ECB模式Triple DES加密结果与在线工具不匹配问题求解
问题原因分析
- 3DES是块加密算法,ECB模式下要求输入明文长度必须为8字节(单块大小)的整数倍,因此需要对明文做填充处理,通用标准为PKCS7填充规则。
- PKCS7填充规则明确:如果原始明文长度刚好是块大小的整数倍,需要额外补充1个长度等于块大小的填充块,每个填充字节的取值等于块大小(本次场景块大小为8,即补充8个
\x08字节)。 - 你的本地代码未添加填充逻辑,测试明文
hellomyf刚好为8字节,所以仅加密了8字节原始内容,base64编码后密文长度更短;在线工具默认启用PKCS7填充,额外补充8字节填充内容后再加密,最终得到16字节密文,base64编码后长度更长,所以和本地输出不一致。 - 目标SOAP接口的解密逻辑默认会校验并去除PKCS7填充,你未加填充生成的密文传入接口后,解密填充校验失败,因此调用报错。
修复方案
补充PKCS7填充逻辑即可,修改后的完整可运行代码如下:
from Crypto.Cipher import DES3 from Crypto.Util.Padding import pad, unpad from base64 import b64encode, b64decode key = 'GHYZXFZH2A4B6N6P7R9SPNMT' block_size = DES3.block_size cipher_encrypt = DES3.new(key, DES3.MODE_ECB) plaintext = 'hellomyf' # 新增PKCS7填充逻辑 padded_plaintext = pad(plaintext.encode('utf-8'), block_size, style='pkcs7') encrypted_text = cipher_encrypt.encrypt(padded_plaintext) ct = b64encode(encrypted_text).decode('utf-8') print(ct) # 解密时需先解密再去除填充 byte_string = b64decode(ct) decrypted_padded = cipher_encrypt.decrypt(byte_string) pt = unpad(decrypted_padded, block_size, style='pkcs7')
修改后运行输出的密文和在线工具结果一致,可正常调用目标SOAP接口。
内容的提问来源于stack exchange,提问作者Stramzik
相关产品推荐
相关产品推荐

