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

我查了好多資料還是不懂。頭暈了

rsa的加密和數字認證怎麼結合起來,能不能具體說明一下。

還有公鑰和私鑰到底哪個才是用來加密和哪個用來解密?


RSA 加密方案和 RSA 簽名方案是不同的,具體的不同點在 @劉巍然-學酥 的回答里講得很清楚。我在這裡主要是想談一下加密方案里的情況。

在 RSA 加密方案中,選定了 p,q 計算出 N=pq ,再在小於 phi(N) 的正整數中選一個和它互素的 e 作為公鑰,它模 phi(N) 的乘法逆元 d 則為私鑰。公開 e ,保留 d

結論:公鑰 e 用來加密,私鑰 d 用來解密。

想要反駁的是這個說法

私鑰加密公鑰可以解密

公鑰加密私鑰可以解密

兩個大質數(p,q)乘積(n)難以逆向求解,所以pq是對等的,公鑰和私鑰也是對等的。

匿名用戶:RSA的公鑰和私鑰到底哪個才是用來加密和哪個用來解密?

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

一、公鑰和私鑰都保密

也就是說,Alice 和 Bob 同時分享一組密鑰 (N,e,d) ,然後約定 ed 為加密密鑰,另一個為解密密鑰。這樣做固然是可以的,但違背了公鑰加密方案的初衷。公鑰加密的設計就是為了公開加密密鑰,讓所有人都可以給某個人發送消息。

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

二、公鑰公開,私鑰保密

在這種情況下,用私鑰加密公鑰解密是不可能的。因為密碼學的假設是:一個合格的加密方案,敵手拿到密文 c 不能恢復出明文 m 。這樣做的結果是,所有人都可以解密信息,毫無意義。與之對應的有意義的是簽名方案,具體參考開頭我提到的劉巍然的答案。

三、公鑰保密,私鑰公開

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

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

對於最基本的 RSA 方案(即「教科書式的 RSA 方案」),這麼做是可以順利地完成加解密的。但是僅僅是理論上成立。因為在實際中,敵手可以利用各種可能的方法去攻擊我們的密碼方案。而為了避免這些攻擊,我們對方案中每個參數的選取都有非常嚴格的要求。很自然地,公鑰 e 和私鑰 d 的要求就是截然不同的。比如說我按照密碼標準生成了密鑰,把公鑰留下來解密,把私鑰公布出去。在敵手眼中,我的公鑰其實就是私鑰,但這個公鑰顯然是不滿足密碼標準的要求的,所以敵手很可能可以破解我的密碼方案。

比如說,我們的私鑰不能太小。因為如果 d<N^{frac{1}{4}} ,敵手就可以在 log N 的線性時間內找到 d 。而公鑰 e 也不能太小,但這裡的不能太小只是為了抵擋廣播攻擊。對於 1024bit 的 N ,私鑰 d 至少是 256bit 的(關於私鑰 d 不能太小還有一個更 trivial 的原因,敵手可以通過枚舉在至多 O(d) 的時間內得到 d );而 e 取 65537 也是允許的,這裡的 e 只有 17bit 。

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

當然你可以說,我讓公鑰和私鑰都達到 O(N^{frac{1}{4}}) 的級別。且不說除此之外還會有別的要求,你要知道 RSA 的加解密都是要算很多大指數取模的,本來就很慢。 e 取 65537 就很好算(因為這數二進位就倆位置是 1),而解密的時候可以用中國剩餘定理,所以省點時間(因為解密的人是允許知道 N 的分解的,他最後要計算的是 c^dpmod N ,可以分別計算 c^d pmod p,c^d pmod q 再用中國剩餘定理得到結果)。你這樣讓加密的人也得用 256bit 且不知道有幾位是 1 的密鑰加密,得浪費多少計算力,而且毫無意義啊。

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


不要去硬記。

你只要想:既然是加密,那肯定是不希望別人知道我的消息,所以只有我才能解密,所以可得出公鑰負責加密,私鑰負責解密;同理,既然是簽名,那肯定是不希望有人冒充我發消息,只有我才能發布這個簽名,所以可得出私鑰負責簽名,公鑰負責驗證


2016.04.25更新。

感謝 @SDKany、 @THEKOC等人的指正。剛剛才注意到有筆誤,群中的模運算都應該是N下的。

另外,有評論說要求e和phi(N)互素。我之所以沒這麼寫,是因為我們應該在Z_N群中選擇元素,如果在這個群裡面選,那麼選出的e一定是和phi(N)互素的。反過來說,如果e和phi(N)互素,才能是Z_N中的元素。

=====================

休息完畢,開始進入答題時間!

在回答之前我看了一下已經有的答案,我個人感覺不太舒服… 首先,題主既然提出了問題,我們還是應該用心來答,而不是打擊題主的信心… 其次,題主有這個問題的本質原因是因為RSA體制本身的一個特點決定的。我相信題主在提問前已經進行了很多的資料搜索和查找工作,甚至有可能閱讀了RSA那篇原始論文。因此,我們應該更多地考慮:

  • 為什麼題主會提出這個問題,這個問題的本質原因來自於哪裡?
  • 我們如何進行詳細的解答,幫助題主解決這個問題。

最後,一些答案本身可能會誤導大家,所以還請仔細斟酌後再進行回答。

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

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

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

  • (PK, SK)leftarrow KeyGen(lambda)。密鑰生成演算法以安全常數lambda作為輸入,輸出一個公鑰PK,和一個私鑰SK。安全常數用於確定這個加密演算法的安全性有多高,一般以加密演算法使用的質數p的大小有關。lambda越大,質數p一般越大,保證體制有更高的安全性。在RSA中,密鑰生成演算法如下:演算法首先隨機產生兩個不同大質數p和q,計算N=pq。隨後,演算法計算歐拉函數varphi(N)=(p-1)(q-1)。接下來,演算法隨機選擇一個小於varphi(N)的整數e,並計算e關於varphi(N)的模反元素d。最後,公鑰為PK=(N, e),私鑰為SK=(N, d)。
  • CT leftarrow Encrypt(PK,M)。加密演算法以公鑰PK和待加密的消息M作為輸入,輸出密文CT。在RSA中,加密演算法如下:演算法直接輸出密文為CT=M^e mod N

  • M leftarrow Decrypt(SK,CT)。解密演算法以私鑰SK和密文CT作為輸入,輸出消息M。在RSA中,解密演算法如下:演算法直接輸出明文為M=CT^d mod N。由於e和d在varphi(N)下互逆,因此我們有:CT^d=M^{ed}=M mod N

所以,從演算法描述中我們也可以看出:公鑰用於對數據進行加密,私鑰用於對數據進行解密。當然了,這個也可以很直觀的理解:公鑰就是公開的密鑰,其公開了大家才能用它來加密數據。私鑰是私有的密鑰,誰有這個密鑰才能夠解密密文。否則大家都能看到私鑰,就都能解密,那不就亂套了。

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

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

  • (PK,SK) leftarrow KeyGen(lambda)。密鑰生成演算法同樣以安全常數lambda作為輸入,輸出一個公鑰PK和一個私鑰SK。在RSA簽名中,密鑰生成演算法與加密演算法完全相同。
  • sigma leftarrow Sign(SK,M)。簽名演算法以私鑰SK和待簽名的消息M作為輸入,輸出簽名sigma。在RSA簽名中,簽名演算法直接輸出簽名為sigma = M^d mod N。注意,簽名演算法和RSA加密體制中的解密演算法非常像
  • b leftarrow Verify(PK,sigma,M)。驗證演算法以公鑰PK,簽名sigma以及消息M作為輸入,輸出一個比特值b。b=1意味著驗證通過。b=0意味著驗證不通過。在RSA簽名中,驗證演算法首先計算M,隨後對比M"與M,如果相等,則輸出b=1,否則輸出b=0。注意:驗證演算法和RSA加密體制中的加密演算法非常像

所以,在簽名演算法中,私鑰用於對數據進行簽名,公鑰用於對簽名進行驗證。這也可以直觀地進行理解:對一個文件簽名,當然要用私鑰,因為我們希望只有自己才能完成簽字。驗證過程當然希望所有人都能夠執行,大家看到簽名都能通過驗證證明確實是我自己簽的。

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

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

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

如果題主還有進一步的問題,歡迎留言。我個人是衷心希望大家都了解一點密碼學的知識,以便了解龐大的計算機網路系統到底是如何保護數據安全性的。希望我的回答能對題主有所幫助。

以上


看答案只有很少人能分清公鑰私鑰,加密解密與簽名認證之間的關係。簡要說一下就是:

這三者沒有關係!

這三者沒有關係!

這三者沒有關係!

首先RSA的數學原理前面有人講得很清楚,簡單說就是:RSA的密鑰是一對,用一個加密,用另一個才能解密,反之亦然。

所以不管用哪一個加密,只要用另一個解密就行了!

然而,公鑰加密系統的提出是為了解決對稱加密中密鑰傳遞的問題。比如AES,只有一個密鑰K,加密解密都用它。假如A要給B發送一段保密信息,A可以用K進行加密,把密文發送給B,B再用K解密,得到明文信息。

這裡面有一個存在風險的地方:B要解密只能用K,而K開始只有A知道,A要告訴B密鑰K只能是明文形式的,既然是明文傳遞,就存在被人截取的風險。

而公鑰加密系統裡面就不存在這個問題了。它的思路是加密與解密用不同的密鑰,這樣就不用傳遞解密的密鑰了。

關鍵是不用傳遞*解密*用的密鑰!

關鍵是不用傳遞*解密*用的密鑰!

關鍵是不用傳遞*解密*用的密鑰!

在公鑰加密系統里,私鑰是保密的,也就是你一個人知道,公鑰是公開的,所有人都知道。而且這個體系保證了:1、加密解密用一對密鑰,一個加密一個解密,2、即便知道了加密用的密鑰,也無法知道(不可計算或者多項式時間不可計算)解密用的密鑰。

所以A與B進行保密通信的過程是:

A要給B發信息要用B的公鑰加密,B用自己的私鑰解密。而B給A發信息要用A的公鑰加密,A用自己的私鑰解密。

然後令題主產生困惑的簽名認證過程與上面的信息傳遞是不一樣的。不過知道了RSA為什麼用公鑰加密用私鑰解密,這個問題也就很清楚了。

認證要解決的問題是你要證明一個東西(比如說文件)真是你的,怎麼證明?

用私鑰!因為只有你一個人知道!

用私鑰!因為只有你一個人知道!

用私鑰!因為只有你一個人知道!

而恰好RSA的兩個密鑰是對稱的,隨便哪一個加密,可以用另一個解密。所以可以用公鑰去驗證私鑰。

所以一個認證過程大概是這樣的:

A發布了一篇文章,說這是我發的,我用自己的私鑰簽名了。由於之前A已經發布了他的公鑰,所以其它人可以用這個公鑰去驗證。因為知道A私鑰的只可能是A自己。

核心就是:私鑰只能自己知道!女朋友都不能告訴!

當然前面認證中發布的公鑰的A怎麼證明確實是A了?這分兩種情況。

一是比如匿名論壇這種情景,簽名主要是為了防冒充,所以你開始發布了公鑰,後面用私鑰簽名了就可以證明這一系列都是同一個人,到底是誰不重要,因為本身就是為了匿名嘛!

而二是比如HTTPS,這就涉及到證書鏈的問題了,可以wiki上看看。

困了,就寫這麼多,希望對題主有幫助。


其實公鑰和私鑰都可以用來加密或解密---只要能保證用A加密,就用B解密就行。至於A是公鑰還是私鑰,其實可以根據不同的用途而定。

例如說,如果你想把某個消息秘密的發給某人,那你就可以用他的公鑰加密。因為只有他知道他的私鑰,所以這消息也就只有他本人能解開,於是你就達到了你的目的。

但是如果你想發布一個公告,需要一個手段來證明這確實是你本人發的,而不是其他人冒名頂替的。那你可以在你的公告開頭或者結尾附上一段用你的私鑰加密的內容(例如說就是你公告正文的一段話),那所有其他人都可以用你的公鑰來解密,看看解出來的內容是不是相符的。如果是的話,那就說明這公告確實是你發的---因為只有你的公鑰才能解開你的私鑰加密的內容,而其他人是拿不到你的私鑰的。

最後再說一下數字簽名。

數字簽名無非就兩個目的:

證明這消息是你發的

證明這消息內容確實是完整的---也就是沒有經過任何形式的篡改(包括替換、缺少、新增)。

其實,上面關於「公告」那段內容,已經證明了第一點:證明這消息是你發的。

那麼要做到第二點,也很簡單,就是把你公告的原文做一次哈希(md5或者sha1都行),然後用你的私鑰加密這段哈希作為簽名,並一起公布出去。當別人收到你的公告時,他可以用你的公鑰解密你的簽名,如果解密成功,並且解密出來的哈希值確實和你的公告原文一致,那麼他就證明了兩點:這消息確實是你發的,而且內容是完整的。


正在手寫 RSA演算法,現在還沒寫出來,快憋死了

p//隨機質數

q//隨機質數

N//p*q

r=φ(N)=(p-1)*(q-1)=N-p-q+1//我也不知道這是幹嘛的,但是演算法里就是要這個

e=65537//隨機整數,但是一般都用這個 AQAB(base64) 10001(16進位) 都是這個數

e*d=kr+1//用擴展歐幾里得演算法,計算出d

(N,e)公鑰

(N,d)私鑰

公鑰,私鑰 裡面的N是一樣的,都是N=p*q

不同部分的 e和d ,關於模r 互為 模反元素,所以他倆誰都能加密,用另一個解密就行了

但是為啥(N,e)用作公鑰呢?因為我們懶啊,e一般都用這個65537,還有個毛秘密可言啊,這還加個毛密啊!!!那就把你(N,e)發布出去,當做公鑰咯。。。

所以只能 用(N,d)作私鑰

結論:倆誰都能加密,用另一個解密就行了。但是(N,e)的e不密,用作公鑰,(N,d)作私鑰。

輕鬆學習RSA加密演算法原理

RSA演算法原理(一)

擴展歐幾里得演算法 好懂一點

擴展歐幾里德演算法詳解


公鑰、私鑰都可以加密,也都可以解密。其中:用公鑰加密需要私鑰解密,稱為「加密」。由於私鑰是不公開的,確保了內容的保密,沒有私鑰無法獲得內容;用私鑰加密需要公鑰解密,稱為「簽名」。由於公鑰是公開的,任何人都可以解密內容,但只能用發布者的公鑰解密,驗證了內容是該發布者發出的。

實際應用中,公私鑰加密有多種協議和演算法,題外話,略。


RSA公鑰與私鑰主要用於數字簽名(Digital Signature)認證(Authentication),我們一般也稱之為不對稱加密/解密。

什麼是認證(Authentication)?

認證是安全通信的前提,如果認證出問題,A不是和A想要聊天的人B在聊天,而是和一個C(假冒B)在聊天,則接下來所有的安全措施都是白搭。以目前常用的數字證書(Digital Certificate)認證為例。

CA(Certificate Agent) 存放 A、B 數字證書,在數字證書里包含有各自的RSA公鑰與加密演算法

A、B各自保管自己的RSA私鑰與加密演算法,RSA公鑰與私鑰類似鎖與鑰匙的關係。即RSA私鑰加密,可以用RSA公鑰解密,反過來亦是如此。

A與B安全通信認證過程

1 A 向CA請求B的數字證書

2.1 CA把B的數字證書做輸入參數,生成一個Hash

2.2 CA用自己的私鑰加密Hash,生成一個數字簽名(Digital Signature)

2.3 CA把數字簽名附在B的數字證書之後,即 B的數字證書 + CA 數字簽名,發給A

3 A擁有CA的公鑰(預裝或者離線方式獲得),可以解密CA的數字簽名(CA私鑰加密),得到Hash,同時對接收到的B的數字證書做Hash運算,也得到一個Hash,如果兩個Hash 相等,則認為此證書安全可靠,在傳輸途中沒有被篡改,我們稱這個過程為數據完整性(Data Integrity )保護。

4 A請求認證B,B用自己的私鑰加密自己的身份信息,發送給A,由於A已經從CA處獲得B的公鑰,所以可以解密B的加密報文。既然公鑰與私鑰是一對一的關係,由於只有B自己知道私鑰,以此邏輯推斷,A通信的對象為真實的B。

5 B認證A的過程類似。


一句話:公鑰加密,私鑰解密。不理解,手算一遍RSA就好了。順便@某phd


我也為這個問題苦惱了好久,其實答案是

私鑰加密公鑰可以解密

公鑰加密私鑰可以解密

======================

很多人沒真正理解RSA的原理,兩個大質數(p,q)乘積(n)難以逆向求解,所以pq是對等的,公鑰和私鑰也是對等的。


如果只看技術的話,其實可以互相加密解密,

即,內容用公鑰加密以後可以使用私鑰解密,內容用私鑰加密後可以用公鑰解密。

具體原理可以去看RSA加密的原理

如果從安全形度考慮,私鑰就只用來解密就好了

具體原因上面有答主說過了


看你怎麼用

如果用於加密解密,那就是用公鑰加密私鑰解密(僅你可讀但別人不可讀,任何人都可寫)

如果用於證書驗證,那就是用私鑰加密公鑰解密(僅你可寫但別人不可寫,任何人都可讀)

最後,RSA的公鑰、私鑰是互相對應的。RSA會生成兩個密鑰,你可以把任何一個用於公鑰,然後另一個就是你必須保護好的私鑰了。


其實概念很簡單:

  1. 小明想秘密給小英發送消息
  2. 小英手裡有一個盒子(public key),這個盒子只有小英手裡的鑰匙(private key)才打得開
  3. 小英把盒子送給小明(分發公鑰)

  4. 小明寫好消息放進盒子里,鎖上盒子(公鑰加密)
  5. 小明把盒子寄給小英(密文傳輸)
  6. 小英用手裡的鑰匙打開盒子,得到小明的消息(私鑰解密)
  7. 假設小剛劫持了盒子,因為沒有小英的鑰匙,他也打不開

這個視頻解釋得很好

https://www.youtube.com/watch?v=wXB-V_Keiu8


公鑰加密私鑰解密是密送,保證消息即使公開也只有私鑰持有者能讀懂。

私鑰加密公鑰解密是簽名,保證消息來源是私鑰持有者。

目前的計算能力,公鑰有效時間內推不出私鑰,私鑰也推不出公鑰。這個不要鑽牛角尖。


說實話,我本來是不打算回答,結果在話題動態裡面又浮了上來。

這問題是逼我爆發的呀,伸手黨可恥你造嗎?

來來來,讓我一步一步的教你應該如何查資料。

第一個問題:

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

第一步,搜一下RSA

好巧,第一條就是百度百科

RSA演算法_百度百科

第二部,打開百度百科

目錄分為概述、解釋、安全性等等,緊接著就是正文。

等等,在正文的第一部分概述裡面我似乎就發現了些什麼?

在公開密鑰密碼體制中,加密密鑰(即公開密鑰)PK是公開信息,而解密密鑰(即秘密密鑰)SK是需要保密的。

因此用了不到一分鐘的時間外加百度這個搜索引擎,我們很容易得到第一個問題的答案:

公鑰用來加密,私鑰用來解密。

好的,然後第二問題:

rsa的數字簽名和加密怎麼結合起來,能不能具體說明一下。

這個問題稍微複雜一點兒,因為問題本身就是錯的!

RSA明明是一個加密演算法,怎麼會和數字簽名扯上關係了呢?

百度一下數字簽名,同樣是百度百科數字簽名_百度百科

本來遇到錯誤的題目我一般都是沒興趣再回答下去了,但是既然都碼了那麼多字了我還是把題目改成一下然後繼續回答吧。

改正後的題目:數字簽名和RSA怎麼結合起來

百度百科第一段第二句話:

一套數字簽名通常定義兩種互補的運算,一個用於簽名,另一個用於驗證。

如果你理解能力足夠的話不難理解【簽名】的意思就是加密,【驗證】的意思就是解密

如果你因為對相關知識認識的還太少的話還可以繼續往下看,很快到了第二點主要功能。

最後一段有非常醒目的一句話:

數字簽名是個加密的過程,數字簽名驗證是個解密的過程。

所以數字簽名使用的也是不對稱密碼體系,也就是公鑰加密演算法

而這個演算法的絕大部分情況下就是RSA

回答完畢

------------------------------------分割線-----------------------------

不好意思我的語氣可能不是太友好,但是我真心的希望題主以後在遇到「查了好多資料還是不懂」的問題時候可以嘗試優化一下自己的資料獲取方式,以及對於關鍵信息的獲取方式。

以上


ssh無密碼登陸是通過公鑰和密鑰之間的認證。

  • 如果無密碼登陸是要兩台機的互聯,每台機都必須生成自己的公鑰和私鑰,並把雙方的公鑰給對方。
  • ssh具體實現是需要把公鑰寫入authorized_keys中,所以需要加入遠程連接的那台機的公鑰。

  • 如果需要自己連接自己無密碼的話,就需要把自己的公鑰寫入authorized_keys中。

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

公鑰可以用來加密,也可以用來加密。

  • 公鑰用來解密是用在數字證書認證。例如A有私鑰,這樣公鑰就可以公開了別人使用,用來解密你私鑰加密的東西,並且確認你的身份。
  • 公鑰用來加密是用做數據加密的,這個倒不公開。

以上。


數學理論上,有些公私鑰是完全對稱的,可以一個加密另一個解密。rsa是一個典型。有沒有隻能用公鑰解密不能用私鑰加密的演算法有沒有我不是專業人士,不敢隨便答。

這個回答主要解釋一下為什麼不用私鑰加密。

加密一般用於解決機密性問題,既然公鑰是不限制發送的,因此私鑰加密解決機密性沒有什麼意義。

非對稱密鑰是可以用於雙向加解密的,例如生成一對非對稱key分發給2個人,他們一個加密一個解密。這時候不存在哪個是公哪個是私。

但非對稱密鑰真正的用途是用於對端認證和密鑰協商的,或者同時解決。那麼用私鑰做簽名,用公鑰加密session密鑰就是常見的用法了。

但是千萬小心用私鑰去加密,因為這份加密的拷貝可以被其他人拿來偽冒你自己。不要用私鑰加密任何有意義的數據,不要用私鑰加密對方送過來的數據,這2個原則一定要把握。不然可以很容易構造別人用這個私鑰加密的數據去偽冒你。

正確的設計是加密信息的摘要,最好原文是全部自己產生的,至少部分是自己產生的。即便如此,還是要小心設計協議防止偽冒。


這麼基本的一個概念問題,一堆半吊子自己沒搞清楚,還毀人不倦的言之鑿鑿的把自己的糊塗理解拿來答題,也是醉了

公鑰加密,私鑰解密,這是rsa的一種用法

私鑰簽名,公鑰驗證,這是另一種用法

另外,有的答題者扯那麼多rsa的演算法數學原理細節幹嘛呢?


我個人的理解是:

RSA 演算法體系用在兩個方面:

1、 加密

A要給B發送數據,要想讓數據只有B能夠解密,而其他人即使獲得了數據也無法解密。那麼,可以在A發送數據之前用B給的公鑰加密,B收到之後就可以用他自己的私鑰(也只有B知道)來解密。

這種情況下,加密的是公鑰,解密的是私鑰。

2、數字簽名

A想讓網上的人確定某些文件是它發布的,它就可以:

先生成自己的公鑰,然後發布給其他人;

然後在發布文件的時候,添加上自己的簽名(可以通過對某個字元串X用A的私鑰加密得到Y,將X和Y和文件一塊發布);

其他人收到文件之後,會用A的公鑰解密Y,得到Z,如果X=Z則說明該文件是A發布的

這種情況下,加密的是私鑰,解密的是公鑰


關於結合加密和數字認證的問題(分別的論證上面已經很詳細了):

假設 A 有公鑰 Ka, 私鑰 Da, B 有公鑰 Kb, 私鑰 Db . A 要發送 B 一個信息。A 先用自己的私鑰 ka 加密信息(第一層),再用從B拿到的公鑰Kb加密(第二層), 然後信息被發送。收到信息的 B 先用自己的私鑰Db解第二層,再用從A拿到的公鑰Ka解第一層。從而信息既是加密也是認證過的。


推薦閱讀:

如何循序漸進的學習數據挖掘?
ACM書籍推薦?
求10的一億次方對較小整數p取余的餘數?
oj上演算法題思路正確,程序也跑的起來,但是為了ac搞幾個小時,這樣有意義嗎?
n鐵球稱重問題(12個鐵球3次找出壞的擴展)?

TAG:演算法 | 網路安全 | 密碼 | 計算機網路 | 密碼學 |