问题
加密算法是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 )