為了保證網(wǎng)絡(luò)傳輸數(shù)據(jù)的安全性,涉及敏感數(shù)據(jù)的傳輸,最好對(duì)數(shù)據(jù)預(yù)先加密,然后再在網(wǎng)絡(luò)上進(jìn)行傳輸,同時(shí),還要保證數(shù)據(jù)在另一端是可解密的,并且還必須要通過(guò)鑰匙(公鑰或私鑰)才能解密,沒(méi)有鑰匙(公鑰或私鑰)的人即使是拿到了加密過(guò)的數(shù)據(jù)也無(wú)法解密。
本篇文章主要給大家介紹對(duì)稱加密中的AES加密算法;非對(duì)稱加密中的RSA加密算法。【相關(guān)視頻教程推薦:PHP教程】
一、對(duì)稱加密
采用單鑰密碼系統(tǒng)的加密方法,同一個(gè)密鑰可以同時(shí)用作信息的加密和解密,這種加密方法稱為對(duì)稱加密,也稱為單密鑰加密。在對(duì)稱加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等。
AES加密算法
密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來(lái)替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。2006年,高級(jí)加密標(biāo)準(zhǔn)已然成為對(duì)稱密鑰加密中最流行的算法之一。
PHP的OpenSSL擴(kuò)展已經(jīng)實(shí)現(xiàn)了AES加密算法,我們可以通過(guò)OpenSSL擴(kuò)展提供的方法實(shí)現(xiàn)對(duì)數(shù)據(jù)的加密和解密,PHP在7.2版本已經(jīng)完全移除了MCrypt加密,PHP手冊(cè)在7.1遷移頁(yè)面給出了替代方案,就是用OpenSSL取代MCrypt.
PHP AES實(shí)現(xiàn)(加密、解密)
PHP實(shí)現(xiàn)代碼:
html' target='_blank'>class AES //設(shè)置AES秘鑰 private static $aes_key = bUYJ3nTV6VBasdJF //此處填寫前后端共同約定的秘鑰 * 加密 * @param string $str 要加密的數(shù)據(jù) * @return bool|string 加密后的數(shù)據(jù) static public function encrypt($str) { $data = openssl_encrypt($str, AES-128-ECB , self::$aes_key, OPENSSL_RAW_DATA); $data = base64_encode($data); return $data; * 解密 * @param string $str 要解密的數(shù)據(jù) * @return string 解密后的數(shù)據(jù) static public function decrypt($str) { $decrypted = openssl_decrypt(base64_decode($str), AES-128-ECB , self::$aes_key, OPENSSL_RAW_DATA); return $decrypted;}
二、非對(duì)稱加密
對(duì)稱加密算法在加密和解密時(shí)使用的是同一個(gè)秘鑰;而非對(duì)稱加密算法需要兩個(gè)密鑰來(lái)進(jìn)行加密和解密,這兩個(gè)秘鑰是公開密鑰(public key,簡(jiǎn)稱公鑰)和私有密鑰(private key,簡(jiǎn)稱私鑰)。在非對(duì)稱加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)等。
RSA加密算法
RSA是目前最有影響力的公鑰加密算法,該算法基于一個(gè)十分簡(jiǎn)單的數(shù)論事實(shí):將兩個(gè)大素?cái)?shù)相乘十分容易,但那時(shí)想要對(duì)其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰,即公鑰,而兩個(gè)大素?cái)?shù)組合成私鑰。公鑰是可發(fā)布的供任何人使用,私鑰則為自己所有,供解密之用。
解密者擁有私鑰,并且將由私鑰計(jì)算生成的公鑰發(fā)布給加密者。加密都使用公鑰進(jìn)行加密,并將密文發(fā)送到解密者,解密者用私鑰解密將密文解碼為明文。
以甲要把信息發(fā)給乙為例,首先確定角色:甲為加密者,乙為解密者。首先由乙隨機(jī)確定一個(gè)KEY,稱之為密匙,將這個(gè)KEY始終保存在機(jī)器B中而不發(fā)出來(lái);然后,由這個(gè) KEY計(jì)算出另一個(gè)KEY,稱之為公匙。這個(gè)公鑰的特性是幾乎不可能通過(guò)它自身計(jì)算出生成它的私鑰。接下來(lái)通過(guò)網(wǎng)絡(luò)把這個(gè)公鑰傳給甲,甲收到公鑰后,利用公鑰對(duì)信息加密,并把密文通過(guò)網(wǎng)絡(luò)發(fā)送到乙,最后乙利用已知的私鑰,就對(duì)密文進(jìn)行解碼了。以上就是RSA算法的工作流程。
算法實(shí)現(xiàn)過(guò)程為:
隨意選擇兩個(gè)大的質(zhì)數(shù)p和q,p不等于q,計(jì)算N=pq。
根據(jù)歐拉函數(shù),不大于N且與N互質(zhì)的整數(shù)個(gè)數(shù)為(p-1)(q-1)。
選擇一個(gè)整數(shù)e與(p-1)(q-1)互質(zhì),并且e小于(p-1)(q-1)。
用以下這個(gè)公式計(jì)算d:d× e ≡ 1 (mod (p-1)(q-1))。
將p和q的記錄銷毀。
以上內(nèi)容中,(N,e)是公鑰,(N,d)是私鑰。
生成私鑰和公鑰
生成私鑰文件:
openssl genrsa -out rsa_private_key.pem 1024
利用私鑰,生成公鑰:
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
通過(guò)生成的公鑰和私鑰就可以對(duì)數(shù)據(jù)進(jìn)行加解密:
PHP RSA 實(shí)現(xiàn)(加密、解密)
PHP實(shí)現(xiàn)代碼(公鑰加密私鑰解密):
class RSA * @param string $str 要加密的數(shù)據(jù) * @param string $public_key 公鑰 * @return string static public function encrypt($str, $public_key) { $encrypted =  $pu_key = openssl_pkey_get_public($public_key); openssl_public_encrypt($str, $encrypted, $pu_key);//公鑰加密 $encrypted = base64_encode($encrypted); return $encrypted; * 解密 * @param string $str 要解密的數(shù)據(jù) * @param string $private_key 私鑰 * @return string static public function decrypt($str, $private_key) { $decrypted =  $pi_key = openssl_pkey_get_private($private_key); openssl_private_decrypt(base64_decode($str), $decrypted, $pi_key);//私鑰解密 return $decrypted;}PHP實(shí)現(xiàn)代碼(私鑰加密公鑰解密):
class RSA //私鑰加密  static public function encrypt($str, private_key) { $encrypted =  $pi_key = openssl_pkey_get_private($private_key); openssl_private_encrypt($data, $encrypted, $pi_key); //私鑰加密 $encrypted = base64_encode($encrypted); return $encrypted; //公鑰解密 static public function decrypt($str, $public_key) { $decrypted =  $pu_key = openssl_pkey_get_public($public_key); openssl_public_decrypt(base64_decode($str), $decrypted, $pu_key);//公鑰解密 return $decrypted;}總結(jié):以上就是本篇文章的全部?jī)?nèi)容,希望能對(duì)大家的學(xué)習(xí)有所幫助。
以上就是PHP如何加密解密?PHP加密解密的方法的詳細(xì)內(nèi)容,PHP教程
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選