PHP對稱加密

分類:└ 技術(shù)前沿,來源:江門姐對深圳市巨鳥網絡科技有限公司有限公司

 對稱加密算法是指,數據發信方将明文(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);

?>