PHP 报错openssl_encrypt(): IV passed is 32 bytes long...

本文探讨了在使用PHP的openssl_encrypt函数时,遇到AES-128-CBC加密错误,原因在于IV初始化向量长度不匹配。作者详细解释了问题的根源,并提供了通过openssl_cipher_iv_length函数验证算法所需IV长度的方法。解决方案是确保IV长度为16字节。关键词:AES-128-CBC, IV长度, openssl_encrypt, OpenSSL, 加密算法
摘要由CSDN通过智能技术生成

问题

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

根据提供的引用内容,"write EPROTO 820104:error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER:..\..\third_party\boringssl\src\ssl\tls_record.cc:231"是一个错误消息,涉及到SSL协议版本不匹配的问题。 这种错误通常表示客户端和服务器之间的SSL协议版本不兼容,可能是由于客户端或服务器使用了不支持的SSL版本导致的。解决此问题的方法包括: 1. 检查Postman和服务器使用的SSL协议版本,并确保它们兼容。可以尝试使用较新的SSL版本,或与服务器管理员联系以获取支持的SSL版本信息。 2. 确保Postman的SSL配置正确。检查Postman的SSL设置和证书配置,确保其与服务器的配置相匹配。如果需要,可以更新Postman的SSL证书。 3. 检查网络连接和防火墙设置。有时,网络连接或防火墙设置可能会导致SSL连接问题。确保网络连接正常,并且没有任何阻止SSL连接的防火墙规则。 4. 更新Postman和相关库。确保使用的Postman版本和相关库是最新的,以获得最新的修复和改进。 请注意,具体的解决方法可能因情况而异。如果遇到此错误,请参考Postman和SSL协议的文档,或与相关技术支持人员联系,以获取更准确的解决方案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [postman报错Error: write EPROTO 93988952:error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_...](https://blog.csdn.net/weixin_48083022/article/details/116041897)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Could not get responseError: write EPROTO 51601288:error:100000f7:SSL routines:OPENSSL_internal:WRO](https://blog.csdn.net/qq_22701869/article/details/122962128)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值