- 相關(guān)推薦
PHP如何使用AES加密算法進(jìn)行數(shù)據(jù)加密和解密
在利用PHP制作項(xiàng)目的時(shí)候經(jīng)常會(huì)使用AES加密算法進(jìn)行數(shù)據(jù)加密和解密,那么AES加密算法是如何進(jìn)行數(shù)據(jù)加密和解密的呢?下面小編為大家解答一下,希望能幫到您!
AES加密是一種高級(jí)加密標(biāo)準(zhǔn),AES加密采用對(duì)稱分組密碼體制,AES加密數(shù)據(jù)塊分組長(zhǎng)度必須為128比特,密鑰長(zhǎng)度可以是128比特、192比特、256比特中的任意一個(gè)(如果數(shù)據(jù)塊及密鑰長(zhǎng)度不足時(shí),會(huì)補(bǔ)齊)。
項(xiàng)目中用到了AES加密和解密數(shù)據(jù),主要用在網(wǎng)絡(luò)請(qǐng)求過(guò)程中對(duì)上傳的參數(shù)進(jìn)行加密,對(duì)從后臺(tái)服務(wù)器獲取的數(shù)據(jù)進(jìn)行解密。
我們可以使用AES加密算法將數(shù)據(jù)加密起來(lái),然后發(fā)送給后端,后端再將接收的數(shù)據(jù)用約定的密鑰將數(shù)據(jù)還原,即解密,Aes算法加密后的數(shù)據(jù)在傳輸過(guò)程中不易被破解。
在PHP中,我們需要先確保php的環(huán)境中安裝好了Mcrypt擴(kuò)展。PHP的mcrypt庫(kù)提供了對(duì)多種塊算法的支持,支持 CBC,OFB,CFB 和 ECB 密碼模式,mcrypt庫(kù)提供了豐富的函數(shù)使用,有興趣的同學(xué)可以查閱PHP手冊(cè)。
我已經(jīng)將aes加解密封裝成類,方便調(diào)用,在DEMO中可以看到調(diào)用效果。
<?php
class Aes
{
private $secrect_key;
public function __construct($secrect_key)
{
$this->secrect_key = $secrect_key;
}
// 加密
public function encrypt($str)
{
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
$iv = $this->createIv($cipher);
if (mcrypt_generic_init($cipher, $this->pad2Length($this->secrect_key, 16), $iv) != -1){
// PHP pads with NULL bytes if $content is not a multiple of the block size..
$cipherText = mcrypt_generic($cipher, $this->pad2Length($str, 16));
mcrypt_generic_deinit($cipher);
mcrypt_module_close($cipher);
return bin2hex($cipherText);
}
}
public function decrypt($str)
{
$padkey = $this->pad2Length($this->secrect_key, 16);
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
$iv = $this->createIv($td);
if (mcrypt_generic_init($td, $padkey, $iv) != -1){
$p_t = mdecrypt_generic($td, $this->hexToStr($str));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $this->trimEnd($p_t);
}
}
// IV自動(dòng)生成
private function createIv($td)
{
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
return $iv;
}
// 將$text補(bǔ)足$padlen倍數(shù)的長(zhǎng)度
private function pad2Length($text, $padlen)
{
$len = strlen($text)%$padlen;
$res = $text;
$span = $padlen-$len;
for ($i=0; $i<$span; $i++) {
$res .= chr($span);
}
return $res;
}
// 將解密后多余的長(zhǎng)度去掉(因?yàn)樵诩用艿臅r(shí)候 補(bǔ)充長(zhǎng)度滿足block_size的長(zhǎng)度)
private 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進(jìn)制的轉(zhuǎn)為2進(jìn)制字符串
private function hexToStr($hex){
$bin="";
for($i=0; $i<strlen($hex)-1; $i+=2) {
$bin.=chr(hexdec($hex[$i].$hex[$i+1]));
}
return $bin;
}
}
調(diào)用Aes類進(jìn)行加密和解密方法如下:
<?php
$key = 'MYgGnQE2jDFADSFFDSEWsdD2'; //密鑰
$str = 'abc'; //要加密的字符串
$aes = new Aes($key);
//加密
echo $aes->encrypt($str);
//解密
echo $aes->decrypt($str);
【PHP如何使用AES加密算法進(jìn)行數(shù)據(jù)加密和解密】相關(guān)文章:
PHP加密和解密函數(shù)10-08
PHP如何使用curl實(shí)現(xiàn)數(shù)據(jù)抓取09-27
java加密算法是什么09-14
PHP使用中數(shù)據(jù)庫(kù)使用方法05-21
教你如何使用php的session07-13
PHP如何使用DOM和simplexml讀取xml文檔07-22
PHP如何使用curl發(fā)送GET和POST請(qǐng)求09-10
PHP基于CURL進(jìn)行POST數(shù)據(jù)上傳實(shí)例10-22