RRSA加密是最經常使用的非對稱加密方式,原理是對一極大整數作因數分解的困難性來保證安全性。一般我的保存私鑰,公鑰是公開的(可能同時多人持有)。編程
但你必定會碰到過,兩個開發者爭執:究竟是由誰加密,誰解密?安全
看完這篇文章,你就會明白這一切。編程語言
咱們先來看看權威庫open_ssl的文檔描述,它定義了四個方法加密
看起來彷佛私鑰和公鑰均可以用來進行加密解密?spa
可是仔細查看 RSA_public_decrypt
和RSA_private_encrypt
的描述都是:low level signature operations
code
點進詳細描述,咱們發現 RSA_public_decrypt
並無真正的去解密,而僅僅是對密文進行驗籤!!!blog
也就是說,對於私鑰加密內容,默認的標準包規範是隻支持 公鑰驗籤,並不支持公鑰解密的。支付寶
根據以上結論,咱們知道規範默認是支持 公鑰加密,私鑰解密 和 私鑰加密,公鑰驗籤 的ssl
可是咱們常常也會碰到私鑰加密,公鑰解密的狀況,究竟是怎麼回事?其實咱們使用RSA加密有常見的三種狀況:開發
最經常使用的一種狀況,對接過支付寶就應該碰到過。
接收方存一個私鑰,發送方保存對應的公鑰用來發送消息加密,可以確認消息不被泄露。
因此支付寶會把他生成的一份公鑰給你, 你須要把你生成的公鑰給支付寶,大家的通訊是創建在兩對公私鑰之上的。
發送者把原文和密文同時發佈,客戶端使用公鑰確認是由真正的發送者發出的。
這種狀況通常用於確認消息發佈的真實性,可用於推送、廣播和公開消息驗證場景。
這個自己不在推薦規範內的場景,如今倒是很常見。
例如離線軟件受權,發佈出去的軟件裏面保存一個公鑰,軟件廠商使用私鑰加密包含到期時間的原文,獲得密文,也就是受權碼,軟件驗證的時候使用公鑰解密受權碼,對比當前時間,確認是否過時。
因爲標準包裏面並不支持公鑰解密,像Golang這種的標準庫裏面僅僅按照標準包實現的語言,使用公鑰解密方法的時候,就須要用到第三方庫,或者本身hack。 可是對於老牌的編程語言 C, Java ,PHP 之類的,在標準包內就提供了公鑰解密方法。
因此咱們能發現,RSA加密方式,並非必定由誰加密,由誰解密。
而是得根據你的使用場景來定,至於公鑰和私鑰,其實在數學的概念上是同樣的,都是能互相解密的,只是咱們根據是公開,仍是保存在本身手裏來區分。公佈出去,不怕泄露的就是公鑰,保存在本身手裏的就是私鑰。
看完這篇文章,若是你以爲對你有幫助,請幫我點個贊。
若是文章有錯漏之處,歡迎指出。