问题

加密算法是aes-128-cbc,调用openssl_encrypt方法加密时报错:
openssl_encrypt():IV passed is 32 bytes long which is longer than the 16 
expected by selected cipher

原因

openssl_encrypt使用的加密算法是aes-128-cbc,该算法需要的iv初始化向量长度是16字节,
传入的iv初始化向量长度是32字节,超出预期长度,导致报错

测试其他IV长度

算法是aes-128-cbc,尝试传入13字节或18字节,都会产生报错,如下:

1、openssl_encrypt(): IV passed is only 13 bytes long, cipher expects an IV 
of precisely 16 bytes

2、openssl_encrypt(): IV passed is 18 bytes long which is longer than the 16 
expected by selected cipher

由此可得,传入的iv长度必须与aes-128-cbc算法要求的长度一致,过长或过短都不行

解决方案

传入的iv长度与aes-128-cbc算法要求的iv长度一致即可,即16字节的iv

如何确定算法要求的iv初始化向量长度?

‌‌openssl_cipher_iv_length("aes-128-cbc"); 

//结果为16,说明aes-128-cbc算法要求的iv长度是16字节

关于aes-128-gcm算法的iv长度

测试发现:

openssl_cipher_iv_length("aes-128-gcm") 得到的结果是12

但是传入的iv过长或过短,都不会产生报错,与aes-cbc算法有差异,不清楚原因

参考文章

PHP openssl_encrypt的错误原因是什么? - 编程乐园

PHP: openssl_encrypt - Manual(参考其中的示例#1 

GitHub 加速计划 / ope / openssl
25.13 K
9.99 K
下载
传输层安全性/安全套接层及其加密库
最近提交(Master分支:1 个月前 )
fd39d1c8 Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/25095) 3 个月前
ae87c488 Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/25095) 3 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐