[轉帖]公鑰、私鑰、數字簽名等知識

公鑰、私鑰、數字簽名等知識

 
https://www.cnblogs.com/charlesblc/p/6130433.html

我是學渣

 

參考這篇文章,講得很好:http://www.blogjava.net/yxhxj2006/archive/2012/10/15/389547.htmlhtml

來自:http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.htmljava

它用圖片通俗易懂地解釋了,"數字簽名"(digital signature)和"數字證書"(digital certificate)究竟是什麼。git

 

1. 鮑勃有兩把鑰匙,一把是公鑰,另外一把是私鑰。算法

 

2. 鮑勃把公鑰送給他的朋友們----帕蒂、道格、蘇珊----每人一把。api

3. 蘇珊要給鮑勃寫一封保密的信。她寫完後用鮑勃的公鑰加密,就能夠達到保密的效果。瀏覽器

 

4. 鮑勃收信後,用私鑰解密,就看到了信件內容。這裏要強調的是,只要鮑勃的私鑰不泄露,這封信就是安全的,即便落在別人手裏,也沒法解密。安全

5. 鮑勃給蘇珊回信,決定採用"數字簽名"。他寫完後先用Hash函數,生成信件的摘要(digest)。服務器

6. 而後,鮑勃使用私鑰,對這個摘要加密,生成"數字簽名"(signature)。網絡

7. 鮑勃將這個簽名,附在信件下面,一塊兒發給蘇珊。函數

8. 蘇珊收信後,取下數字簽名,用鮑勃的公鑰解密,獲得信件的摘要。由此證實,這封信確實是鮑勃發出的。

 

 

 

9. 蘇珊再對信件自己使用Hash函數,將獲得的結果,與上一步獲得的摘要進行對比。若是二者一致,就證實這封信未被修改過。

 

10. 複雜的狀況出現了。道格想欺騙蘇珊,他偷偷使用了蘇珊的電腦,用本身的公鑰換走了鮑勃的公鑰。此時,蘇珊實際擁有的是道格的公鑰,可是還覺得這是鮑勃的公鑰。所以,道格就能夠冒充鮑勃,用本身的私鑰作成"數字簽名",寫信給蘇珊,讓蘇珊用假的鮑勃公鑰進行解密。

11. 後來,蘇珊感受不對勁,發現本身沒法肯定公鑰是否真的屬於鮑勃。她想到了一個辦法,要求鮑勃去找"證書中心"(certificate authority,簡稱CA),爲公鑰作認證。證書中心用本身的私鑰,對鮑勃的公鑰和一些相關信息一塊兒加密,生成"數字證書"(Digital Certificate)。

12. 鮑勃拿到數字證書之後,就能夠放心了。之後再給蘇珊寫信,只要在簽名的同時,再附上數字證書就好了。

13. 蘇珊收信後,用CA的公鑰解開數字證書,就能夠拿到鮑勃真實的公鑰了,而後就能證實"數字簽名"是否真的是鮑勃籤的。

14. 下面,咱們看一個應用"數字證書"的實例:https協議。這個協議主要用於網頁加密。

15. 首先,客戶端向服務器發出加密請求。

16. 服務器用本身的私鑰加密網頁之後,連同自己的數字證書,一塊兒發送給客戶端。

 

 17. 客戶端(瀏覽器)的"證書管理器",有"受信任的根證書頒發機構"列表。客戶端會根據這張列表,查看解開數字證書的公鑰是否在列表以內。

18. 若是數字證書記載的網址,與你正在瀏覽的網址不一致,就說明這張證書可能被冒用,瀏覽器會發出警告。

19. 若是這張數字證書不是由受信任的機構頒發的,瀏覽器會發出另外一種警告。

20. 若是數字證書是可靠的,客戶端就可使用證書中的服務器公鑰,對信息進行加密,而後與服務器交換加密信息。

 

這裏有兩篇ruanyifeng的rsa原理:

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

若是你問我,哪種算法最重要?

我可能會回答"公鑰加密算法"。由於它是計算機通訊安全的基石,保證了加密數據不會被破解。你能夠想象一下,信用卡交易被破解的後果。

1、一點歷史

1976年之前,全部的加密方法都是同一種模式:

  (1)甲方選擇某一種加密規則,對信息進行加密;

  (2)乙方使用同一種規則,對信息進行解密。

因爲加密和解密使用一樣規則(簡稱"密鑰"),這被稱爲"對稱加密算法"(Symmetric-key algorithm)。

這種加密模式有一個最大弱點:甲方必須把加密規則告訴乙方,不然沒法解密。保存和傳遞密鑰,就成了最頭疼的問題。

1976年,兩位美國計算機學家Whitfield Diffie 和 Martin Hellman,提出了一種嶄新構思,能夠在不直接傳遞密鑰的狀況下,完成解密。這被稱爲"Diffie-Hellman密鑰交換算法"。這個算法啓發了其餘科學家。人們認識到,加密和解密可使用不一樣的規則,只要這兩種規則之間存在某種對應關係便可,這樣就避免了直接傳遞密鑰。

這種新的加密模式被稱爲"非對稱加密算法"。

  (1)乙方生成兩把密鑰(公鑰和私鑰)。公鑰是公開的,任何人均可以得到,私鑰則是保密的。

  (2)甲方獲取乙方的公鑰,而後用它對信息加密。

  (3)乙方獲得加密後的信息,用私鑰解密。

若是公鑰加密的信息只有私鑰解得開,那麼只要私鑰不泄漏,通訊就是安全的。


1977年,三位數學家Rivest、Shamir 和 Adleman 設計了一種算法,能夠實現非對稱加密。這種算法用他們三我的的名字命名,叫作RSA算法。從那時直到如今,RSA算法一直是最廣爲使用的"非對稱加密算法"。絕不誇張地說,只要有計算機網絡的地方,就有RSA算法。

這種算法很是可靠,密鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長RSA密鑰是768個二進制位。也就是說,長度超過768位的密鑰,還沒法破解(至少沒人公開宣佈)。所以能夠認爲,1024位的RSA密鑰基本安全,2048位的密鑰極其安全。

 

進入正題,解釋RSA算法的原理。文章共分紅兩部分,今天是第一部分,介紹要用到的四個數學概念。你能夠看到,RSA算法並不難,只須要一點數論知識就能夠理解。

2、互質關係

若是兩個正整數,除了1之外,沒有其餘公因子,咱們就稱這兩個數是互質關係(coprime)。好比,15和32沒有公因子,因此它們是互質關係。這說明,不是質數也能夠構成互質關係。

關於互質關係,不可貴到如下結論:

  1. 任意兩個質數構成互質關係,好比13和61。
  2. 一個數是質數,另外一個數只要不是前者的倍數,二者就構成互質關係,好比3和10。
  3. 若是兩個數之中,較大的那個數是質數,則二者構成互質關係,好比97和57。
  4. 1和任意一個天然數是都是互質關係,好比1和99。
  5. p是大於1的整數,則p和p-1構成互質關係,好比57和56。
  6. p是大於1的奇數,則p和p-2構成互質關係,好比17和15。

 

3、歐拉函數

任意給定正整數n,請問在小於等於n的正整數之中,有多少個與n構成互質關係?(好比,在1到8之中,有多少個數與8構成互質關係?)

計算這個值的方法就叫作歐拉函數,以φ(n)表示。在1到8之中,與8造成互質關係的是一、三、五、7,因此 φ(n) = 4。

 

4、歐拉定理

歐拉函數的用處,在於歐拉定理。"歐拉定理"指的是

若是兩個正整數a和n互質,則n的歐拉函數 φ(n) 可讓下面的等式成立:

歐拉定理的證實比較複雜,這裏就省略了。咱們只要記住它的結論就好了。

歐拉定理能夠大大簡化某些運算。好比,7和10互質,根據歐拉定理,

已知 φ(10) 等於4,因此立刻獲得7的4倍數次方的個位數確定是1。

所以,7的任意次方的個位數(例如7的222次方),心算就能夠算出來。

歐拉定理有一個特殊狀況。

假設正整數a與質數p互質,由於質數p的φ(p)等於p-1,則歐拉定理能夠寫成

這就是著名的費馬小定理。它是歐拉定理的特例。

歐拉定理是RSA算法的核心。理解了這個定理,就能夠理解RSA。

 

5、模反元素

還剩下最後一個概念:

若是兩個正整數a和n互質,那麼必定能夠找到整數b,使得 ab-1 被n整除,或者說ab被n除的餘數是1。

這時,b就叫作a的"模反元素"

 

歐拉定理能夠用來證實模反元素必然存在。

能夠看到,a的 φ(n)-1 次方,就是a的模反元素。

 

下面到第二篇,以下: 

http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

有了上面第一篇的這些知識,咱們就能夠看懂RSA算法。這是目前地球上最重要的加密算法。

 

6、密鑰生成的步驟

咱們經過一個例子,來理解RSA算法。假設愛麗絲要與鮑勃進行加密通訊,她該怎麼生成公鑰和私鑰呢?

(下圖好像反了)

第一步,隨機選擇兩個不相等的質數p和q。

愛麗絲選擇了61和53。(實際應用中,這兩個質數越大,就越難破解。)

第二步,計算p和q的乘積n。

愛麗絲就把61和53相乘。

  n = 61×53 = 3233

n的長度就是密鑰長度。3233寫成二進制是110010100001,一共有12位,因此這個密鑰就是12位。實際應用中,RSA密鑰通常是1024位,重要場合則爲2048位。

 

第三步,計算n的歐拉函數φ(n)。

根據公式:

  φ(n) = (p-1)(q-1)

愛麗絲算出φ(3233)等於60×52,即3120。

 

第四步,隨機選擇一個整數e,條件是1< e < φ(n),且e與φ(n) 互質。

愛麗絲就在1到3120之間,隨機選擇了17。(實際應用中,經常選擇65537。)

 

第五步,計算e對於φ(n)的模反元素d。

所謂"模反元素"就是指有一個整數d,可使得ed被φ(n)除的餘數爲1。

  ed ≡ 1 (mod φ(n))

這個式子等價於

  ed - 1 = kφ(n)

因而,找到模反元素d,實質上就是對下面這個二元一次方程求解。

  ex + φ(n)y = 1

已知 e=17, φ(n)=3120,

  17x + 3120y = 1

這個方程能夠用"擴展歐幾里得算法"求解,此處省略具體過程。總之,愛麗絲算出一組整數解爲 (x,y)=(2753,-15),即 d=2753。

至此全部計算完成。

 

第六步,將n和e封裝成公鑰,n和d封裝成私鑰。

在愛麗絲的例子中,n=3233,e=17,d=2753,因此公鑰就是 (3233,17),私鑰就是(3233, 2753)。

實際應用中,公鑰和私鑰的數據都採用ASN.1格式表達

 

7、RSA算法的可靠性

回顧上面的密鑰生成步驟,一共出現六個數字:

  p
  q
  n
  φ(n)
  e
  d

這六個數字之中,公鑰用到了兩個(n和e),其他四個數字都是不公開的。其中最關鍵的是d,由於n和d組成了私鑰,一旦d泄漏,就等於私鑰泄漏。

那麼,有無可能在已知n和e的狀況下,推導出d?

  (1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。

  (2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。

  (3)n=pq。只有將n因數分解,才能算出p和q。

結論:若是n能夠被因數分解,d就能夠算出,也就意味着私鑰被破解。

但是,大整數的因數分解,是一件很是困難的事情。目前,除了暴力破解,尚未發現別的有效方法。

維基百科這樣寫道:

  "對極大整數作因數分解的難度決定了RSA算法的可靠性。換言之,對一極大整數作因數分解愈困難,RSA算法愈可靠。

  假若有人找到一種快速因數分解的算法,那麼RSA的可靠性就會極度降低。但找到這樣的算法的可能性是很是小的。今天只有短的RSA密鑰纔可能被暴力破解。到2008年爲止,世界上尚未任何可靠的攻擊RSA算法的方式。

  只要密鑰長度足夠長,用RSA加密的信息其實是不能被解破的。"

 

舉例來講,你能夠對3233進行因數分解(61×53),可是你無法對下面這個整數進行因數分解。

  12301866845301177551304949
  58384962720772853569595334
  79219732245215172640050726
  36575187452021997864693899
  56474942774063845925192557
  32630345373154826850791702
  61221429134616704292143116
  02221240479274737794080665
  351419597459856902143413

它等於這樣兩個質數的乘積:

  33478071698956898786044169
  84821269081770479498371376
  85689124313889828837938780
  02287614711652531743087737
  814467999489
    ×
  36746043666799590428244633
  79962795263227915816434308
  76426760322838157396665112
  79233373417143396810270092
  798736308917

事實上,這大概是人類已經分解的最大整數(232個十進制位,768個二進制位)。比它更大的因數分解,尚未被報道過,所以目前被破解的最長RSA密鑰就是768位。

 

8、加密和解密

有了公鑰和密鑰,就能進行加密和解密了。

(1)加密要用公鑰 (n,e)

假設鮑勃要向愛麗絲髮送加密信息m,他就要用愛麗絲的公鑰 (n,e) 對m進行加密。這裏須要注意,m必須是整數(字符串能夠取ascii值或unicode值),且m必須小於n。

所謂"加密",就是算出下式的c:

  me ≡ c (mod n)

愛麗絲的公鑰是 (3233, 17),鮑勃的m假設是65,那麼能夠算出下面的等式:

  6517 ≡ 2790 (mod 3233)

因而,c等於2790,鮑勃就把2790發給了愛麗絲。

(2)解密要用私鑰(n,d)

愛麗絲拿到鮑勃發來的2790之後,就用本身的私鑰(3233, 2753) 進行解密。能夠證實,下面的等式必定成立:

  cd ≡ m (mod n)

也就是說,c的d次方除以n的餘數爲m。如今,c等於2790,私鑰是(3233, 2753),那麼,愛麗絲算出

  27902753 ≡ 65 (mod 3233)

所以,愛麗絲知道了鮑勃加密前的原文就是65。

至此,"加密--解密"的整個過程所有完成。

 

咱們能夠看到,若是不知道d,就沒有辦法從c求出m。而前面已經說過,要知道d就必須分解n,這是極難作到的,因此RSA算法保證了通訊安全。

你可能會問,公鑰(n,e) 只能加密小於n的整數m,那麼若是要加密大於n的整數,該怎麼辦?有兩種解決方法:一種是把長信息分割成若干段短消息,每段分別加密;另外一種是先選擇一種"對稱性加密算法"(好比DES),用這種算法的密鑰加密信息,再用RSA公鑰加密DES密鑰。

 

 

那麼是否是私鑰加密,公鑰也能解密呢,這裏講的很清楚:https://www.zhihu.com/question/25912483/answer/31653639

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

咱們來回顧一下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 \bmod N
  • M \leftarrow Decrypt(SK,CT)。解密算法以私鑰SK和密文CT做爲輸入,輸出消息M。在RSA中,解密算法以下:算法直接輸出明文爲M=CT^d \bmod N。因爲e和d在\varphi(N)下互逆,所以咱們有:CT^d=M^{ed}=M \bmod 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 \bmod N。注意,簽名算法和RSA加密體制中的解密算法很是像。
  • b \leftarrow Verify(PK,\sigma,M)。驗證算法以公鑰PK,簽名\sigma以及消息M做爲輸入,輸出一個比特值b。b=1意味着驗證經過。b=0意味着驗證不經過。在RSA簽名中,驗證算法首先計算M'=\sigma^e \bmod N,隨後對比M'與M,若是相等,則輸出b=1,不然輸出b=0。注意:驗證算法和RSA加密體制中的加密算法很是像。

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

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

那麼,爲何題主問這麼一個問題呢?咱們能夠看到,RSA的加密/驗證,解密/簽字過程太像了。同時,RSA體制自己就是對稱的:若是咱們反過來把e當作私鑰,d當作公鑰,這個體制也能很好的執行。我想正是因爲這個緣由,題主在學習RSA體制的時候纔會出現這種混亂。

那麼建議題主能夠學習一下其餘的公鑰加密體制以及簽名體制。其餘的體制是沒有這種對稱性質的。舉例來講,公鑰加密體制的話能夠看一看ElGamal加密,以及更安全的Cramer-Shoup加密。簽名體制的話能夠進一步看看ElGamal簽名,甚至是BLS簽名,這些體制可能可以幫助題主更好的弄清加密和簽名之間的區別和潛在的聯繫。

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


 

這篇文章能夠補充:http://blog.csdn.net/21aspnet/article/details/7249401

這篇文章裏:

RSA公鑰加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美國麻省理工學院)開發的。RSA取名來自開發他們三者的名字。RSA是目前最有影響力的公鑰加密算法,它可以抵抗到目前爲止已知的全部密碼攻擊,已被ISO推薦爲公鑰數據加密標準。RSA算法基於一個十分簡單的數論事實:將兩個大素數相乘十分容易,但那時想要對其乘積進行因式分解卻極其困難,所以能夠將乘積公開做爲加密密鑰。 

總結:公鑰和私鑰是成對的,它們互相解密。公鑰不能用公鑰解密。

公鑰加密,私鑰解密。

私鑰數字簽名,公鑰驗證。

 

 

如下內容來自 http://blog.csdn.net/fivedoumi/article/details/31410181 講的不細,權當了解。

非對稱加密常常用在基於證書的認證:

複製代碼
近年來至關流行的認證技術應該是基於證書的認證。其實證書就是一個數據塊,主要包括公開密鑰、主體相關的信息、證書有效的日期、證書發行者的信息和證書發行者生成的簽名。

已經談過將公鑰技術反過來能夠應用於數字簽名。但這種前面誰均可以籤的,數字簽名僅僅能解決消息來源真是你擁有公鑰的主人,但並不能說明該主人就是合法的。但咱們可去找一個特別瞭解此人的人(固然要權威了),問問看此人是否信得過。咱們常常說的CA機構就是幹這事情的。

其實整個過程很簡單,基本是二次數字簽名。第一次首先須要證書的實體將本身的信息和公鑰提交給CA,CA確認該組織的可信賴以後,就用本身的密鑰對該實體的信息和公鑰進行簽名。最後被簽名的信息會就叫證書。站在用戶的角度,用戶首先接到一個證書,固然會根據CA(可信)提供的公鑰進行解密,若是能解密,固然就能夠得到可信賴的信息和實體公鑰。而後由實體公鑰再進行前面咱們介紹的數字簽名解密步驟。
複製代碼

 

 

安全套接字層

安全套接字層(SSL)和取代它的傳輸層安全性(TLS)是用於在客戶機和服務器之間構建安全的通訊通道的協議。它也用來爲客戶機認證服務器,以及(不太經常使用的)爲服務器認證客戶機。該協議在瀏覽器應用程序中比較常見,瀏覽器窗口底部的鎖代表 SSL/TLS 有效。

SSL/TLS 使用本教程中已經討論過的三種密碼術構件的混合體,但這一切都是對用戶透明的。如下是該協議的簡化版本:
·    當使用 SSL/TLS(一般使用 https:// URL)向站點進行請求時,從服務器向客戶機發送一個證書。客戶機使用已安裝的公共 CA 證書經過這個證書驗證服務器的身份,而後檢查 IP 名稱(機器名)與客戶機鏈接的機器是否匹配。
·    客戶機生成一些能夠用來生成對話的私鑰(稱爲會話密鑰)的隨機信息,而後用服務器的公鑰對它加密並將它發送到服務器。服務器用本身的私鑰解密消息,而後用該隨機信息派生出和客戶機同樣的私有會話密鑰。一般在這個階段使用 RSA 公鑰算法。
·    而後,客戶機和服務器使用私有會話密鑰和私鑰算法(一般是 RC4)進行通訊。使用另外一個密鑰的消息認證碼來確保消息的完整性。      

 

  

 
相關文章
相關標籤/搜索