PHP中的AES算法

AES算法加密模式和填充方式有如下一些(可能不完整)
算法/模式/填充 16字节加密后数据长度 不满16字节加密后长度 AES/CBC/NoPadding 16 不支持 AES/CBC/PKCS5Padding 32 16 AES/CBC/ISO10126Padding 32 16 AES/CFB/NoPadding 16 原始数据长度 AES/CFB/PKCS5Padding 32 16 AES/CFB/ISO10126Padding 32 16 AES/ECB/NoPadding 16 不支持 AES/ECB/PKCS5Padding 32 16 AES/ECB/ISO10126Padding 32 16 AES/OFB/NoPadding 16 原始数据长度 AES/OFB/PKCS5Padding 32 16 AES/OFB/ISO10126Padding 32 16 AES/PCBC/NoPadding 16 不支持 AES/PCBC/PKCS5Padding 32 16 AES/PCBC/ISO10126Padding 32 16

利用PHP加密库 mcrypt 进行AES/CBC/NoPadding模式加密解密
$cipher = MCRYPT_RIJNDAEL_128;
$mode = MCRYPT_MODE_CBC;
$privateKey = "abcfdef123456";
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$mode),MCRYPT_RAND);
$data = "Hello world!";
//加密
$encrypted = mcrypt_encrypt($cipher, $privateKey, $data, $mode, $iv);
$based_encrypted = base64_encode($encrypted);
echo $based_encrypted;

//解密
$encryptedData = base64_decode($based_encrypted);
//解密后右端会有空白字符 需要手动清除 猜测是mcrypt的一个BUG
$decrypted = rtrim(mcrypt_decrypt($cipher, $privateKey, $encryptedData, $mode, $iv),"\0");
echo ($decrypted);
?>
为了方便与其他语言进行数据交换,也可以手动指定 $iv 为一个固定的可见字符串,但是长度要与 mcrypt_create_iv 生成的一致,否则会报一个
The IV parameter must be as long as the blocksize in 的警告。这里的长度是16,所以固定的字符串常量也要是16个字符。

PS : 可以用下面的代码来检测系统是否安装了 mcrypt 模块,并查看支持哪些加密算法和模式
$cipher_list = mcrypt_list_algorithms();//mcrypt支持的加密算法列表
$mode_list = mcrypt_list_modes(); //mcrypt支持的加密模式列表

print_r($cipher_list);
print_r($mode_list);
?>
得到输出结果:
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算法。当然,你如果想研究AES算法,也可以自己用PHP实现该算法,否则没有必要,使用健壮的库函数是最快捷最方便最稳固的方法。

你可能感兴趣的:(PHP中的AES算法)