最近在著手寫一個服務端安全介面規範,需要用到RSA加密解密。所以小試牛刀一下,並且做個記錄。
環境: Win7 64位
PHP 5.6.12
需要原型工具:
OpenSSL下載地址:http://slproweb.com/products/Win32OpenSSL.html
一、安裝OpenSSL
隨意安裝到哪裡
二、進入到OpenSLL的bin目錄下進行私密金鑰和公開金鑰的產生
//產生私密金鑰openssl genrsa -out rsa_private_key.pem 1024 //產生公開金鑰openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
將生產的私密金鑰、公開金鑰拷貝到你的PHP項目中
三、開啟PHP的OpenSSL擴充
將php.ini中的extension=php_openssl.dll開啟(去掉;)
四、PHP加密解密練習
* @time 2015-10-13 */namespace App\Models;class RsaCrypt { const PRIVATE_KEY_FILE_PATH = 'app\Certificate\rsa_private_key.pem'; const PUBLIC_KEY_FILE_PATH = 'app\Certificate\rsa_public_key.pem'; /** * Rsa加密 * @param string $orignData * @return string */ public static function encode($orignData) { //密鑰檔案的路徑 $privateKeyFilePath = self::PRIVATE_KEY_FILE_PATH; extension_loaded('openssl') or die('php需要openssl擴充支援'); (file_exists($privateKeyFilePath)) or die('密鑰的檔案路徑不正確'); //產生Resource類型的密鑰,如果密鑰檔案內容被破壞,openssl_pkey_get_private函數返回false $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath)); ($privateKey) or die('密鑰不可用'); //加密以後的資料,用於在網路上傳輸 $encryptData = ''; ///////////////////////////////用私密金鑰加密//////////////////////// if (openssl_private_encrypt($orignData, $encryptData, $privateKey)) { return $encryptData; } else { die('加密失敗'); } } /** * Rsa解密 * @param string $encryptData * @return string */ public static function decode($encryptData) { //公開金鑰檔案的路徑 $publicKeyFilePath = self::PUBLIC_KEY_FILE_PATH; extension_loaded('openssl') or die('php需要openssl擴充支援'); (file_exists($publicKeyFilePath)) or die('公開金鑰的檔案路徑不正確'); //產生Resource類型的公開金鑰,如果公開金鑰檔案內容被破壞,openssl_pkey_get_public函數返回false $publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath)); ($publicKey) or die('公開金鑰不可用'); //解密以後的資料 $decryptData = ''; ///////////////////////////////用公開金鑰解密//////////////////////// if (openssl_public_decrypt($encryptData, $decryptData, $publicKey)) { return $decryptData; } else { die('解密失敗'); } }}
附錄:
一、在Win下面使用產生私密金鑰的時候遇到一個BUG:
錯誤:
WARNING: can't open config file: /usr/local/ssl/openssl.cnfLoading 'screen' into random state - doneGenerating RSA private key, 1024 bit long modulus.........++++++.........................................++++++unable to write 'random state'e is 65537 (0x10001)
解決辦法:
在CMD中進行如下操作
set OPENSSL_CONF=c:\OpenSSL-Win32\bin\openssl.cfg
或者
set OPENSSL_CONF=[path-to-OpenSSL-install-dir]\bin\openssl.cfg
PS:[path-to-OpenSSL-install-dir]為你的OpenSSL路徑
二、參考資料:
http://php.net/manual/en/book.openssl.php
http://www.jb51.net/article/64963.htm
http://stackoverflow.com/questions/16658038/cant-open-config-file-usr-local-ssl-openssl-cnf-on-windows