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

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字节密钥不符,需要确认实际使用的算法规格。

修复步骤

  1. 使用hex2bin()函数将十六进制格式的密钥、IV转换为原始二进制字节
  2. 修正变量名错误,正确传入待解密数据
  3. 匹配算法与密钥长度:如果确认是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:54:04