AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。PHP已对AES做了很好的封装。http://manual.phpv.net/zh/function.mcrypt-decrypt.php

<?php 
$data = "Plaintext"; // Data to encrypt
$key = "Secret"; // Encryption key 
$td = MCRYPT_RIJNDAEL_256; // Encryption cipher (http://php.net/manual/en/mcrypt.ciphers.php)

$iv_size = mcrypt_get_iv_size($td, MCRYPT_MODE_ECB); // Dependant on cipher/mode  (http://php.net/manual/en/mcrypt.constants.php)
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); // Creates an IV (http://php.net/manual/en/function.mcrypt-create-iv.php)

echo "Original data: $data<br />";

$encrypted_data = mcrypt_encrypt($td, $key, $data, MCRYPT_MODE_CBC, $iv); // Encrypts data (http://www.php.net/manual/en/function.mcrypt-encrypt.php)

echo "Encrypted data: " . bin2hex($encrypted_data)  . "<br />"; // bin2hex to compensate for random character values 

$data = mcrypt_decrypt($td, $key, $encrypted_data, MCRYPT_MODE_CBC, $iv); // Decrypts data (http://www.php.net/manual/en/function.mcrypt-decrypt.php)

echo trim($data);
?>

 

//PKCS #7 (还有其他填充方式,未学习)
第一步: 拿到明文的长度 len 和 blocksize (字节),这里的bloacksiz据说是跟PKCS#5的区别(PKCS#5指定blocksize为64 bit (8 byte),PKCS#7未指定)http://en.wikipedia.org/wiki/Padding_(cryptography)
第二步: 算出最后一段需要补码的长度 paddingLen = len - text % blocsize
第三步: 取得 ASCII 码 为补码长度 paddingLen的字符, 用该字符填充paddingLen字节
//之前默认是NOPADDING的,下面加上padding (PKCS #7)

<?php 

function encrypt($str, $key, $iv)
{
$block = mcrypt_get_block_size ('rijndael-128', 'cbc');
$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);

return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_CBC, $iv);
}

function decrypt($str, $key, $iv)
{
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_CBC, $iv);
echo "str: ", $str;
echo "<br><br>";

$block = mcrypt_get_block_size ('rijndael-128', 'cbc');
$pad = ord($str[($len = strlen($str)) - 1]);
echo "pad: ", $pad;
echo "<br><br>";
echo "strlen($str): ", strlen($str);
echo "<br><br>";
return substr($str, 0, strlen($str) - $pad);
}

?>

标签: php, aes, pkcs#7

评论已关闭