注意:只是我的理解,可能有不正確的地方算法
下文中^表明乘方運算,例如2^3=2*2*2=6,參考:http://zh.wikipedia.org/wiki/%E5%86%AA安全
%表明模運算,例如5%3=2,參考:http://zh.wikipedia.org/wiki/%E6%A8%A1%E9%99%A4優化
DH密鑰交換算法的做用是使通訊雙方能夠在不安全的通道中創建一個相同的密鑰,用於加密通訊。加密
基本原理示例:spa
一、通訊方A和通訊方B約定一個初始數g,g是公開的,如g=5ip
二、A生成一個隨機數a,a是保密的,如a=6get
三、A計算g^a發送給B,g^a=5^6原理
四、B生成一個隨機數b,b是保密的,如b=15隨機數
五、B計算g^b發送給A,g^b=5^15通信
六、A接收到g^b後,再使用保密的a,計算(g^b)^a=g^(a*b)=5^(6*15)
七、B接收到g^a後,再使用保密的b,計算(g^a)^b=g^(a*b)=5^(6*15)
八、這樣通訊方A和B獲得一個相同的「密鑰」g^(a*b)=5^(6*15)
整個通訊過程當中g、g^a、g^b是公開的,但因爲g、a、b都是整數,經過g和g^a獲得a仍是比較容易的,b也是如此,因此最終的「密鑰」g^(a*b)仍是能夠被計算出來的。因此實際的過程還須要在基本原理上加入新的計算——模運算:
一、通訊方A和通訊方B約定一個初始數g,如g=5,一個質數p,如p=23,g和p是公開的
二、A生成一個隨機數a,a是保密的,如a=6
三、A計算g^a%p發送給B,g^a%p=5^6%23=8
四、B生成一個隨機數b,b是保密的,如b=15
五、B計算g^b%p發送給A,g^b%p=5^15%23=19
六、A接收到g^b%p後,再使用保密的a,計算(g^b%p)^a%p=19^6%23=2
七、B接收到g^a%p後,再使用保密的b,計算(g^a%p)^b%p=8^15%23=2
八、這樣通訊方A和B獲得一個相同的密鑰:2
(g^b%p)^a%p=(g^a%p)^b%p的證實:
若是a=2:
(g^b%p)^a%p=(g^b%p)^2%p=(g^b-n*p)^2%p=(g^(2*b)-2*g^b*n*p+(n*p)^2)%p=g^(2*b)%p
能夠看出(g^b-n*p)^2展開後除g^(2*b)外,其它都是p的倍數,因此整個算式的結果是g^(2*b)%p
同理對(g^b-n*p)^a展開後除g^(a*b)外,其它都是p的倍數,因此整個算式的結果是g^(a*b)%p
一樣能夠得出(g^a%p)^b%p=g^(a*b)%p
因此(g^b%p)^a%p=(g^a%p)^b%p
整個通訊過程當中g、p、g^a%p、g^b%p是公開的,這時經過g、p、g^a%p獲得a比較難,一樣經過g、p、g^b%p獲得b比較難,因此最終的密鑰是比較安全的。
以g=五、p=2三、g^a%p=8計算a爲例,a=log(5, (8+23*n)),這個只能將n的可能值逐個帶入公式試驗才能獲得a的值。若是a、p是比較大的數那麼計算更加困難。
若是注意的是,爲了防止應用優化算法計算上述問題,質數p不是隨便選擇的,須要符合必定的條件。隨機數a、b的生成算法也必需注意,應使結果儘量隨機,不能出現可預測的規律,不然會使破解變的容易。
經過上述計算過程也能夠看出DH算法不只能夠應用在2方通訊的狀況,若是多方通訊,也可使用該算法。
DH密鑰交換算法沒法驗證對方身份,因此DH密鑰交換算法不能抵禦中間人攻擊(MITM,Man-in-the-middle attack)。
參考:
wiki: http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange