您的位置:首页 > 编程语言 > PHP开发

使用php扩展mcrypt实现AES加密

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

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

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

[php] view plaincopy

$cipher_list = mcrypt_list_algorithms();//mcrypt支持的加密算法列表

$mode_list = mcrypt_list_modes(); //mcrypt支持的加密模式列表

echo '<xmp>';

print_r($cipher_list);

print_r($mode_list);

若你的环境支持mcrypt,输出结果应该如下:

[plain] view plaincopy

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

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

[php] view plaincopy

/**

* 利用mcrypt做AES加密解密

* @author ts24<tsxw24@gmail.com>

*/

abstract class AES{

/**

* 算法,另外还有192和256两种长度

*/

const CIPHER = MCRYPT_RIJNDAEL_128;

/**

* 模式

*/

const MODE = MCRYPT_MODE_ECB;

/**

* 加密

* @param string $key 密钥

* @param string $str 需加密的字符串

* @return type

*/

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);

}

/**

* 解密

* @param type $key

* @param type $str

* @return type

*/

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);

}

}

使用示例:

[php] view plaincopy

$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));

输出结果



问题,不知道是什么原因,解密后的字符串(见上图),末尾还留下有不可见的填充字符,当明文刚好可以分组时则没有。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: