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

PHP中3DES-ECB模式加密结果不符,请求错误排查

你的3DES加密结果不符的原因及修正方案

我帮你排查了代码里的问题,主要出在算法模式和密钥类型不匹配上,具体来说有两个关键点:

1. 算法名称错误,未明确指定ECB模式

你使用的des-ede3是OpenSSL中3-key 3DES的默认模式(CBC模式),但你的密钥长度是16字节(对应2-key 3DES,即K1=K3的模式),而且HSM和在线工具用的是ECB模式。OpenSSL的算法命名规则需要明确指定模式,正确的2-key 3DES ECB模式算法名应该是des-ede-ecb。

如果不指定ECB模式,OpenSSL会默认使用CBC模式,这时候即使你没传入IV,它会自动使用空IV,但CBC和ECB的加密逻辑完全不同,结果自然对不上。

2. 密钥类型与算法不匹配

des-ede3要求24字节(192位)的密钥,而你的密钥是32位十六进制字符串,转成二进制后是16字节(128位),属于2-key 3DES的密钥(K1和K2各8字节,K3复用K1)。用3-key的算法去处理2-key的密钥,OpenSSL会自动填充0到24字节,导致实际使用的密钥和你预期的完全不同。


修正后的代码

把算法名改成des-ede-ecb即可,填充参数OPENSSL_ZERO_PADDING在你的场景下是正确的(因为输入数据刚好是2个8字节的3DES块,不需要填充):

function tripleDES($data, $key) { 
    $key = hex2bin($key); 
    $data = hex2bin($data); 
    // 使用2-key 3DES ECB模式,原始输出+零填充(数据长度达标时无填充)
    $enc = openssl_encrypt($data, 'des-ede-ecb', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); 
    return strtoupper(bin2hex($enc)); 
}

测试你的参数:

  • $data = "3200000025381234"
  • $key = "98137332E06BBA25AEE51CFD150EA8E3"

运行后就能得到预期结果:7B66D9A5010A8035。


内容的提问来源于stack exchange,提问作者Besoul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:48:14