RSA的公鑰和私鑰到底哪一個纔是用來加密和哪一個用來解密?

來自知乎提問 https://www.zhihu.com/question/25912483算法

不要去硬記。
你只要想:既然是加密,那確定是不但願別人知道個人消息,因此只有我才能解密,因此可得出公鑰負責加密,私鑰負責解密;同理,既然是簽名,那確定是不但願有人冒充我發消息,只有我才能發佈這個簽名,因此可得出私鑰負責簽名,公鑰負責驗證。
 

RSA 加密方案和 RSA 簽名方案是不一樣的,具體的不一樣點在 安全

 的回答裏講得很清楚。我在這裏主要是想談一下加密方案裏的狀況。

 

在 RSA 加密方案中,選定了 [公式] 計算出 [公式] ,再在小於 [公式] 的正整數中選一個和它互素的 [公式] 做爲公鑰,它模 [公式] 的乘法逆元 [公式] 則爲私鑰。公開 [公式] ,保留 [公式] 。網絡

結論:公鑰 [公式] 用來加密,私鑰 [公式] 用來解密。函數

想要反駁的是這個說法工具

私鑰加密公鑰能夠解密
公鑰加密私鑰能夠解密
兩個大質數(p,q)乘積(n)難以逆向求解,因此pq是對等的,公鑰和私鑰也是對等的。
匿名用戶:RSA的公鑰和私鑰到底哪一個纔是用來加密和哪一個用來解密?

這樣說的話就有三種情形。咱們一一分析:性能

1、公鑰和私鑰都保密

也就是說,Alice 和 Bob 同時分享一組密鑰 [公式] ,而後約定 [公式] 或 [公式] 爲加密密鑰,另外一個爲解密密鑰。這樣作當然是能夠的,但違背了公鑰加密方案的初衷。公鑰加密的設計就是爲了公開加密密鑰,讓全部人均可以給某我的發送消息。學習

這種場景徹底應該使用對稱加密算法,加解密的效率和安全性都更高。加密

2、公鑰公開,私鑰保密

在這種狀況下,用私鑰加密公鑰解密是不可能的。由於密碼學的假設是:一個合格的加密方案,敵手拿到密文 [公式] 不能恢復出明文 [公式] 。這樣作的結果是,全部人均可以解密信息,毫無心義。與之對應的有意義的是簽名方案,具體參考開頭我提到的劉巍然的答案。spa

3、公鑰保密,私鑰公開

這其實才是那個答案的意思:生成的公鑰 [公式] 和私鑰 [公式] 是對等的,只是兩個數而已。把它們哪一個公開出去用於加密,哪一個保留起來用於解密,都是同樣的。.net

但嚴格地講,這種說法是錯誤的。

對於最基本的 RSA 方案(即「教科書式的 RSA 方案」),這麼作是能夠順利地完成加解密的。可是僅僅是理論上成立。由於在實際中,敵手能夠利用各類可能的方法去攻擊咱們的密碼方案。而爲了不這些攻擊,咱們對方案中每一個參數的選取都有很是嚴格的要求。很天然地,公鑰 [公式] 和私鑰 [公式]的要求就是大相徑庭的。好比說我按照密碼標準生成了密鑰,把公鑰留下來解密,把私鑰公佈出去。在敵手眼中,個人公鑰其實就是私鑰,但這個公鑰顯然是不知足密碼標準的要求的,因此敵手極可能能夠破解個人密碼方案。

好比說,咱們的私鑰不能過小。由於若是 [公式] ,敵手就能夠在 [公式] 的線性時間內找到 [公式]。而公鑰 [公式] 也不能過小,但這裏的不能過小隻是爲了抵擋廣播攻擊。對於 1024bit 的 [公式] ,私鑰 [公式] 至少是 256bit 的(關於私鑰 [公式] 不能過小還有一個更 trivial 的緣由,敵手能夠經過枚舉在至多 [公式] 的時間內獲得 [公式] );而 [公式] 取 65537 也是容許的,這裏的 [公式] 只有 17bit 。

若是取一個 17bit 的私鑰,你還能期望你的密碼方案是安全的嗎?impossible。

固然你能夠說,我讓公鑰和私鑰都達到 [公式] 的級別。且不說除此以外還會有別的要求,你要知道 RSA 的加解密都是要算不少大指數取模的,原本就很慢。 [公式] 取 65537 就很好算(由於這數二進制就倆位置是 1),而解密的時候能夠用中國剩餘定理,因此省點時間(由於解密的人是容許知道 [公式] 的分解的,他最後要計算的是 [公式] ,能夠分別計算 [公式] 再用中國剩餘定理獲得結果)。你這樣讓加密的人也得用 256bit 且不知道有幾位是 1 的密鑰加密,得浪費多少計算力,並且毫無心義啊。

 

綜上所述,僅僅從最基礎的原理角度,RSA 的公私鑰互換也能夠成功加解密。但實際上,公鑰和私鑰有徹底不一樣的要求,這些要求保證了 RSA 加密方案儘量地更安全高效。在這種狀況下,公鑰用來公開並加密,私鑰用來保留解密,且不可互換。

 

取一對互質的數好比p, q

p = 61

q = 53

n = p * q = 61 * 53 = 3233

歐拉n = (p-1) * (q-1) = 60 * 52 = 3120

求e;要求 1 < e < 歐拉n 且 e 和 歐拉n 互質; 數有不少,好比17

e = 17

求d;要求 e * d % 歐拉n = 1

轉化公式 x * e + 歐拉n * y = 1 ; 17x + 3120y = 1 ; 算出x = 2753,y = -15

驗證要求 17 * 2753 % 3120 = 1

d = 2753

 

鑰匙A爲: n和e

鑰匙B爲: n和d

 

用鑰匙A加密 123

123 ** e % n = 123 ** 17 % 3233 = 855

用鑰匙B解密 855

855 ** d % n = 855 ** 2753 % 3233 = 123

 

用鑰匙B加密 99

99 ** d % n = 99 ** 2753 % 3233 = 89

用鑰匙A解密 89

89 ** e % n = 89 ** 17 % 3233 = 99

 

【總結】

不知道pq的狀況下:

鑰匙A 不hen能nan 算出 鑰匙B

鑰匙B 也不hen能nan 算出 鑰匙A

 

! e和d 哪一個標記爲公鑰,在性能和安全性上 貌似有差異,一般e被標記爲公鑰

! 大多數工具生成的私鑰是包含pq的

-------------------------------------------------------------------

做者:劉巍然-學酥
連接:https://www.zhihu.com/question/25912483/answer/31653639
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

2016.04.25更新。

感謝
等人的指正。剛剛纔注意到有筆誤,羣中的模運算都應該是N下的。

另外,有評論說要求e和\phi(N)互素。我之因此沒這麼寫,是由於咱們應該在Z_N羣中選擇元素,若是在這個羣裏面選,那麼選出的e必定是和\phi(N)互素的。反過來講,若是e和\phi(N)互素,才能是Z_N中的元素。

=====================
休息完畢,開始進入答題時間!
在回答以前我看了一下已經有的答案,我我的感受不太舒服… 首先,題主既然提出了問題,咱們仍是應該用心來答,而不是打擊題主的信心… 其次,題主有這個問題的本質緣由是由於RSA體制自己的一個特色決定的。我相信題主在提問前已經進行了不少的資料搜索和查找工做,甚至有可能閱讀了RSA那篇原始論文。所以,咱們應該更多地考慮:
  • 爲何題主會提出這個問題,這個問題的本質緣由來自於哪裏?
  • 咱們如何進行詳細的解答,幫助題主解決這個問題。

最後,一些答案自己可能會誤導你們,因此還請仔細斟酌後再進行回答。


=================分割線=================

咱們來回顧一下RSA的加密算法。咱們從公鑰加密算法和簽名算法的定義出發,用比較規範的語言來描述這一算法。

RSA公鑰加密體制包含以下3個算法:KeyGen(密鑰生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。

  • [公式]。密鑰生成算法以安全常數[公式]做爲輸入,輸出一個公鑰PK,和一個私鑰SK。安全常數用於肯定這個加密算法的安全性有多高,通常以加密算法使用的質數p的大小有關。[公式]越大,質數p通常越大,保證體制有更高的安全性。在RSA中,密鑰生成算法以下:算法首先隨機產生兩個不一樣大質數p和q,計算N=pq。隨後,算法計算歐拉函數[公式]。接下來,算法隨機選擇一個小於[公式]的整數e,並計算e關於[公式]的模反元素d。最後,公鑰爲PK=(N, e),私鑰爲SK=(N, d)。
  • [公式]。加密算法以公鑰PK和待加密的消息M做爲輸入,輸出密文CT。在RSA中,加密算法以下:算法直接輸出密文爲[公式]
  • [公式]。解密算法以私鑰SK和密文CT做爲輸入,輸出消息M。在RSA中,解密算法以下:算法直接輸出明文爲[公式]。因爲e和d在[公式]下互逆,所以咱們有:[公式]

因此,從算法描述中咱們也能夠看出:公鑰用於對數據進行加密,私鑰用於對數據進行解密。固然了,這個也能夠很直觀的理解:公鑰就是公開的密鑰,其公開了你們才能用它來加密數據。私鑰是私有的密鑰,誰有這個密鑰纔可以解密密文。不然你們都能看到私鑰,就都能解密,那不就亂套了。


=================分割線=================

咱們再來回顧一下RSA簽名體制。簽名體制一樣包含3個算法:KeyGen(密鑰生成算法),Sign(簽名算法),Verify(驗證算法)。

  • [公式]。密鑰生成算法一樣以安全常數[公式]做爲輸入,輸出一個公鑰PK和一個私鑰SK。在RSA簽名中,密鑰生成算法與加密算法徹底相同。
  • [公式]。簽名算法以私鑰SK和待簽名的消息M做爲輸入,輸出簽名[公式]。在RSA簽名中,簽名算法直接輸出簽名爲[公式]。注意,簽名算法和RSA加密體制中的解密算法很是像
  • [公式]。驗證算法以公鑰PK,簽名[公式]以及消息M做爲輸入,輸出一個比特值b。b=1意味着驗證經過。b=0意味着驗證不經過。在RSA簽名中,驗證算法首先計算[公式],隨後對比M'與M,若是相等,則輸出b=1,不然輸出b=0。注意:驗證算法和RSA加密體制中的加密算法很是像

因此,在簽名算法中,私鑰用於對數據進行簽名,公鑰用於對簽名進行驗證。這也能夠直觀地進行理解:對一個文件簽名,固然要用私鑰,由於咱們但願只有本身才能完成簽字。驗證過程固然但願全部人都可以執行,你們看到簽名都能經過驗證證實確實是我本身籤的。


=================分割線=================

那麼,爲何題主問這麼一個問題呢?咱們能夠看到,RSA的加密/驗證,解密/簽字過程太像了。同時,RSA體制自己就是對稱的:若是咱們反過來把e當作私鑰,d當作公鑰,這個體制也能很好的執行。我想正是因爲這個緣由,題主在學習RSA體制的時候纔會出現這種混亂。那麼解決方法是什麼呢?建議題主能夠學習一下其餘的公鑰加密體制以及簽名體制。其餘的體制是沒有這種對稱性質的。舉例來講,公鑰加密體制的話能夠看一看ElGamal加密,以及更安全的Cramer-Shoup加密。簽名體制的話能夠進一步看看ElGamal簽名,甚至是BLS簽名,這些體制可能可以幫助題主更好的弄清加密和簽名之間的區別和潛在的聯繫。

至於題主問的加密和簽名是怎麼結合的。這種體制叫作籤密方案(SignCrypt),RSA中,這種籤密方案看起來特別特別像,很容易引發混亂。在此我不太想詳細介紹RSA中的加密與簽字結合的方案。我想提醒題主的是,加密與簽字結合時,兩套公私鑰是不一樣的。


若是題主還有進一步的問題,歡迎留言。我我的是衷心但願你們都瞭解一點密碼學的知識,以便了解龐大的計算機網絡系統究竟是如何保護數據安全性的。但願個人回答能對題主有所幫助。


以上

相關文章
相關標籤/搜索