解决OpenSSL在C++/PHP下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";
  }
}

猜你喜欢

转载自my.oschina.net/jathon/blog/1611646