php aes加密原理,PHP程序的AES加密解密算法

c0a94301aaff25f220478eea6f709586.png

PHP程序的AES加密解密算法

2021-02-281

//--------第一种AES-CBC加密方案--------

//仅为理解之用

$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); #128位 = 16字节 iv必须16字节

$key128 = '1234567890123456';

$iv = '1234567890123456';

$cleartext = 'hello'; #待加密的字符串

if (mcrypt_generic_init($cipher, $key128, $iv) != -1)

{

// PHP pads with NULL bytes if $cleartext is not a multiple of the block size..

//如果$cleartext不是128位也就是16字节的倍数,补充NULL字符满足这个条件,返回的结果的长度一样

$cipherText = mcrypt_generic($cipher,$cleartext );

mcrypt_generic_deinit($cipher);

// Display the result in hex.

//很明显,结果也是16字节的倍数.1个字节用两位16进制表示,所以下面输出的是32的倍数位16进制的字符串

echo '第一种AES加密方案:
';

printf("128-bit encrypted result:\n%s\n\n",bin2hex($cipherText));

echo '
';echo '
';

}

//--------第一种AES加密方案--------

?>

转载来源:http://www.chilkatsoft.com/p/php_aes.asp

http://www.cnblogs.com/adylee/archive/2007/09/14/893438.html

转载来源:http://blog.csdn.net/shushengsky/archive/2009/12/13/4961861.aspx

//--------第二种AES-ECB加密方案--------

//加密

echo '第二种AES加密方案:
';

$key = '1234567890123456';

$content = 'hello';

$padkey = pad2Length($key,16);

$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');

$iv_size = mcrypt_enc_get_iv_size($cipher);

$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); #IV自动生成?

echo '自动生成iv的长度:'.strlen($iv).'位:'.bin2hex($iv).'
';

if (mcrypt_generic_init($cipher, pad2Length($key,16), $iv) != -1)

{

// PHP pads with NULL bytes if $content is not a multiple of the block size..

$cipherText = mcrypt_generic($cipher,pad2Length($content,16) );

mcrypt_generic_deinit($cipher);

mcrypt_module_close($cipher);

// Display the result in hex.

printf("128-bit encrypted result:\n%s\n\n",bin2hex($cipherText));

print("
");

}

//解密

$mw = bin2hex($cipherText);

$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');

if (mcrypt_generic_init($td, $padkey, $iv) != -1)

{

$p_t = mdecrypt_generic($td, hexToStr($mw));

mcrypt_generic_deinit($td);

mcrypt_module_close($td);

$p_t = trimEnd($p_t);

echo '解密:';

print($p_t);

print("
");

print(bin2hex($p_t));

echo '
';

}

//将$text补足$padlen倍数的长度

function pad2Length($text, $padlen){

$len = strlen($text)%$padlen;

$res = $text;

$span = $padlen-$len;

for($i=0; $i

$res .= chr($span);

}

return $res;

}

//将解密后多余的长度去掉(因为在加密的时候 补充长度满足block_size的长度)

function trimEnd($text){

$len = strlen($text);

$c = $text[$len-1];

if(ord($c)

for($i=$len-ord($c); $i

if($text[$i] != $c){

return $text;

}

}

return substr($text, 0, $len-ord($c));

}

return $text;

}

//16进制的转为2进制字符串

function hexToStr($hex)

{

$bin="";

for($i=0; $i

{

$bin.=chr(hexdec($hex[$i].$hex[$i+1]));

}

return $bin;

}

//--------第二种AES加密方案--------

 
 

//--------第三种AES-ECB加密方案--------

echo '第三种AES加密方案:
';

$key = '1234567890123456';

$key = pad2Length($key,16);

$iv = 'asdff';

$content = 'hello';

$content = pad2Length($content,16);

$AESed = bin2hex( mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$content,MCRYPT_MODE_ECB,$iv) ); #加密

echo "128-bit encrypted result:".$AESed.'
';

$jiemi = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$key,hexToStr($AESed),MCRYPT_MODE_ECB,$iv); #解密

echo '解密:';

echo trimEnd($jiemi);

//--------第三种AES加密方案--------

?>

#KEY长度无限制,IV长度必须是block_size的倍数

#如果是MCRYPT_MODE_ECB加密,结果与KEY有关,与IV无关

#如果是MCRYPT_MODE_CBC加密,结果与KEY有关,与IV有关

//--------第四种AES加密/解密方案 CBC模式,128-bit--------

/*

* 实现AES加密

* $str : 要加密的字符串

* $keys : 加密密钥

* $iv : 加密向量

* $cipher_alg : 加密方式

*/

function ecryptdString($str,$keys="6461772803150152",$iv="8105547186756005",$cipher_alg=MCRYPT_RIJNDAEL_128){

$encrypted_string= bin2hex(mcrypt_encrypt($cipher_alg,$keys, $str, MCRYPT_MODE_CBC,$iv));

return$encrypted_string;

}

/*

* 实现AES解密

* $str : 要解密的字符串

* $keys : 加密密钥

* $iv : 加密向量

* $cipher_alg : 加密方式

*/

functiondecryptStrin($str,$keys="6461772803150152",$iv="8105547186756005",$cipher_alg=MCRYPT_RIJNDAEL_128){

$decrypted_string= mcrypt_decrypt($cipher_alg,$keys, pack("H*",$str),MCRYPT_MODE_CBC,$iv);

return$decrypted_string;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值