來自知乎提問 https://www.zhihu.com/question/25912483
RSA 加密方案和 RSA 簽名方案是不同的,具體的不同點在
的回答里講得很清楚。我在這里主要是想談一下加密方案里的情況。
在 RSA 加密方案中,選定了 計算出
,再在小於
的正整數中選一個和它互素的
作為公鑰,它模
的乘法逆元
則為私鑰。公開
,保留
。
結論:公鑰 用來加密,私鑰
用來解密。
想要反駁的是這個說法
私鑰加密公鑰可以解密
公鑰加密私鑰可以解密
兩個大質數(p,q)乘積(n)難以逆向求解,所以pq是對等的,公鑰和私鑰也是對等的。
匿名用戶:RSA的公鑰和私鑰到底哪個才是用來加密和哪個用來解密?
這樣說的話就有三種情形。我們一一分析:
一、公鑰和私鑰都保密
也就是說,Alice 和 Bob 同時分享一組密鑰 ,然后約定
或
為加密密鑰,另一個為解密密鑰。這樣做固然是可以的,但違背了公鑰加密方案的初衷。公鑰加密的設計就是為了公開加密密鑰,讓所有人都可以給某個人發送消息。
這種場景完全應該使用對稱加密算法,加解密的效率和安全性都更高。
二、公鑰公開,私鑰保密
在這種情況下,用私鑰加密公鑰解密是不可能的。因為密碼學的假設是:一個合格的加密方案,敵手拿到密文 不能恢復出明文
。這樣做的結果是,所有人都可以解密信息,毫無意義。與之對應的有意義的是簽名方案,具體參考開頭我提到的劉巍然的答案。
三、公鑰保密,私鑰公開
這其實才是那個答案的意思:生成的公鑰 和私鑰
是對等的,只是兩個數而已。把它們哪個公開出去用於加密,哪個保留起來用於解密,都是一樣的。
但嚴格地講,這種說法是錯誤的。
對於最基本的 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
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
感謝 、 等人的指正。剛剛才注意到有筆誤,群中的模運算都應該是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中的加密與簽字結合的方案。我想提醒題主的是,加密與簽字結合時,兩套公私鑰是不同的。
如果題主還有進一步的問題,歡迎留言。我個人是衷心希望大家都了解一點密碼學的知識,以便了解龐大的計算機網絡系統到底是如何保護數據安全性的。希望我的回答能對題主有所幫助。
以上