PHP7中openssl_encrypt加密:32位Key和IV长度导致错误如何解决?

php7中openssl_encrypt加密:32位key和iv长度导致错误如何解决?

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中文网其它相关文章!

https://www.php.cn/faq/1238258.html

发表回复

Your email address will not be published. Required fields are marked *