AES加密AES解密算法实例

 AES加密AES解密算法实例

三种PHP实现AES加密解密的方案。第一种采用CBC模式,使用固定16字节密钥和初始向量;第二种采用ECB模式,自动生成初始向量并包含完整的数据填充和截断处理;第三种简化了ECB模式的实现。所有方案均支持128位加密,包含密钥处理、数据填充、加密解密及结果转换等完整流程,并提供了16进制与二进制字符串的转换方法。特别说明ECB模式加密结果与密钥相关但与初始向量无关,而CBC模式则与两者都相关。

<?php       
//--------第一种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加密方案:<br>';       
    printf("128-bit encrypted result:\n%s\n\n",bin2hex($cipherText));       
    echo '<br>';echo '<br>';       
}       
//--------第一种AES加密方案--------       
?>      
</pre>     
转载来源:http://www.chilkatsoft.com/p/php_aes.asp     
     
http://www.cnblogs.com/adylee/archive/2007/09/14/893438.html     
     
转载来源:http://blog.youkuaiyun.com/shushengsky/archive/2009/12/13/4961861.aspx     
<pre lang="php">     
<?php       
//--------第二种AES-ECB加密方案--------       
//加密       
echo '第二种AES加密方案:<br>';       
$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).'<br>';       
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("<br />");       
          
}       
//解密       
$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("<br />");       
    print(bin2hex($p_t));       
    echo '<br><br>';       
}       
//将$text补足$padlen倍数的长度       
function pad2Length($text, $padlen){       
    $len = strlen($text)%$padlen;       
    $res = $text;       
    $span = $padlen-$len;       
    for($i=0; $i<$span; $i++){       
        $res .= chr($span);       
    }       
    return $res;       
}       
//将解密后多余的长度去掉(因为在加密的时候 补充长度满足block_size的长度)       
function trimEnd($text){       
    $len = strlen($text);       
    $c = $text[$len-1];       
    if(ord($c) <$len){       
        for($i=$len-ord($c); $i<$len; $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<strlen($hex)-1; $i+=2)        
    {       
        $bin.=chr(hexdec($hex[$i].$hex[$i+1]));        
    }       
    return $bin;        
}       
//--------第二种AES加密方案--------       
</pre>     
<pre lang="php">     
<?php       
//--------第三种AES-ECB加密方案--------       
echo '第三种AES加密方案:<br>';       
$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.'<br>';       
$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有关     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值