DH密钥交换(Diffie–Hellman key exchange)算法笔记

注意:只是个人理解,可能有不正确的地方
下文中代表乘方运算,例如23=222=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计算ga发送给B,ga=5^6
4、B生成一个随机数b,b是保密的,如b=15
5、B计算gb发送给A,gb=5^15
6、A接收到gb后,再使用保密的a,计算(gb)a=g(ab)=5^(615)
7、B接收到ga后,再使用保密的b,计算(ga)b=g(ab)=5^(615)
8、这样通信方A和B得到一个相同的“密钥”g(a*b)=5(615)
整个通信过程中g、ga、gb是公开的,但由于g、a、b都是整数,通过g和ga得到a还是比较容易的,b也是如此,所以最终的“密钥”g(a
b)还是可以被计算出来的。所以实际的过程还需要在基本原理上加入新的计算——模运算
1、通信方A和通信方B约定一个初始数g,如g=5,一个质数p,如p=23,g和p是公开的
2、A生成一个随机数a,a是保密的,如a=6
3、A计算ga%p发送给B,ga%p=5^6%23=8
4、B生成一个随机数b,b是保密的,如b=15
5、B计算gb%p发送给A,gb%p=5^15%23=19
6、A接收到gb%p后,再使用保密的a,计算(gb%p)a%p=196%23=2
7、B接收到ga%p后,再使用保密的b,计算(ga%p)b%p=815%23=2
8、这样通信方A和B得到一个相同的密钥:2
(gb%p)a%p=(ga%p)b%p的证明:
如果a=2:
(gb%p)a%p=(gb%p)2%p=(gb-n*p)2%p=(g(2*b)-2*gbnp+(np)2)%p=g(2b)%p
可以看出(gb-n*p)2展开后除g(2*b)外,其它都是p的倍数,所以整个算式的结果是g(2b)%p
同理对(g^b-n
p)a展开后除g(ab)外,其它都是p的倍数,所以整个算式的结果是g^(ab)%p
同样可以得出(ga%p)b%p=g^(ab)%p
所以(gb%p)a%p=(ga%p)b%p
整个通信过程中g、p、ga%p、gb%p是公开的,这时通过g、p、ga%p得到a比较难,同样通过g、p、gb%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

原文链接:https://my.oschina.net/u/1382972/blog/330456

推荐阅读更多精彩内容