對稱加密算法是指,數據發信方将明文(wén)(子大原始數據)和(hé)密鑰一起經過加密處理後,使其變成複雜的加姐雪密密文(wén)發送出去。收信方收到密文(金報wén)後,若要解讀原文(wén),則需要使用加密密鑰及相同算法下靜的逆算法對密文(wén)進行解密,使其恢複成可(kě)讀明文做書(wén)。對稱加密算法的優點是算法公開、計算量小、加密速度快、加密效藍開率高,适用于加密大量數據的場合。常用的算法有DES、3DES、TDEA、Bl讀司owfish、RC2、RC4、RC5、I聽快DEA、SKIPJACK、AES等。
PHP中(zhōng)如(rú)果需要使用對稱加密算法木嗎,則需要mcrypt擴展的支持。PHP的mcr做對ypt擴展提供了強大的加密解密方法,支持19種加密算法和(hé)8種加密模雪喝式,具體可(kě)以通(tōng)過函數mcrypt_高物list_algorithms()和(hé問國)mcrypt_list_modes()來顯示。
<?php
$type_list = mcrypt_list_algo從家rithms(); //mcrypt支持的加密她空算法列表
$mode_list = mcrypt_li多如st_modes(); //mcrypt支持的加密模式列爸也表
print_r($type_list);
print_r($mode_list);
?>
使用DES方式加密的代碼如(rú)下(xià)。
<?php
$auth_key = 'safe_key'內北;
$salt = '!@#$%';
$content = 'Hello World哥空39;;
$td = mcrypt_module_open(mcryp木什t_des,'','e能雨cb',''); //使用市船mcrypt_des算法ecb模式
$iv_size = mcrypt_en道愛c_get_iv_size($td);&n行器bsp; //設置初始向量大小
$iv = mcrypt_create_iv(來北$iv_size,mcrypt_rand)吃習; //創建初始向量
$key_size = mcrypt_en短好c_get_key_size($td); //返議水回所支持的最大密鑰長度(以字節計算)
$key = substr(md5($auth_key.sa愛爸lt),0,$key_size);
mcrypt_generic_init($td, $鐘綠key, $iv); //初始化
$secret = mcrypt_gen電什eric($td, $content); 話問//加密并返回加密後的内容
echo base64_encode($secret);
mcrypt_generic_deinit($td);
mcrypt_module_close($td); //結束時校
?>
使用DES方式解密的代碼如(rú)下(xià)就南。
<?php
$auth_key = 'safe_key在就9;;
$salt = '!@#$%物來39;;
$secret = 'nzPa0jPaaNca+Yt道作y/HG4PA==';
$td = mcrypt_module_open(mcrypt_des,日快'','ecb','輛友9;); //使用mcrypt_des算法ecb模式
$iv_size = mcrypt_enc_get_iv_si門黃ze($td); //設置初始向量大小
$iv = mcrypt_create_iv($iv數花_size,mcrypt_rand); //創建初始向量
$key_size = mcrypt_enc湖司_get_key_size($td); /木自/返回所支持的最大密鑰長度(以字節計算)
$key = substr(md5($auth_key.salt能得),0,$key_size);
mcrypt_generic_init($td, $key, $iv);業購 //初始化
$content = mdecrypt_generic($td, b的門ase64_decode($secret)); //解密并返回内容草草
echo $content;
mcrypt_generic_deinit($td);
mcrypt_module_close($td); 妹服//結束
?>
AES是Advanced Encryption Standard(高海水級加密标準)的縮寫,在密碼學中(zhōn睡能g)又稱Rijndael加密法,是美國聯邦政府采用的一種區請習塊加密标準。這個(gè)标準用來替代原先的DES,已經被多方民票分析且廣為全世界所使用。經過五年的甄選流程,高級加密标準由美國國家标準服一與技術(shù)研究院(National Institute of S東通tandards and Technology,NIST)于哥筆2001年11月(yuè)26日發布于FIPS PUB 197,并在2002年朋個5月(yuè)26日成為有效的标準。至2006年,高級還風加密标準已經成為對稱密鑰加密中(zhōng)最流行的算法之一站技。
AES目前有五種加密模式。
(1)電碼本(Electronic Codebook,ECB)模式。
(2)密碼分組鍊接(Cipher Block Ch地花aining,CBC)模式。
(3)計數(Counter,CTR)模式。
(4)密碼反饋(Cipher FeedBack,CFB)模式見討。
(5)輸出反饋(Output FeedBack,OFB)模視作式。
在PHP的mcrypt擴展中(zhōng),r煙女ijndael-128、rijndael-192、rijndael-256公我就是AES加密,三種分别使用不同的數據塊和(hé)務個密鑰長度進行加密。
在AES的ECB模式中(zhōng),一般是16字節媽金為一塊,然後對這一整塊進行加密,如(rú)果輸入的字符串不夠1件船6字節,就需要補位。
使用AES-ECB方式進行加密數據的代碼如(rú)下(xià機費)。
<?php
$auth_key = 'safe_key';
$salt = '!@#$%';
$content = 'Hello Wo謝購rld';
$td= mcrypt_module_open(mcryp讀拿t_rijndael_128,'&購都#39;,mcrypt_mode_ecb,''金月);
$iv_size = mcrypt_enc_get_iv_size($td)老朋;
$iv = mcrypt_create_iv($iv_siz也人e,mcrypt_rand);
$key_size = mcrypt_e車坐nc_get_key_size($td);
$key = substr(md5($auth_key.salt),0唱件,$key_size);
mcrypt_generic_init($間舞td, $key, $iv);
$block=mcrypt_get_block_size(mcry老內pt_rijndael_128,mcrypt_mode喝車_ecb);
$pad=$block-(strlen($con購服tent) % $block);
$content.=str_repeat都訊(chr($pad),$pad); // 補齊不足16字符的位數員時内容
$secret = mcrypt_generic($td, $content)公作;
echo bin2hex($secret);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
?>
使用AES-ECB方式進行解密數據如(rú路器)下(xià)。
<?php
$auth_key = 'safe_key';
$salt = '!@#$%';
$secret = 'd62d9門司e7e8ad4b0f044e4bd971f6站作95a58';
$td= mcrypt_module_open(mcrypt_rijndae相我l_128,'',mcrypt_北吧mode_ecb,'');
$iv_size = mcrypt_enc_get_iv_siz司理e($td);
$iv = mcrypt_create_iv($iv_火你size,mcrypt_rand);
$key_size = mcrypt_enc_get_ke器近y_size($td);
$key = substr(md5($auth_key.salt低火),0,$key_size);
mcrypt_generic_init($td子紙, $key, $iv);
$content=mdecrypt_generic($td,hex2b靜說in($secret));
$len=strlen($content);
$ch=ord($content[$len-1]);
echo substr($content,0,$len-弟風$ch);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
?>
AES的CBC加密模式,需要添加初始化向量(IV),默認是16女務個(gè)0。由于是分組加密,因此下(xià)一組的IV就用前一組的加密的河熱密文(wén)來充當。CFB、OFB模式類似,隻車子不過更複雜,從而破解難度更大。
使用AES-CBC方式進行加密解密數據的代碼如(rú)下(xià)。
<?php
$auth_key = 'safe_key';少黃
$salt = '!@#$%';器紙
$content = 'Hello Wo窗身rld';
$td= mcrypt_module_open(mcrypt_rijndael愛藍_128,'',mcrypt_mode_cb間鐵c,'');
$iv_size = mcrypt_enc_ge媽民t_iv_size($td);
$iv = mcrypt_create_iv($iv_size,資去mcrypt_rand);
$key_size = mcrypt_enc_get_key_size($t年快d);
$key = substr(md5($auth_key.salt)公來,0,$key_size);
mcrypt_generic_init($td, $key紅他, $iv);
$secret = mcrypt_generic($td, $co生刀ntent); // 加密數據
echo bin2hex($secret);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$td= mcrypt_module_open(mcryp務玩t_rijndael_128,'和城9;,mcrypt_mode_cbc,'服那39;);
mcrypt_generic_init($td, $key, $i唱市v);
echo mdecrypt_generic($td,$secret);妹冷 // 解密數據
mcrypt_generic_deinit(畫場$td);
mcrypt_module_close($td);
?>