解决OpenSSL在C++/PHP下AES加密结果不一致问题(openssl aes加密文件)
最近公司需要用到AES算法对数据进行加密传输,其中客户端用的是C/C++开发,web端用的是PHP开发。
C/C++这边使用OpenSSL库实现AES加密,PHP端则使用自带的 openssl_encrypt 实现AES加密,一开始都挺顺利的,到后面对接时才发现两边加密出来的结果不一致,但两边的密钥与初始向量都是一样的。
经过反复测试后,发现当明文刚好为16个字节的倍数时,则两边加密出来的密文是一致的。最后上网搜了一下资料,发现OpenSSL进行AES加密时,每次只能加密16个字节,所以明文长度必须是16的整数倍,或者至少大于in长度的最小16倍数,这样才能真正完成加密解密。而如果明文长度不足不是16的倍数,那么最后的几个字节,其实相当于填充 \0 。
既然发现了问题原因,那就好办了,只需要PHP这边在加密前先判断一下明文长度,长度不是16的倍数的,就自动填充 \0 到16的倍数即可。比如长度为15,则填充到16,30则填充到32,以此类推。下面是我的自动填充代码:
<?php $text = "12345678"; $text_len = strlen($text); $mod = $text_len%16; if($mod){ $max = $text_len + (16 - $mod); for($i=$text_len;$i<$max;$i++){ $text[$i] = "\0"; } }免责声明:本文内容由互联网用户贡献,不作为任何投资建议。投资决策需建立在独立思考之上,本文内容仅供参考,风险自担!如有侵权请联系我们删除,本文链接:http://www.panmou.com/zixun/61330.html。