PHP使用openssl_decrypt做AES-128-ECB解密结果与预期不符排查
根因分析
- 密钥格式不匹配:AES-128 算法要求传入 16 字节长度的原始二进制密钥,你的代码中直接传入字符串
"0000000000000000",该字符串的每个字符对应 ASCII 编码的0x30,实际生效的密钥是 16 个连续的0x30字节,和你预期的全 0 二进制密钥完全不符。 - 其余配置逻辑正确:你已经对十六进制格式的密文做了
hex2bin()转换为二进制传入解密函数,openssl_decrypt第四个参数3对应OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,适配无填充的 AES ECB 解密场景,这两部分配置都没有问题。 - 在线工具解密正常的原因:在线解密工具默认会将输入的十六进制格式密钥自动转换为二进制数据,使用的是正确的全 0 二进制密钥,因此解密结果符合预期。
修复方案
在密钥赋值后添加十六进制转二进制的逻辑即可,修复后的完整代码如下:
$encryptedText = "4181EF4A4690BC0B1281355489C96009"; $key = "0000000000000000"; // 将十六进制格式的密钥转换为原始二进制数据 $key = hex2bin($key); $method = "aes-128-ecb"; $encryptedText = hex2bin($encryptedText); $decryptedText = openssl_decrypt($encryptedText, $method, $key, 3); var_dump($decryptedText); echo "<br>"; var_dump(bin2hex($decryptedText));
运行代码后输出的十六进制结果和预期值 c704774b4a2f7080280000f5a5d104a8 完全一致。
内容的提问来源于stack exchange,提问作者Fabio Martinelli
相关产品推荐
相关产品推荐

