Diffie-Hellman算法是一种密钥交换算法。(什么是密钥交换算法呢?请看下文,不想看的可以跳过。)
The key exchange problem describes ways to exchange whatever keys or other information are needed for establishing a secure communication channel so that no one else can obtain a copy.
Historically, before the invention of public-key cryptography (asymmetrical cryptography), symmetric-key cryptography utilized a single key to encrypt and decrypt messages. For two parties to communicate confidentially, they must first exchange the secret key so that each party is able to encrypt messages before sending, and decrypt received ones. This process is known as the key exchange.
Diffie-Hellman算法能够用作密钥分配(什么是密钥分配,看下一段,不想看的可以跳过。)
从英文来看,密钥分配也称密钥分发。
根据stackexchange上的介绍,密钥分配和密钥交换的差别非常小,非常小,所以我们在这里就姑且看成是相同的概念吧。
也就是说Diffie-Hellman算法的最终目的是让帮助一帮人在“大庭广众”之下协商出一个最终的密钥出来。虽然在”大庭广众之下“,他们仅仅会让我们看到过程,最终协商出来的密钥只有他们自己知道。最初他们每个人心里都有一个秘密的数字,这个东西我们是不知道的。我们仅仅知道他们的过程,所以他们最终协商出来的密钥,我们也是不知道的。
下面是Wiki的解释:
Diffie-Hellman密钥交换在双方之间建立了一个共享的密钥,这个共享的密钥可以被用来在一个公开的网路中交换数据。下方的图示通过颜色展示了密钥交换的大致思路。
首先假设双方分别是Alice和Bob,他们就一个随机的初始的颜色达成了一致。这个颜色不需要被保密,但是每一次要不一样。在这个例子中,这个初始的颜色是黄色。然后他们两个人每一个人选择一个秘密的颜色,Alice只知道Alice的颜色,其他任何人都不知道Alice选的是什么颜色,Bob同理。在这个例子中,Alice选择的是红色,Bob选择的是蓝绿色。这个过程的关键部分是Alice和Bob每个人将他们自己的秘密颜色和他们对方彼此共享的颜色(初始的颜色即黄色)混合在一起,导致了分别是orang-tan色,和浅蓝色。他们公开的将混合之后的颜色进行交换。最终,他们每一个人将他们从对方收到的颜色和他们自己的private color进行混合。这个结果就是最终的混合颜色。在这个例子中是黄褐色。这个颜色和对方的颜色是一致的。
如果某个第三方听到了这个交换,他就会知道公共的颜色(黄色)和第一个混合的颜色(orange-tan和浅蓝色),但是对这个第三方来说,确定最终的秘密颜色(黄褐色)在计算上是很困难的。事实上,当在使用大的数字而不是颜色时,这个行为需要大量的计算。这个行为即使是现代超极计算机都是不可能在一个合理的时间内完成的。
下面是Wiki的解释:
这个协议的最简单最原始的实现使用的是multiplicative group of integers p, p是一个素数。g是primitive root modulo. 之所以要选择这样的两个值是为了产生的结果共享密钥可以是取到从1,p-1的任何一个值。下面是协议的例子。公开的用蓝色表示,秘密的用红色表示。
Alice和Bob已经达到了相同的值s,因为在mod p下,
A b m o d p = g a b m o d p = g b a m o d p = B a m o d p A^b mod\ p = g^{ab} mod\ p = g^{ba}mod\ p = B^a mod\ p Abmod p=gabmod p=gbamod p=Bamod p
下面是Wiki的解释:
Diffie-Hellman密钥协商不仅仅限于两方。通过执行协商协议的迭代和交换中间数据,任意多个用户都可以参与协商中。
举个例子,Alice, Bob, and Carol可以按照下面的方式参与Diffie-Hellman协议。所有的运算都是模p的运算。
1.The paraties agree on the parameters p and g.
2.The parties generate their private keys, named a, b, and c.
3.Alice computes g a g^a ga and sends it to Bob.
4.Bob computes ( g a ) b = g a b (g^{a})^{b} = g^{ab} (ga)b=gab and sends it to Carol.
5.Carol computes ( g a b ) c = g a b c (g^{ab})^{c} = g^{abc} (gab)c=gabc and uses it as her secret.
6.Bob computes g b g^b gb and sends it to Carol.
7.Carol computes ( g b ) c = g b c (g^b)^{c} = g^{bc} (gb)c=gbc and sends it to Alice.
8.Alice computes ( g b c ) a = g b c a = g a b c (g^{bc})^{a} = g^{bca} = g^{abc} (gbc)a=gbca=gabc and uses it as her secret.
9.Carol computes g c g^c gc and sends it to Alice.
10.Alice computes ( g c ) a = g c a (g^c)^{a} = g^{ca} (gc)a=gca and sends it to Bob.
11.Bob computes ( g c a ) b = g c a b = g a b c (g^{ca})^b = g^{cab} = g^{abc} (gca)b=gcab=gabc and uses it as his secret.
一个窃听者能够看到 g a g^a ga, g b g^b gb, g c g^c gc, g a b g^{ab} gab, g a c g^{ac} gac 和 g b c g^{bc} gbc, 但是不能使用这些量的任何结合来高效地重新产生 g a b c g^{abc} gabc.
[1] https://en.wikipedia.org/wiki/Diffie–Hellman_key_exchange#Public_key
[2] 应用密码学:协议、算法与C源程序