1. 程式人生 > >php使用openssl來實現RSA(非對稱加密)

php使用openssl來實現RSA(非對稱加密)

使用非對稱加密主要是藉助openssl的公鑰和私鑰,用公鑰加密私鑰解密,或者私鑰加密公鑰解密。

1.安裝openssl和PHP的openssl擴充套件

2.生成私鑰:openssl genrsa 用於生成rsa私鑰檔案,生成是可以指定私鑰長度和密碼保護

  1. openssl genrsa -out rsa_private_key.pem 1024  

3.生成公鑰:rsa命令用於處理RSA金鑰、格式轉換和列印資訊
  1. openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem  

4.這裡我們使用私鑰加密,公鑰解密
  1. <?php    
  2. /**  
  3. * 金鑰檔案的路徑  
  4. */
  5. $privateKeyFilePath = 'rsa_private_key.pem';    
  6. /**  
  7. * 公鑰檔案的路徑  
  8. */
  9. $publicKeyFilePath = 'rsa_public_key.pem';    
  10. extension_loaded('openssl'ordie('php需要openssl擴充套件支援');    
  11. (file_exists($privateKeyFilePath) && file_exists($publicKeyFilePath)) ordie('金鑰或者公鑰的檔案路徑不正確');    
  12. /**  
  13. * 生成Resource型別的金鑰,如果金鑰檔案內容被破壞,openssl_pkey_get_private函式返回false 
     
  14. */
  15. $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));    
  16. /**  
  17. * 生成Resource型別的公鑰,如果公鑰檔案內容被破壞,openssl_pkey_get_public函式返回false  
  18. */
  19. $publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));    
  20. ($privateKey && $publicKeyordie('金鑰或者公鑰不可用');    
  21. /**  
  22. * 原資料 
     
  23. */
  24. $originalData = '加密前hahahaha';    
  25. /**  
  26. * 加密以後的資料,用於在網路上傳輸  
  27. */
  28. $encryptData = '';    
  29. echo'原資料為:'$originalData, PHP_EOL;    
  30. ///////////////////////////////用私鑰加密////////////////////////  
  31. if (openssl_private_encrypt($originalData$encryptData$privateKey)) {    
  32.     /**  
  33.      * 加密後 可以base64_encode後方便在網址中傳輸 或者列印  否則列印為亂碼  
  34.      */
  35.     echo'加密成功,加密後資料(base64_encode後)為:'base64_encode($encryptData), PHP_EOL;    
  36. else {    
  37.     die('加密失敗');    
  38. }    
  39. ///////////////////////////////用公鑰解密////////////////////////  
  40. /**  
  41. * 解密以後的資料  
  42. */
  43. $decryptData ='';    
  44. if (openssl_public_decrypt($encryptData$decryptData$publicKey)) {    
  45.     echo'解密成功,解密後資料為:'$decryptData, PHP_EOL;    
  46. else {    
  47.     die('解密成功');    
  48. }