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

Python DES3加密结果与PHP des-ede3-cbc不符,如何实现结果一致?

问题分析与解决

差异原因

两者加密结果不同的核心原因是PHP和Python库对密钥、IV的处理逻辑不一致:

  1. 密钥处理差异:PHP的OpenSSL针对des-ede3-cbc算法,会自动将不足24字节的密钥用0x00填充到24字节(3DES标准密钥长度);而PyCryptodome要求密钥必须是16(2-key模式)或24(3-key模式)字节,否则直接报错。你的密钥解码后为18字节,PHP自动补6个0x00到24字节,Python代码未做此处理导致结果不符。
  2. IV处理差异:DES3的块大小为8字节,PHP的OpenSSL会自动将超过8字节的IV截断到前8字节;你的IV解码后为9字节,PHP仅使用前8字节,而PyCryptodome要求IV必须严格为8字节,否则报错。
  3. 填充方式默认均为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:42:05