rsa (詳見維基百科)演算法是現今使用最廣泛的公鑰密碼演算法,也是號稱地球上最安全的加密演算法,與md5
和sha1
不同,到目前為止,也只有極短的rsa加密被破解。
那麼什麼是公匙密碼演算法呢,根據金鑰的使用方法,可以將密碼分為對稱密碼和公鑰密碼,接下來我們來簡單說明下它們兩個。
對稱密碼:加密和解密使用同一種金鑰的方式,常用的演算法有des
以及aes
。
公鑰密碼:加密和解密使用不同的密碼的方式,因此公鑰密碼通常也稱為非對稱密碼,常用的演算法有rsa
。
由於本文討論的是php
的rsa
加密例項,這裡就不詳細說明了,對於rsa
演算法有興趣的朋友可以檢視下面的文章
《帶你徹底理解rsa演算法原理》
對於php
更多加密方式有興趣的朋友可以檢視下面的文章
《php資料加密技術與金鑰安全管理》
apt-get install openssl
當openssl
安裝完畢後,我們就可以開始生成私鑰、公鑰了。首先,生成原始rsa
私鑰檔案
openssl genrsa -out rsa_private_key.pem 1024
注:這裡生成了乙個長度為 1024bit 的金鑰,轉化為位元組就是 128byte其次,將原始
rsa
私鑰轉換為pkcs8
格式
openssl pkcs8 -topk8 -inform pem -in rsa_private_key.pem -outform pem -nocrypt -out private_key.pem
最後,生成rsa
公鑰
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
在需要使用的時候,我們將私鑰rsa_private_key.pem
放在伺服器端,公鑰發放給需要與我們進行加密通訊的一方就可以了。
現在我們可以使用php
進行rsa
的加密解密了,但在此之前,你首先要看看你有沒有安裝或開啟php
的openssl
擴充套件,可以通過檔案輸出phpinfo()
或者通過命令列輸出php -m | less
來檢視是否安裝開啟了此擴充套件,也可以通過extension_loaded()
函式來判斷擴充套件是否開啟,如果沒有,則通過該命令進行安裝(以ubuntu
為例):
apt-get install php7.0-openssl
好了,現在我們來編寫乙個 php-rsa 的伺服器類庫,這個類庫的工作其實很簡單,就是封裝一些php
針對rsa
操作的函式,方便我們加密解密。
class rsa
/*** @uses 獲取檔案內容
* @param $file_path string
* @return bool|string
*/private function _getcontents($file_path)
/**
* @uses 獲取私鑰
* @return bool|resource
*/ private function _getprivatekey()
/**
* @uses 獲取公鑰
* @return bool|resource
*/
private function _getpublickey()
/**
* @uses 私鑰加密
* @param string $data
* @return null|string
*/
public function privencrypt($data = '')
return openssl_private_encrypt($data, $encrypted, $this->_getprivatekey()) ? base64_encode($encrypted) : null;
}/**
* @uses 公鑰加密
* @param string $data
* @return null|string
*/
public function publicencrypt($data = '')
return openssl_public_encrypt($data, $encrypted, $this->_getpublickey()) ? base64_encode($encrypted) : null;
}/**
* @uses 私鑰解密
* @param string $encrypted
* @return null
*/
public function privdecrypt($encrypted = '')
return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, $this->_getprivatekey())) ? $decrypted : null;
}
/**
* @uses 公鑰解密
* @param string $encrypted
* @return null
*/
public function publicdecrypt($encrypted = '')
return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, $this->_getpublickey())) ? $decrypted : null;}}
好了,現在我們呼叫rsa
類,對資料進行加密解密
$private_key = 'private_key.pem'; // 私鑰路徑
$public_key = 'rsa_public_key.pem'; // 公鑰路徑
$rsa = new rsa($private_key, $public_key);
$origin_data = '這是一條測試資料';
$ecryption_data = $rsa->privencrypt($origin_data);
$decryption_data = $rsa->publicdecrypt($ecryption_data);
echo '私鑰加密後的資料為:' . $ecryption_data;
echo php_eol;
echo '公鑰解密後的資料為: ' . $decryption_data;
echo php_eol;
最後我們看到輸出:
最後要說明的是,公鑰、私鑰都可以加密,也都可以解密。其中:用公鑰加密需要私鑰解密,稱為「加密」。由於私鑰是不公開的,確保了內容的保密,沒有私鑰無法獲得內容;用私鑰加密需要公鑰解密,稱為「簽名」。由於公鑰是公開的,任何人都可以解密內容,但只能用發布者的公鑰解密,驗證了內容是該發布者發出的。
php rsa 加密,解密,簽名,驗籤詳解
php rsa 加密,解密,簽名,驗籤 由於對接第三方機構使用的是j a版本的rsa加解密方法,所有剛開始在網上搜到很多php版本的rsa加解密,但是對接j a大多都不適用。以下php版本是適用於對接j a介面,j a適用金鑰再php語言使用是需要新增 begin certificate end c...
PHP RSA加解密工具,超長加密問題處理 二
解決超長加密問題思路 分割分段加密 rsa加解密超長處理 namespace leyangjun lib class cryptrsa 超長加密 由於秘鑰有長度限制比如1024,2048約長表示接受的加密資料越多,否則會有超長加密不成功的問題 117表示長度,加密的時候可以從這開始分割加密 解密的時...
php rsa非對稱加密
class rsa 獲取公鑰 return bool resource private static function getpublickey 私鑰加密 param string data return null string public static function privencrypt ...