概述
DH算法是非對稱加密算法的鼻祖,爲非對稱加密算法奠基了基礎,主要用途是進行密鑰交換,確保共享的密鑰可以安全穿越不安全的網絡。該算法其背後有對應數學理論作支撐,簡單來說就是構造一個複雜的計算難題,使得對該問題的求解在現實的時間內沒法快速有效的求解(computationally infeasible )。html
這個機制的巧妙在於須要安全通訊的雙方能夠用這個方法肯定對稱密鑰。而後能夠用這個對稱密鑰進行加密和解密。可是注意,這個密鑰交換協議/算法只能用於密鑰的交換,而不能進行消息的加密和解密。之因此如此,主要仍是因爲對稱加密和非對稱加密算法的特性決定的。java
1. 對稱加密算法和非對稱加密算法
對稱加密算法git
雙方使用的同一個密鑰,既能夠加密又能夠解密,這種加密方法稱爲對稱加密,也稱爲單密鑰加密。github
優勢:速度快,對稱性加密一般在消息發送方須要加密大量數據時使用,算法公開、計算量小、加密速度快、加密效率高。算法
缺點:在數據傳送前,發送方和接收方必須商定好祕鑰,而後 使雙方都能保存好祕鑰。其次若是一方的祕鑰被泄露,那麼加密信息也就不安全了。另外,每對用戶每次使用對稱加密算法時,都須要使用其餘人不知道的惟一祕鑰,這會使得收、發雙方所擁有的鑰匙數量巨大,密鑰管理成爲雙方的負擔。安全
在對稱加密算法中經常使用的算法有:DES、AES等。網絡
AES:密鑰的長度能夠爲12八、192和256位,也就是16個字節、24個字節和32個字節。函數
DES:密鑰的長度64位,8個字節。ui
非對稱加密算法加密
一對密鑰由公鑰和私鑰組成(可使用不少對密鑰)。私鑰解密公鑰加密數據,公鑰解密私鑰加密數據(私鑰公鑰能夠互相加密解密)。私鑰只能由一方保管,不能外泄。公鑰能夠交給任何請求方。
優勢:安全。
缺點:速度較慢。
在非對稱加密算法中經常使用的算法有: DH,RSA等。
二者區別
- 算法複雜度:對稱密鑰<非對稱密鑰
- 加解密速度:對稱密鑰>非對稱密鑰
- 安全性:對稱密鑰<非對稱密鑰
對稱加密算法相比非對稱加密算法來講,加解密的效率要高得多。可是缺陷在於對於祕鑰的管理上,以及在非安全信道中通信時,密鑰交換的安全性不能保障。因此在實際的網絡環境中,會將二者混合使用。所以 ,在https中(TLS\SSL)握手階段使用非對稱加密進行對稱密鑰的協商,然後在後續正常的數據傳輸時,都會使用對稱加密算法進行加密傳輸。
數學基礎
本原根:若是使得 \(a^{m}\equiv 1\ \left( mod\ n \right)\) 成立的最小正冪 \(m\) 知足 $m=\varphi \left( n \right) $ ,則稱 \(a\) 是 \(n\) 的本原根。 其中 \(\varphi \left( n \right)\) 爲歐拉函數。
性質:若 \(a\) 爲模 \(n\) 的本原根,則 \(a\),\(a\) 的平方,\(a\) 的3次方,……,\(a\) 的 \(\varphi \left( n \right)\) 次m方 模 \(n\) 的餘數互不相同,並且構成一個模n的簡化剩餘系。
栗子(原根):設 \(n=7\),則 \(\varphi \left( 7 \right) =7\times \left( 1-\frac{1}{7} \right) =6\)
- 當 \(n=2\) 時,咱們須要找到一個 \(m\), 使得 \(2^m\%7=1\),且恰好 \(m==\varphi \left( 7 \right)\),首先咱們能找到當 \(m=3\) 時,\(2^3\%7=1\),可是卻不等於 \(\varphi \left( 7 \right)\),所以不知足。
- 當 \(n=3\)時,類比上面一點,能夠發現 \(m=6\) 時,兩點都能知足。所以 \(3\) 爲 \(7\) 的一個原根。
question:找了不少資料對本來根和原根的區別,仍是很含糊!有大神的話,但願能教教我,感謝啦!
算法流程及原理
假設Alice須要與Bob協商一個祕鑰(祕鑰本質上就是一個比特序列,從計算的角度看就是一個大數)。
- 首先Alice與Bob共享一個素數 \(p\) 以及該素數 \(p\) 的本原根 \(g\) (generator),且 \(2\le g\le p-1\)。這兩個數能夠不通過加密的由一方發送到另外一方,至於誰發送給誰並不重要,只要保證雙方都能知道 \(p\) 和 \(g\) 便可。
- 然後Alice產生一個私有的隨機數 \(A\),知足 \(1\le A\le p-1\),而後計算 \(g^Amod\ p=Y_a\),將結果 \(Y_a\) 經過公網發送給Bob; 與此同時,Bob也產生一個私有的隨機數 \(B\),知足 \(1\le B\le p-1\),計算 \(g^Bmod\ p=Y_b\),再將結果 \(Y_b\) 經過公網發送給Alice。
-
此時Alice知道的信息有\(p\),\(g\),\(A\),\(Y_a\),\(Y_b\),其中數字 \(A\) 是Alice私有的,只有她本身知道,其餘的信息都是別人可能知道的;一樣Bob知道的信息有\(p\),\(g\),\(A\),\(Y_a\),\(Y_b\),其中數字 \(B\) 是Bob私有的,只有本身知道。
到目前爲止,Alice和Bob之間的密鑰協商結束。
Alice經過計算 \(K_a=\left( Y_b \right) ^A\ mod\ p\) 獲得密鑰 \(K_a\),一樣的,Bob經過計算 \(K_b=\left( Y_a \right) ^B\ mod\ p\) 獲得密鑰 \(K_b\),能夠證實,必然知足 \(K_a=K_b\)。由此,Alice和Bob獲得了相同的密鑰,達成了密鑰協商的目的。
證實:\(K_a=K_b\)
對於Alice有:
\(K_a=\left( Y_b \right) ^Amod\ p=\left( g^Bmod\ p \right) ^A\ mod\ p=g^{B\times A}\ mod\ p\)
對於Bob有:
\(K_b=\left( Y_a \right) ^Bmod\ p=\left( g^Amod\ p \right) ^B\ mod\ p=g^{A\times B}\ mod\ p\)
上面的運算過程,可根據取模運算的性質可得【a ^ b % p = ((a % p)^b) % p】,由上可得,Alice和Bob生成的密鑰實際上是進行相同的運算過程,所以必然有 \(K_a=K_b\)。
-
若是存在一個竊聽者Eve,他可否破解密鑰呢?很顯然Eve可以竊聽到 \(p\),\(g\),\(Y_a\),\(Y_b\),因此問題轉變了,Eve可否根據這些信息計算出 \(K_a\) 和 \(K_b\) ?要計算 \(K_a\) 和 \(K_b\) 須要知道A和B。
以計算A爲例,Eve能根據 \(p\),\(g\),\(Y_a\) 經過 \(g^Amod\ p=Y_a\) 計算出 \(A\) 嗎? 目前所知的最佳算法Pollard's rho algorithm for logarithms 時間複雜度是 \(O\left( \sqrt{p} \right)\), 可是實際應用中的 \(p\) 爲二進制,假設這個 \(p\) 的長度爲 \(n\), 這個複雜度其實是 $O\left( 2^{\frac{n}{2}} \right) $,這個一個指數級的複雜度,是很是高的。所以求解該問題在計算上的困難程度保證了DH算法的安全性。
安全性問題
那DH密鑰協商算法是否就必定安全呢?咱們所熟知的,存在一種假裝者攻擊(中間人攻擊)可以對這種密鑰協商算法形成威脅。
假設密鑰協商過程當中,在Alice和Bob有一個稱爲Alan的主動攻擊者,他可以截獲Alice和Bob的消息並僞造假消息,考慮如下狀況。
- Alice和Bob已經共享一個素數 \(p\) 以及其該素數 \(p\) 的本原根 \(g\),固然Alan也監聽到報文得知了這個兩個消息。
- 此時Alice計算 \(g^Amod\ p=Y_a\) ,然而將 \(Y_a\) 發送給Bob的過程當中被Alan攔截了,Alan本身選定了一個隨機數 \(C\), 計算 \(Y_c=g^C\ mod\ p\), 而後將 \(Y_c\) 發送給Bob。
- 同時Bob計算 \(g^Bmod\ p=Y_b\),一樣在將 \(Y_b\) 發送給Alice的過程當中被Alan攔截下來,Alan本身選定了一個隨機數D ,計算 \(g^Dmod\ p=Y_d\) 發送給了Alice
- 因爲Alice和Bob通信的消息被替換,Alice計算出來的密鑰實際上爲Alice和Alan之間協商的密鑰:\(K_{ad}=g^{D\times A}\ mod\ p\);Bob計算出來的密鑰其實是Blob和Alan之間協商的密鑰:\(K_{bc}=g^{C\times B}\ mod\ p\) 。若是以後Alice和Bob用他們各自計算出來的密鑰加密任何信息,Alan截獲以後都可以解密獲得明文,而Alan也可以假裝成Alice或者Bob給雙方發消息,而不至於被發現。
參考
http://www.javashuo.com/article/p-kjqykhal-w.html
https://www.cnblogs.com/wushaopei/p/11979200.html