参考:迪菲-赫尔曼密钥交换
密钥交换的过程,是通信双方AB协商一个公共密钥的过程,该过程的输出是一个密钥K,这个密钥K用于接下来的AB间的通信过程的加解密。
考虑到因特网可以被窃听,需要一个算法来保护这个协商过程,确保只有AB知道协商的结果。
很自然大家会想到非对称加密机制,实际上D-H密钥交换过程确实比RSA算法早。
举个例子:
A使用一个只有他自己知道的整数Sa,B使用一个只有他知道的整数Sb。
如何使用这2个整数协商出来一个A B知道的密钥K,而其他人C看到这个过程,也无法知道K,除非C拥有Sa和Sb。
DH协商密钥过程
DH交换选择一个巨大整数P,和一个基础数g,构造一个有限循环群Group(g,P)。
这个群有这个特色:
TextA = f(g,P,Sa)
TextB = f(g,P,Sb)
同时:f(TextA, P, Sb) = f2( TextB, P, Sa) 而且都等于 K
f是关于公开常数(g, P)的公开算法,C不知Sa或者Sb的情况下,无法得知K。
如果具有这个形式就可以使用这个K来作为AB的公共密钥(e.g. 作为AES算法的密钥)来通信:
f(g(a),b) = f(g(b),a)
RSA算法如何协商密钥
那么在后来的RSA算法中,如何协商公共密钥呢?
RSA算法的特色是什么呢?
RSA(Text, Ka) = code && RSA(code, Kb) = Text
实际上持有公钥的一方加密一个公共密钥发送给持有私钥的一方就可以了。
RSA(SharedKey, PubKey) = code, RSA(code, PriKey) = SharedKey
DH算法的缺陷:无法抵御中间人攻击
(1) 如果这个时候有个C,在A的uplink上冒充B,在B的uplink上冒充A。
(2) C可以和A协商一个公共密钥X1, C可以和B协商出来一个密钥X2。
(3) A发送的给B的消息T, f(T1, x1) = c1, C截获以后,解密得到T1。
(4) C篡改T1,T2 = Hack(T1)。
(5) C 用X2加密 f(T2, X2)=c2, 发送给B。
(6) B收到消息c2,解密f(c2, X2) 得到T2,T2是被篡改的T1。
备注:
关于中间人攻击,实际上,RSA算法本身也无法抵御中间人攻击,比如,如果使用TLS代理服务器,它实际上就是一个中间人,所有信息对它来说都是透明的。
RSA抵御中间人攻击,引入了第三方信任机制,通过信任顶层CA,并使用CA签发它的公钥和CN,使得中间人无法冒充。
如果DH交换过程中也引入第三方信任机制,也可以解决中间人攻击问题。