AES(Advanced Encryption Standard,高級加密標準)是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣爲全世界所使用。Rijndael是在AES中使用的基本密碼算法。php
對於此算法網上流傳有不少php代碼實現的版本,其實php的擴展mcrypt徹底支持此加密算法,沒必要要本身去寫代碼實現。先不說本身寫費時費力(固然你如果想研究此加密算法,那另說),使用php代碼實現的算法效率也不會過高。算法
mcrypt擴展在php中默認是沒有的,須要本身安裝配置,其方法能夠在網上搜索,這裏不在詳述。你能夠使用如下代碼檢查你的php環境是否支持mcrypt加密
- $cipher_list = mcrypt_list_algorithms();
- $mode_list = mcrypt_list_modes();
-
- echo '<xmp>';
- print_r($cipher_list);
- print_r($mode_list);
若你的環境支持mcrypt,輸出結果應該以下:spa
- Array
- (
- [0] => cast-128
- [1] => gost
- [2] => rijndael-128
- [3] => twofish
- [4] => arcfour
- [5] => cast-256
- [6] => loki97
- [7] => rijndael-192
- [8] => saferplus
- [9] => wake
- [10] => blowfish-compat
- [11] => des
- [12] => rijndael-256
- [13] => serpent
- [14] => xtea
- [15] => blowfish
- [16] => enigma
- [17] => rc2
- [18] => tripledes
- )
- Array
- (
- [0] => cbc
- [1] => cfb
- [2] => ctr
- [3] => ecb
- [4] => ncfb
- [5] => nofb
- [6] => ofb
- [7] => stream
- )
其中rijndael-128,rijndael-192,rijndael-256就是AES加密,3種分別是使用不一樣的數據塊和密鑰長度進行加密。.net
如下是使用擴展mcrypt實現AES加密的簡單示例code
-
- abstract class AES{
-
- const CIPHER = MCRYPT_RIJNDAEL_128;
-
- const MODE = MCRYPT_MODE_ECB;
-
-
- static public function encode( $key, $str ){
- $iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);
- return mcrypt_encrypt(self::CIPHER, $key, $str, self::MODE, $iv);
- }
-
-
- static public function decode( $key, $str ){
- $iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);
- return mcrypt_decrypt(self::CIPHER, $key, $str, self::MODE, $iv);
- }
- }
使用示例:blog
- $str = '我是明文我是明文我是明文我是明文我是明文dsfdghgasdfasdddddddd';
- $key = 'aSGJLGYEWERWRREW4567i8o';
-
- $str1=AES::encode($key, $str);
- $str2=AES::decode($key, $str1);
-
-
- echo '<xmp>';
- var_dump($str);
- var_dump($str1);
- var_dump($str2);
- var_dump(rtrim($str2));
輸出結果ip
問題,不知道是什麼緣由,解密後的字符串(見上圖),末尾還留下有不可見的填充字符,當明文恰好能夠分組時則沒有。ci