最近公司需要用到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,以此类推。下面是我的自动填充代码:
海报
0 条评论
242
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~