PHP OpenSSL使用DES-ECB算法加密结果与在线工具不一致如何解决
问题根因及修复方案
你代码的问题集中在3个核心点,调整后即可得到匹配结果:
- 算法选型错误:你提供的密钥为32位十六进制(对应16字节),属于双密钥3DES(三重DES)的密钥长度,单DES仅支持8字节密钥,所以要将算法从
DES-ECB替换为DES-EDE3-ECB - 输入格式错误:在线工具的输入、密钥都是十六进制编码的字节序列,直接传入十六进制字符串会被当作普通ASCII文本处理,需要先通过
hex2bin函数将十六进制字符串转为原始二进制字节 - 输出格式错误:你当前用
base64_encode输出加密结果,目标结果是十六进制格式,需要改用bin2hex输出
修复后可运行代码
// 十六进制格式的输入数据和密钥 $hexData = "F01DCCE40F8C365ADE0A7DC03BC11DDE"; $hexKey = "96187BBAB2BD19ACF899B74FB4E37972"; // 转为二进制原始字节 $data = hex2bin($hexData); $key = hex2bin($hexKey); // 使用3DES-ECB算法加密,无填充 $encrypted = openssl_encrypt($data, 'DES-EDE3-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING); // 转为十六进制输出,和目标结果对齐 echo strtoupper(bin2hex($encrypted)); // 输出结果:355A627E977D8ECF4953C98D801E472F
注意
DES、3DES以及ECB模式本身安全性极低,以上方案仅用于旧系统兼容对接,新业务不建议使用该加密组合。
内容的提问来源于stack exchange,提问作者evenloooo
相关产品推荐
相关产品推荐

