PHP实现AES-CBC-128解密报IV长度错误是否需转换hex密钥与IV?
PHP AES解密报错问题解决方案
核心问题原因
你遇到的报错及解密失败是三个问题共同导致的:
- 十六进制格式的密钥、IV未转换为原始二进制字节直接传入:
openssl_decrypt要求密钥和IV参数为原始二进制格式,你直接传入十六进制字符串时,每1个十六进制字符会被算作1字节,32个字符的十六进制IV就变成了32字节,而AES-128-CBC要求的IV长度为16字节,因此触发长度不匹配警告。 - 代码变量名错误:函数接收的加密数据参数为
$encrypted_data,但调用openssl_decrypt时传入了未定义的$encryption变量,导致解密逻辑无法获取待解密数据。 - 算法与密钥长度不匹配:你标注使用128位AES,但提供的十六进制密钥共64个字符,转换为二进制后为32字节(256位),与128位AES要求的16字节密钥不符,需要确认实际使用的算法规格。
修复步骤
- 使用
hex2bin()函数将十六进制格式的密钥、IV转换为原始二进制字节 - 修正变量名错误,正确传入待解密数据
- 匹配算法与密钥长度:如果确认是256位AES,将加密算法改为
aes-256-cbc;如果确实是128位AES,需要核对密钥是否正确,128位密钥对应的十六进制字符串应为32个字符。
修正后的代码示例
function decrypt($encrypted_data){ // 确认算法规格:当前密钥转二进制后为32字节,对应256位AES,若为128位请调整为aes-128-cbc并核对密钥 $ciphering = 'aes-256-cbc'; $options = 0; // 十六进制IV转二进制,转换后为16字节,符合要求 $decrypt_iv = hex2bin('00000000000000000000000000000000'); // 十六进制密钥转二进制 $decrypt_key = hex2bin('ec313f73c50b8fcb3ecc473107946b358ddf7a04894be9f6eb3bb0781a6d0d2d'); // 修正变量名,正确传入待解密数据 $decryption = openssl_decrypt($encrypted_data, $ciphering, $decrypt_key, $options, $decrypt_iv); return $decryption; }
补充说明:openssl扩展默认自动处理PKCS5/PKCS7填充,无需额外编写填充处理逻辑。
内容的提问来源于stack exchange,提问作者Ben Koo
相关产品推荐
相关产品推荐

