
PHP7中使用openssl_encrypt加密时密钥和IV长度问题详解
本文分析在PHP7中使用openssl_encrypt函数进行AES加密时,由于密钥(Key)和初始化向量(IV)长度不匹配导致的错误。 问题源于用户尝试使用32位长度的密钥和IV进行AES-128-CBC加密,导致代码报错,而在线加密工具却能成功加密。
问题代码:
<?php $str = '123'; $key = 'aaabbbccctttdddaaaabbbccctttddda'; $iv = 'aaabbbccctttdddaaaabbbccctttddda'; $encryptstr = openssl_encrypt($str, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $iv); $encryptstr = base64_encode($encryptstr); var_dump($encryptstr); ?>
这段代码使用AES-128-CBC加密模式和PKCS7填充,但密钥和IV长度均为32个字符(256位),而AES-128-CBC要求密钥长度为16个字符(128位)。 这导致openssl_encrypt函数报错。
立即学习“PHP免费学习笔记(深入)”;
问题根源:
关键在于密钥长度。AES-128-CBC算法只能处理128位密钥,而提供的密钥是256位。 IV长度通常为16字节(128位),这并非问题的直接原因。
解决方案:
将加密算法更改为AES-256-CBC,以匹配256位密钥长度。
修改后的代码:
<?php $str = '123'; $key = 'AAABBBCCCTTTDDDAAAABBBCCCTTTDDDA'; $iv = 'AAABBBCCCTTTDDDAAAABBBCCCTTTDDDA'; $encryptStr = openssl_encrypt($str, 'aes-256-cbc', $key, 0, $iv); // 去除OPENSSL_RAW_DATA,直接使用base64编码 var_dump($encryptStr); ?>
修改后的代码使用AES-256-CBC算法,可以正确处理256位密钥,从而得到与某些在线加密工具一致的加密结果。 需要注意的是,这里去掉了OPENSSL_RAW_DATA选项,让openssl_encrypt函数直接返回base64编码的结果。 在线工具的结果可能因为其他处理而略有不同,但这并非PHP代码本身的问题。 即使在线工具选择256位加密,结果也可能与修改后的代码略有差异,这可能是由于在线工具的实现细节不同造成的。
以上就是PHP7中openssl_encrypt加密:32位Key和IV长度导致错误如何解决?的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号