1. 程式人生 > >PHP RSA加解密詳解(附代碼)

PHP RSA加解密詳解(附代碼)

獲取 null 網上銀行 get 傳輸 賬戶 linu 數字簽名 mir

前言: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加解密詳解(附代碼)