使用php擴展mcrypt實現AES加密

AES(Advanced Encryption Standard,高級加密標準)是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣爲全世界所使用。Rijndael是在AES中使用的基本密碼算法。php

 

對於此算法網上流傳有不少php代碼實現的版本,其實php的擴展mcrypt徹底支持此加密算法,沒必要要本身去寫代碼實現。先不說本身寫費時費力(固然你如果想研究此加密算法,那另說),使用php代碼實現的算法效率也不會過高。算法

 

mcrypt擴展在php中默認是沒有的,須要本身安裝配置,其方法能夠在網上搜索,這裏不在詳述。你能夠使用如下代碼檢查你的php環境是否支持mcrypt加密

 

[php]  view plain copy
 
  1. $cipher_list = mcrypt_list_algorithms();//mcrypt支持的加密算法列表  
  2. $mode_list = mcrypt_list_modes();   //mcrypt支持的加密模式列表  
  3.   
  4. echo '<xmp>';  
  5. print_r($cipher_list);  
  6. print_r($mode_list);  

若你的環境支持mcrypt,輸出結果應該以下:spa

 

 

[plain]  view plain copy
 
  1. Array  
  2. (  
  3.     [0] => cast-128  
  4.     [1] => gost  
  5.     [2] => rijndael-128  
  6.     [3] => twofish  
  7.     [4] => arcfour  
  8.     [5] => cast-256  
  9.     [6] => loki97  
  10.     [7] => rijndael-192  
  11.     [8] => saferplus  
  12.     [9] => wake  
  13.     [10] => blowfish-compat  
  14.     [11] => des  
  15.     [12] => rijndael-256  
  16.     [13] => serpent  
  17.     [14] => xtea  
  18.     [15] => blowfish  
  19.     [16] => enigma  
  20.     [17] => rc2  
  21.     [18] => tripledes  
  22. )  
  23. Array  
  24. (  
  25.     [0] => cbc  
  26.     [1] => cfb  
  27.     [2] => ctr  
  28.     [3] => ecb  
  29.     [4] => ncfb  
  30.     [5] => nofb  
  31.     [6] => ofb  
  32.     [7] => stream  
  33. )  

其中rijndael-128,rijndael-192,rijndael-256就是AES加密,3種分別是使用不一樣的數據塊和密鑰長度進行加密。.net

 

如下是使用擴展mcrypt實現AES加密的簡單示例code

 

[php]  view plain copy
 
  1. /** 
  2.  * 利用mcrypt作AES加密解密 
  3.  * @author ts24<tsxw24@gmail.com> 
  4.  */  
  5.   
  6. abstract class AES{  
  7.     /** 
  8.      * 算法,另外還有192和256兩種長度 
  9.      */  
  10.     const CIPHER = MCRYPT_RIJNDAEL_128;  
  11.     /** 
  12.      * 模式  
  13.      */  
  14.     const MODE = MCRYPT_MODE_ECB;  
  15.   
  16.     /** 
  17.      * 加密 
  18.      * @param string $key   密鑰 
  19.      * @param string $str   需加密的字符串 
  20.      * @return type  
  21.      */  
  22.     static public function encode( $key, $str ){  
  23.         $iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);  
  24.         return mcrypt_encrypt(self::CIPHER, $key, $str, self::MODE, $iv);  
  25.     }  
  26.       
  27.     /** 
  28.      * 解密 
  29.      * @param type $key 
  30.      * @param type $str 
  31.      * @return type  
  32.      */  
  33.     static public function decode( $key, $str ){  
  34.         $iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);  
  35.         return mcrypt_decrypt(self::CIPHER, $key, $str, self::MODE, $iv);  
  36.     }  
  37. }  


使用示例:blog

 

 

[php]  view plain copy
 
  1. $str = '我是明文我是明文我是明文我是明文我是明文dsfdghgasdfasdddddddd';  
  2. $key = 'aSGJLGYEWERWRREW4567i8o';  
  3.   
  4. $str1=AES::encode($key, $str);  
  5. $str2=AES::decode($key, $str1);  
  6.   
  7.   
  8. echo '<xmp>';  
  9. var_dump($str);  
  10. var_dump($str1);  
  11. var_dump($str2);  
  12. var_dump(rtrim($str2));  


輸出結果ip

 

問題,不知道是什麼緣由,解密後的字符串(見上圖),末尾還留下有不可見的填充字符,當明文恰好能夠分組時則沒有。ci

相關文章
相關標籤/搜索