Diffie-Hellman密鑰協商算法主要解決祕鑰配送問題,自己並不是用來加密用的;該算法其背後有對應數學理論作支撐,簡單來說就是構造一個複雜的計算難題,使得對該問題的求解在現實的時間內沒法快速有效的求解(computationally infeasible )。html
理解Diffie-Hellman密鑰協商的原理並不困難,只須要一點數論方面的知識既能夠理解,主要會用到簡單的模算術運算、本原根、費馬小定理、離散對數等基礎數論的知識。在現代密碼學中的基礎數論知識梳理中已經對這些知識作了必要的總結。git
DH密鑰協商算法在1976年在Whitfield Diffie和Martin Hellman兩人合著的論文New Directions in Cryptography(Section Ⅲ PUBLIC KEY CRYPTOGRAPHY)中被做爲一種公開祕鑰分發系統(public key distribution system)被提出來。原文的敘述過程比較簡單,但基本闡述了算法的原理以及其可行性。算法
在該論文中實際上提出了一些在當時頗有創新性的思想。原論文重點討論兩個話題:安全
(1)在公網通道上如何進行安全的祕鑰分派。網絡
(2)認證(能夠細分爲消息認證和用戶認證)。函數
爲了解決第一個問題,原文提出兩種方法:公鑰加密系統(public key cryptosystem)和祕鑰分發系統(public key distribution system)。對於公鑰加密系統,原文只是勾畫了一種比較抽象的公鑰加密系統的概念模型,重點是加解密採用不一樣的祕鑰,並總結了該系統應該知足的一些特性,至關因而一種思想實驗,並無給出具體的算法實現途徑,但這在當時應該來講已經足夠吸引人。後來RSA三人組(Ron Rivest、Adi Shamir 和 Leonard Adleman)受此啓發,通過許多輪失敗的嘗試後,於第二年在論文A Method for Obtaining Digital Signatures and Public-Key Cryptosystems中提出了切實可行且很具體的公鑰加密算法--RSA公鑰加密算法。而對於祕鑰分發系統,就是本文的DH祕鑰協商算法。
工具
爲了解決第二個問題,原文經過單向函數(one-way function)來解決,這就是單向認證的問題。另外做者還討論了這些密碼學問題之間的關聯性以及如何相互轉化。好比一個安全的密碼系統(能夠防護明文攻擊)能夠用來生成一個的單向函數、公鑰加密系統能夠用來做爲單向認證、陷門密碼系統能夠用來生成一個公鑰加密系統。數學難題的計算複雜度被當成一種保障密碼學安全問題的有效工具被利用起來,這一重要思想貫穿現代密碼學的許多加密算法。ui
按照慣例,以Alice和Bob這兩個密碼學中的網紅爲角色,述闡DH算法的流程。編碼
假設Alice須要與Bob協商一個祕鑰(祕鑰本質上就是一個比特序列,從計算的角度看就是一個大數)。加密
1)首先Alice與Bob共享一個素數$p$以及該素數$p$的本原根$g$(geneator),固然這裏有$2\leqslant g\leqslant p-1$。這兩個數是能夠不通過加密地由一方發送到另外一方,至於誰發送給並不重要,其結果只要保證雙方都得知$p$和$g$便可。
2)而後Alice產生一個私有的隨機數$A$,知足$1 \leqslant A\leqslant p-1$,而後計算$g^{A}\;mod\;p=Y_{a}$,將結果$Y_{a}$經過公網發送給Bob;與此同時,Bob也產生一個私有的隨機數$B$,知足$1 \leqslant B\leqslant p-1$,計算$g^{B}\;mod\;p=Y_{b}$,將結果$Y_{b}$經過公網發送給Alice。
3)此時Alice知道的信息有$p,g,A,Y_{a}$,其中數字$A$是Alice私有的,只有她本身知道,別人不可能知道,其餘三個信息都是別人有可能知道的;Bob知道的信息有$p,g,B,Y_{b}$,其中數字$B$是Bob私有的,只有他本身知道,別人不可能知道,其餘都是別人有可能知道的。
到目前爲止,Alice和Bob之間的祕鑰協商結束。
Alice經過計算$K_{a}=(Y_{b})^A\;mod\;p$獲得祕鑰$K_{a}$,同理,Bob經過計算$K_{b}=(Y_{a})^B\;mod\;p$獲得祕鑰$K_{b}$,此時能夠證實,必然知足$K_{a}=K_{b}$。所以雙方通過協商後獲得了相同的祕鑰,達成祕鑰協商的目的。
證實:
對於Alice有:
$K_{a}=(Y_{b})^A\;mod\;p=(g^B\;mod\;p)^{A}\;mod\;p=g^{B\times A}\;mod\;p$
對於Bob有:
$K_{b}=(Y_{a})^B\;mod\;p=(g^{A}\;mod\;p)^{B}\;mod\;p=g^{A\times B}\;mod\;p$
可見,Alice和Bob生成祕鑰時實際上是進行相同的運算過程,所以必然有$K_{a}=K_{b}$。"相同的運算過程"是雙方可以進行祕鑰協商的本質緣由,相似的利用橢圓曲線進行祕鑰協商也是與之相同的原理。
更嚴密地考慮,$A$和$B$不該該選擇$p-1$,也就是說只能在集合$\left \{ 1,2,3,...,p-2 \right \}$中選擇。這是由於若是選擇$p-1$,那麼由費馬小定理可知,狀況就退化成了$g^{p-1}\equiv1\;(mod\;p)$的狀況,對祕鑰協商的機密性構成威脅。
因此總結起來,整個流程串起來大概就是這樣:
那麼竊聽者Eve可否破解祕鑰呢?首先要知道Eve可以得知哪些信息,顯然Eve可以竊聽到的信息只能有$p,g,Y_{a},Y_{b}$,如今的問題是Eve可以經過以上信息計算出$K_{a}$或者$K_{b}$嗎?要計算$K_{a}$或者$K_{b}$須要知道$A$或者$B$。
以計算$A$爲例,Eve能根據條件$g^{A}\;mod\;p=Y_{a}$計算出$A$嗎?實際上當$p$是大質數的時候,這是至關困難的,這就是離散對數問題。實際上在論文發表的當時,計算該問題的最有效的算法的時間複雜度大約是$O(\sqrt{p})$。也正是求解該問題在計算上的困難程度保證了DH算法的安全性。若是可以找到對數時間複雜度的算法,那麼該算法即容易被攻破。
1)假設Alice和Bob共享的$p$和$g$分別是$p=17,g=3$,顯然這裏$g=3$是$p=17$的一個本原根,實際上$3,5,6,7,10,11,12,14$都是17的本原根。
2)而後Alice選定一個私有數字,假設$A=15$,計算$Y_{a}=3^{15}\;mod\;17=14348907\;mod\;17=6$,將6發送給Bob;同時Bob也選定一個私有的數字,假設$B=13$,計算$Y_{a}=3^{13}\;mod\;17=1594323\;mod\;17=12$,將12發送給Alice。
3)Alice計算祕鑰$K_{a}=12^{15}\;mod\;17=2147483647\;mod\;17=8$,Bob計算祕鑰$K_{b}=6^{13}\;mod\;17=2147483647\;mod\;17=8$。雙方通過協商後,8最終成爲雙方的協商的祕鑰。
實際上,當指數和模數的位數都比較大的時候,存在一種快速計算冪取模的算法叫作「反覆平方算法」,實現取來也比較簡單,在算法導論中第三十一章有相應的解釋。
是否DH祕鑰協商算法就必定安全呢?應該說也不是,由於存在一種假裝者攻擊(或者稱爲中間人攻擊)可以對這種祕鑰協商算法構成威脅。
假設祕鑰協商過程當中,在Alice和Bob中間有一個稱爲Mallory的主動攻擊者,他可以截獲Alice和Bob的消息並僞造假消息,考慮以下狀況。
1)Alice和Bob已經共享一個素數$p$及其該素數$p$的本原根$g$,固然Mallory監聽到報文也得知了這兩個消息。
2)此時Alice計算$Y_{a}=g^{A}\;mod\;p$,然而在將$Y_{a}$發送給Bob的過程當中被Mallory攔截,Mallory本身選定一個隨機數$S$,計算$Y_{sb}=g^{S}\;mod\;p$,而後將$Y_{sb}$發送給了Bob。
3)同時Bob計算$Y_{b}=g^{B}\;mod\;p$,然而在將$Y_{b}$發送給Alice的過程當中被Mallory攔截,Mallory本身選定一個隨機數$T$,計算$Y_{ta}=g^{T}\;mod\;p$,而後將$Y_{ta}$發送給了Alice。
因爲通信消息被替換,Alice計算出的祕鑰其實是Alice和Mallory之間協商祕鑰:$K_{am}=g^{A \times T}\;mod\;p$;Bob計算出的祕鑰其實是Bob與Mallory之間協商的祕鑰:$K_{bm}=g^{B \times S}\;mod\;p$。若是以後Alice和Bob用他們計算出的祕鑰加密任何信息,Mallory截獲以後都可以解密獲得明文,並且Mallory徹底能夠假裝成Alice或者Bob給對方發消息。
一、New Directions in Cryptography
二、密碼編碼學與網絡安全原理與實踐
三、圖解密碼技術