PHP RSA加解密詳解(附代碼)
前言:RSA加密一般用在涉及到重要數據時所使用的加密算法,比如用戶的賬戶密碼傳輸,訂單的相關數據傳輸等。
加密方式說明:公鑰加密,私鑰解密。也可以 私鑰加密,公鑰解密
一、RSA簡介
RSA公鑰加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美國麻省理工學院)開發的。RSA取名來自開發他們三者的名字。
RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰數據加密標準。
目前該加密方式廣泛用於網上銀行、數字簽名等場合。
RSA算法基於一個十分簡單的數論事實:將兩個大素數相乘十分容易,但那時想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
二、算法核心
RSA的算法涉及三個參數,n、e1、e2。
其中,n是兩個大質數p、q的積,n的二進制表示時所占用的位數,就是所謂的密鑰長度。
e1和e2是一對相關的值,e1可以任意取,但要求e1與(p-1)(q-1)互質;再選擇e2,要求(e2*e1)mod((p-1)(q-1))=1。
(n,e1),(n,e2)就是密鑰對。其中(n,e1)為公鑰,(n,e2)為私鑰。[1]
RSA加解密的算法完全相同,設A為明文,B為密文,則:A=B^e2 mod n;B=A^e1 mod n;(公鑰加密體制中,一般用公鑰加密,私鑰解密)
e1和e2可以互換使用,即:
A=B^e1 mod n;B=A^e2 mod n;
三、RSA加密解密的用法。
下面展示私鑰加密解密核心代碼,公鑰同理(公鑰需要換成公鑰的openssl函數)
1、加密
$original = file_get_content($path) // 獲取私鑰文件中的數據 $privateKey = openssl_pkey_get_private($original);//這個函數可用來判斷私鑰是否是可用的,可用,返回資源,私鑰可用file_get_content從文件中獲取 // $data為需要加密的數據(字符串數組都可以,數組用json_encode轉化下),$encrypted接收加密後數據,$privateKey為私鑰密鑰,base64_encode是為了方便網絡傳輸openssl_private_encrypt($data,$encrypted,$privateKey)? base64_encode($encrypted) : null;
2、解密
// $encrypted為需要解密的數據(如果加密的時候用了base64,這裏則需要解碼),$decrypted為解密後的數據,$privateKey同上,為私鑰密鑰 openssl_private_decrypt(base64_decode($encrypted), $decrypted,$privateKey))
3、公鑰加解密對應函數
openssl_pkey_get_public($public_key) // 功能同上,獲取私鑰數據的 openssl_public_encrypt($data,$encrypted,$pu_key) // 公鑰加密,參數同上 openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key) // 公鑰解密,參數功能同上
四、公私鑰生成方式
Linux系統都自帶了openssl,windows可能需要安裝openssl生成工具
// 第一步:生成私鑰,這裏我們指定私鑰的長度為1024, 長度越長,加解密消耗的時間越長 openssl genrsa -out rsa_private_key.pem 1024 // 第二步:根據私鑰生成對應的公鑰 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pub // 第三步:私鑰轉化成pkcs8格式,【這一步非必須,只是程序解析起來方便】 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem
PHP RSA加解密詳解(附代碼)