前两节讲到了信息的加密和信息的完整性,可是无法解决密码(密钥)传输保密的问题。如何在不安全的网络上来进行协商密码(密钥)呢?
1976年,W.Diffie和M.Hellman在发表的论文中提出了公钥加密算法思想,但当时并没有给出具体的实施方案,原因在于没有找到单向函数(也就是消息摘要算法),但在该论文中给出了通信双方通过信息交换协商密钥的算法,即Diffie-Hellman密钥交换算法(简称为DH算法)。该算法的目的在于让消息的收发双方可以在安全的条件下交换密钥,以备后续加密/解密使用。因此,DH算法是第一个密钥协商算法,但仅能用于密钥分配,不能用于加密或者解密消息。
那么这是如何进行密钥交换的呢?
1、A与B协商一个大素数p和一个生成数g,在网络上都是公开的,任何人都可以截取到
2、此时A与B就偷偷的在背后搞小动作,A生成随机数x,B生成随机数y
3、A对g^x%p的结果发送给B
4、B对g^y%p的结果发送给A
5、网络上仅能看到p,g,g^x%p,g^y%p这四个数字
6、A能得到p,g,g^y%p,x
7、B能得到p,g,g^x%p,y
8、此时A与B分别开始计算,A就是(g^y%p)^x % p,B就是(g^x%p)^y %p,这个结果就是A与B协商的结果了。
此图来自网络
既然如此,我们来做数学题验证一下吧。
1、A与B协商了p=23和g=5
2、A生成一个随机数x=3,计算A=g^a%p并发送给B
A=5^3%23=10
3、B生成一个随机数y=5,计算B=g^b%p并发送给A
B=5^5%23=20
4、将A得到的信息进行计算密码(密钥)K1=(g^b%p)^x%p
K1=20^3%23=19
5、将B得到的信息进行计算密码(密钥)K2=(g^a%p)^x%p
K2=10^5%23=19
此时就可以得到K1=K2=19,这个就是A与B进行密钥交换了。
每次A与B进行通讯时可以重新生成密码(密钥)。原本这种算法,想通过暴力破解都很难,每次通讯都重新协商新的密码,这样就极大减少了被暴力破解的可能。
事到如此,我们能够放心了吗?不!!!E这个坏家伙又跑出来了,A与B每次通讯都是使用随机密码,那么还是A还是无法验证通讯的对象就是B,E可以伪装成B的嘛。E又在从中作梗,截取A发往B的信息,协商密码,然后篡改之后,又发起与B通讯,协商密码。这样我们又掉进坑里了,好像永远都无法解决通讯安全的问题。那么还有没有一种机制能够帮助到我们呢?欲知详情,请继续关注下回讲解。^_^
原文地址:http://blog.51cto.com/lythjq/2088885