作为一名coder,平时工作中真正用到数学公式的机会其实并不多,而且因为工作内容以CRUD为主,本质上是在做数据的提取与组装,很少有用到数学公式的机会,更遑论感受数学之美了(说起来当年考研数学分数高出英语不到10分,要知道数学总分150,英语总分100,不提了,说起来都是泪),直到我研究HTTPS协议时,看到Diffie–Hellman密钥交换协议,真是惊为天人,第一次感觉到了数学之美,持续数年之久,于今日成文。
什么是Diffie–Hellman密钥交换?
它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。
盗图一张
神奇之处
数学公式看着是容易让人头疼的,不过简单来讲就是
- Alice与Bob两人要协定一个只有两人知道的共享密钥
- Alice公开
g
、p
、A
三个数并提供给Bob - Bob公开
B
并提供给Alice - 由此Alice与Bob通过计算可以得到相同的值
K
,作为共享密钥,就算知道这个数学公式,但是通过公开的g
、p
、A
、B
却难以计算出a
中间人攻击
一切看起来似乎很美好,不过前面有提到不安全信道,这种方式难以防止中间人攻击
Alice的网络被Jack监听,Alice跟Bob的交互都要先通过Jack,于是Jack就可以将g
、p
、A
伪造成g'
、p'
、A'
(为什么要伪造呢,因为Jack目前还不知道Bob私有的数据b
),Jack伪装成Alice与Bob通信,同理,得到Bob的数据B
,然后伪造新的数据B'
返回给Alice;所以此时其实共享密钥K其实有两个值,Alice与Jack共享的K1以及Jack与Bob共享的K2,此时Jack作为中间人,就可以窃取Alice与Bob的通讯记录了:
- Alice发送使用K1加密后的数据M
- Jack得到M, 使用K1解密,然后使用K2加密成M'
- Jack将M'发送给Bob
- Bob给Alice发送数据同上
虽然通信信道被窃听,但是双方是无感知的,这就是中间人攻击。
参考: