編碼的世界 / 優質文選 / 文明

PHP RSA公約私鑰加密解密示例


2022年7月03日
-   

1.生成密鑰和公鑰開始前需要准備openssl環境
 
linux 需要安裝openssl工具包,傳送門http://www.openssl.org/source/
window 下需要安裝openssl的程序,傳送門http://slproweb.com/products/Win32OpenSSL.html
密鑰生成openssl genrsa 用於生成rsa私鑰文件,生成是可以指定私鑰長度,具體參數請參考文檔。
openssl genrsa -out rsa_private_key.pem 1024
-out 指定生成的密鑰的文件名,生成的密鑰文件為 rsa_private_key.pem ,密鑰長度越長越安全,但加解密所耗時間亦變長。
 
 
公鑰生成Rsa命令用於處理Rsa密鑰、格式轉換和打印信息
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
-in filename:輸入的RSA密鑰文件,在此為上面生成的密鑰 rsa_private_key.pem。
-pubout:設置此選項後,保存公鑰值到輸出文件中。
-out filename:輸出文件,在此我們定義成rsa_public_key.pem
 
PHP用RSA加解密 
開始之前需要准備將php.ini配置文件的;extension=php_openssl.dll 改為 extension=php_openssl.dll
<?php
$privateKeyFilePath = 'rsa_private_key.pem';
$publicKeyFilePath = 'rsa_public_key.pem';
extension_loaded('openssl') or die('php需要openssl擴展支持');
(file_exists($privateKeyFilePath) && file_exists($publicKeyFilePath)) or die('文件路徑不正確');
$privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));
$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));
($privateKey && $publicKey) or die('密鑰或者公鑰不可用');
// 加密數據
$originalData = '我的帳號是:toutiao,密碼是:123456';
// 加密以後的數據
$encryptData = '';
echo '原數據為:', $originalData, PHP_EOL;
 
///用私鑰加密
 
if (openssl_private_encrypt($originalData, $encryptData, $privateKey)) {
      // 加密後 可以base64_encode後方便在網址中傳輸
      echo '加密成功,加密後數據(base64_encode後)為:', base64_encode($encryptData), PHP_EOL;
} else {
      exit('加密失敗');
}
///用公鑰解密
//解密以後的數據
$decryptData ='';
if (openssl_public_decrypt($encryptData, $decryptData, $publicKey)) {
      echo '解密成功,解密後數據為:', $decryptData, PHP_EOL;
} else {
      exit('解密成功');  
}

熱門文章