RSA 加密及php實現

RSA加密簡介:php

RSA加密算法是最經常使用的非對稱加密算法,CFCA在證書服務中離不了它。可是有很多新手對它不太瞭解。下面僅做簡要介紹。RSA是第一個比較完善的公開密鑰算法,它既能用於加密,也能用於數字簽名。RSA以它的三個發明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,這個算法經受住了多年深刻的密碼分析,雖然密碼分析者既不能證實也不可否定RSA的安全性,但這偏偏說明該算法有必定的可信性,目前它已經成爲最流行的公開密鑰算法。RSA的安全基於大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進制數或更大)的函數。從一個公鑰和密文恢復出明文的難度,等價於分解兩個大素數之積(這是公認的數學難題)。java

特色:
公鑰、私鑰均可以加密,也均可以解密。算法

  1. 加密,其中:用公鑰加密須要私鑰解密,稱爲「加密」。因爲私鑰是不公開的,確保了內容的保密,沒有私鑰沒法得到內容;安全

  2. 簽名, 用私鑰加密須要公鑰解密,稱爲「簽名」。因爲公鑰是公開的,任何人均可以解密內容,但只能用發佈者的公鑰解密,驗證了內容是該發佈者發出的。ide

  3. 公鑰密碼:加密和解密使用不一樣的密碼的方式,所以公鑰密碼一般也稱爲非對稱密碼。

場景:函數

進行支付、真實信息驗證等安全性需求較高的通訊工具

與其餘第三方或合做夥伴進行重要的數據傳輸加密

問題:
RSA公鑰和私鑰是否能夠任意公開一個保密一個,不能夠,RSA公鑰和私鑰的位置是不對等的。經過RSA私鑰很容易導出RSA公鑰,可是經過RSA公鑰沒法導出RSA私鑰。由於私鑰保存了n,d以外還有q p信息因此能計算出公鑰,可是公鑰只有n,e信息。code

因此不要輕易告訴別人私鑰,可是能夠告訴別人公鑰。當你告訴別人公鑰,讓人家用公鑰加密,你用私鑰解密,這個過程叫「加密」 知道你的暗號的那我的,能夠偷偷傳一句話給你,旁聽者聽不懂,只有你聽得懂。 當你用私鑰加密一個數據,讓別人用公鑰解密,這個過程也就是簽名(你手寫的字纔有效)。拿着公鑰的那我的,能夠驗證這是你傳來的信息。orm

問題2:
能夠公鑰私鑰是一對多麼
答案:1對1

私鑰:握在本身手裏,不給別人的。
公鑰:能夠交給別人的。

交互過程例子來解釋公鑰私鑰

張三是個有私鑰和公鑰的人,李四沒有,王五沒有。

場景1:
張三將他的公開密鑰傳送給李四。
李四用張三的公開密鑰加密他的消息「咱們明天去酒吧喝酒」,而後傳送給李四(一段加密串¥……Q&#Q&^%&^!%&%*]])。
張三用他的私人密鑰解密李四的消息。看明白了,不是亂語,是「咱們明天去酒吧喝酒」。

上面的過程叫加密(李四將信息加密傳給張三)

場景2:

張三如今用私鑰加密一句話 「明晚8:00準時到」 傳給李四
李四收到了,用公鑰解密

這個過程叫簽名(張三簽名是本身發出的,不是被人冒充的)

場景3:
張三明天給王五這個公鑰,那麼王五也能夠傳一個信息給張三

王五說「明天晚上來家裏打麻將」
張三用私鑰解密 , 王五和我說「明天晚上來家裏打麻將」

這個過程也是加密(王五將信息加密傳給張三)

公鑰和私鑰,簡單理解就是:既然是加密,那確定是不但願別人知道個人消息,因此只能我才能解密,因此可得出:公鑰負責加密,私鑰負責解密;同理,既然是簽名,那確定是不但願有人冒充個人身份,只有我才能發佈這個數字簽名,因此可得出:私鑰負責簽名,公鑰負責驗證。

如何生成私鑰

用openssl這個工具
安裝

apt-get install openssl
生成

openssl genrsa -out rsa_private_key.pem 1024
如何生成公鑰

將原始 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

php例子,李四用張三的公鑰加密了一句話給張三。

<?php
/*

*/
error_reporting(E_ALL);
echo '<meta charset="utf-8">';

// 公鑰
$publicKey = '-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/qtdtnjxoKndOhsfqSNSM8HKV
1WI8MMQvDE1M8IUo+YCtu6hqLprVAIxwhZOHkH0ezY/3pcQM0h7BeeE5RBsg5K6n
HfWmUP3F/cs0m32STlAj60WBboIHvxYFn499xWeG37u08P+/HtAi8Pqc/kKJd8nk
DsuXmxdaOFmRX0bIrQIDAQAB
-----END PUBLIC KEY-----';
// 私鑰
$privateKey = '-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC/qtdtnjxoKndOhsfqSNSM8HKV1WI8MMQvDE1M8IUo+YCtu6hq
LprVAIxwhZOHkH0ezY/3pcQM0h7BeeE5RBsg5K6nHfWmUP3F/cs0m32STlAj60WB
boIHvxYFn499xWeG37u08P+/HtAi8Pqc/kKJd8nkDsuXmxdaOFmRX0bIrQIDAQAB
AoGAcSPJ8x07D0oyDxqkm/nN7jxph2Tkjh9DT3p1jvtTv3I4sVVa/wLvxtiCDlHr
WlTCZxJ073zck6zdFtx5RLKdR/Hw9RpMHcN3FkjmDMjXoR2ZtlucMbCVCyubSOr0
xGjaKUoQtzIVjCubxGOVcC16I2MxN2c4zBL+RmA4yc6tEMECQQDepBI5cEsOQLyx
DH7pHAWLT6qt6poxw/IqvUVozh3LSiF7VvNQnVvhNJPwMHmw+nWv83fjyYZeJBHK
rDPlv1ypAkEA3GK0ecmpIwW1xnnguve5l8xQz9w5igPzxgpKrKO07vemSz9cHE9J
yFW4AjhYaCwo0KlC9xz90vbLV+lbraeqZQJAU67FrtM3UtcgVUfGF+ZRayh5lb8d
T+E/j7LueNMoPbXSWeK3t7A9zasOg/QkeVHalFTl1jd0CsRx74TESPGhaQJBALeL
5W+BCsLGYKwamZZd9057tdpIOgu+WurXa3X5KhnUW8VT0a0qQ/L7oTMIJmksThnq
voD8vlFTheuDyP0KJRkCQDwzAk61+cTWbfYeOfZpfON2LVV6I1nuLTT8DdDSBCFf
yFJNUji+YdAKkSK697Kp8O2JEkWzse0ePPjsQvFmE0Q=
-----END RSA PRIVATE KEY-----';
// 待加密的字符串數據
$data = '咱們明天去酒吧喝酒';
// 爲避免亂碼,我先進行base64 ecode
$data = base64_encode($data);

// 加密方用公鑰加密
openssl_public_encrypt($data, $encrypted, $publicKey);

    // 解密方用私鑰鑰解密
openssl_private_decrypt($encrypted, $decrypted, $privateKey);
    // 進行base64 decode 獲得原字符串
$originData =  base64_decode($decrypted);
print_r( $originData );

?>

https://java-er.com/blog/php-rsa-encrypt/

相關文章
相關標籤/搜索