DH金鑰交換(Diffie–Hellman key exchange)演算法筆記

lionzl發表於2016-11-15


下文中^代表乘方運算,例如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金鑰交換演算法的作用是使通訊雙方可以在不安全的通道中建立一個相同的金鑰,用於加密通訊。

基本原理示例:

1、通訊方A和通訊方B約定一個初始數g,g是公開的,如g=5

2、A生成一個隨機數a,a是保密的,如a=6

3、A計算g^a傳送給B,g^a=5^6

4、B生成一個隨機數b,b是保密的,如b=15

5、B計算g^b傳送給A,g^b=5^15

6、A接收到g^b後,再使用保密的a,計算(g^b)^a=g^(a*b)=5^(6*15)

7、B接收到g^a後,再使用保密的b,計算(g^a)^b=g^(a*b)=5^(6*15)

8、這樣通訊方A和B得到一個相同的“金鑰”g^(a*b)=5^(6*15)

整個通訊過程中g、g^a、g^b是公開的,但由於g、a、b都是整數,通過g和g^a得到a還是比較容易的,b也是如此,所以最終的“金鑰”g^(a*b)還是可以被計算出來的。所以實際的過程還需要在基本原理上加入新的計算——模運算

1、通訊方A和通訊方B約定一個初始數g,如g=5,一個質數p,如p=23,g和p是公開的

2、A生成一個隨機數a,a是保密的,如a=6

3、A計算g^a%p傳送給B,g^a%p=5^6%23=8

4、B生成一個隨機數b,b是保密的,如b=15

5、B計算g^b%p傳送給A,g^b%p=5^15%23=19

6、A接收到g^b%p後,再使用保密的a,計算(g^b%p)^a%p=19^6%23=2

7、B接收到g^a%p後,再使用保密的b,計算(g^a%p)^b%p=8^15%23=2

8、這樣通訊方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=5、p=23、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


相關文章