zoukankan      html  css  js  c++  java
  • 使用php扩展mcrypt实现AES加密

    AES(Advanced Encryption Standard,高级加密标准)是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。Rijndael是在AES中使用的基本密码算法。

    对于此算法网上流传有很多php代码实现的版本,其实php的扩展mcrypt完全支持此加密算法,不必要自己去写代码实现。先不说自己写费时费力(当然你若是想研究此加密算法,那另说),使用php代码实现的算法效率也不会太高。

    mcrypt扩展在php中默认是没有的,需要自己安装配置,其方法可以在网上搜索,这里不在详述。你可以使用以下代码检查你的php环境是否支持mcrypt

    [php] view plaincopy
     
    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,输出结果应该如下:

    [plain] view plaincopy
     
    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种分别是使用不同的数据块和密钥长度进行加密。

    以下是使用扩展mcrypt实现AES加密的简单示例

    [php] view plaincopy
     
    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. }  


    使用示例:

    [php] view plaincopy
     
    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));  


    输出结果

    问题,不知道是什么原因,解密后的字符串(见上图),末尾还留下有不可见的填充字符,当明文刚好可以分组时则没有。

  • 相关阅读:
    Android 自定义ProgressDialog
    Android 设置TextView字体颜色
    Android 隐藏EditText的焦点
    Android TextView点击效果
    区间问题 codeforces 422c+hiho区间求差问
    hdu 5651 重复全排列+逆元
    hdu 1576
    C Looooops
    扩展欧几里得模板
    hdu 6025(女生赛)
  • 原文地址:https://www.cnblogs.com/kenshinobiy/p/4424449.html
Copyright © 2011-2022 走看看