Python DES3加密结果与PHP des-ede3-cbc不符,如何实现结果一致?
问题分析与解决
差异原因
两者加密结果不同的核心原因是PHP和Python库对密钥、IV的处理逻辑不一致:
- 密钥处理差异:PHP的OpenSSL针对
des-ede3-cbc算法,会自动将不足24字节的密钥用0x00填充到24字节(3DES标准密钥长度);而PyCryptodome要求密钥必须是16(2-key模式)或24(3-key模式)字节,否则直接报错。你的密钥解码后为18字节,PHP自动补6个0x00到24字节,Python代码未做此处理导致结果不符。 - IV处理差异:DES3的块大小为8字节,PHP的OpenSSL会自动将超过8字节的IV截断到前8字节;你的IV解码后为9字节,PHP仅使用前8字节,而PyCryptodome要求IV必须严格为8字节,否则报错。
- 填充方式默认均为PKCS#7,此部分无差异,但前两个处理逻辑的差异直接导致最终加密结果不同。
修改后的Python代码
以下代码完全对齐PHP的加密逻辑,执行后会得到与PHP一致的FF72E6D454B84A7C结果:
import binascii import base64 from Crypto.Cipher import DES3 from Crypto.Util.Padding import pad key = base64.b64decode('3pKtqxNOolyBoJouXWwVYw==') # 按PHP逻辑填充密钥到24字节,补0x00 key = key.ljust(24, b'\x00') iv = base64.b64decode('O99EDNAif90=') # 按PHP逻辑截断IV到前8字节 iv = iv[:8] cipher = DES3.new(key, DES3.MODE_CBC, iv) data = '1' data = data.encode('utf-8') # 显式指定PKCS7填充,与PHP默认行为一致 data = pad(data, DES3.block_size, style='pkcs7') encrypted = cipher.encrypt(data) print(binascii.hexlify(encrypted).decode('utf-8').upper())
内容的提问来源于stack exchange,提问作者Swilder
相关产品推荐
相关产品推荐

