解決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”; }}