Diffie–Hellman key exchange DH密钥协商
DH算法是一个密钥的磋商算法,并不能交换一个密钥(安全的将密钥从一方发送到另一方),也不能进行数字签名和加密,只能让双方共同产生一个密钥。
原理
发送方Alice,接收方Bob,双方共享DH参数(p,g),DH参数(p,g)公开
multiplicative group of integers modulo p,where p is prime,g is a primitive root modulo p
Alice的私钥a(其实a不是数字证书的私钥,叫secret,就是为本次协商密钥产生的)
Bob的私钥b(同理,b也不是数字证书的私钥,也是secret)
- Alice和Bob约定使用一个模 p = 23和g = 5(5是primitive root modulo 23)
- Alice选择一个保密的整数 a = 4作为私钥,计算出公钥 A = ga mod p,将公钥A发送给Bob;
- A = 54 mod 23 = 4
- Bob选在一个保密的整数 b = 3,计算出公钥 B = gb mod p,将公钥B发送给Alice;
- B = 53 mod 23 = 10
- Alice 计算出共享密钥 s = Ba mod p
- s = 104 mod 23 = 18
- Bob 计算共享密钥 s = Ab mod p
- s = 43 mod 23 = 18
- Alice和Bob现在就共享一个密钥(s = 18)
Ab mod p = gab mod p = gba mod p = Ba mod p
More specifically
(ga mod p)b mod p = (gb mod p)a mod p
只有a,b,s是保密的,其他的值:p,g,A,B都是公开传输的。一旦Alice和Bob计算出了共享的密钥s,他们就可以使用只有他们双方知道的s作为加密密钥,在公开通道上传输数据。
当然需要足够大的a,b和p的值才能保证上面例子的安全。
g = public (prime) base, known to Alice, Bob, and Eve(窃听者的名字). g = 5
p = public (prime) modulus, known to Alice, Bob, and Eve. p = 23
a = Alice’s private key, known only to Alice. a = 6
b = Bob’s private key known only to Bob. b = 15
A = Alice’s public key, known to Alice, Bob, and Eve. A = ga mod p = 8
B = Bob’s public key, known to Alice, Bob, and Eve. B = gb mod p = 19
DH参数
DH参数(p,g) RFC3526给出了参考值
ECDH算法
Eliptic-curve Diffie-Hellman(ECDH)是基于EC算法的DH方案,将DH算法的模幂运算变成了点乘运算,据说速度有所提高,安全性也增加。
假设Alice和Bob希望建立一个共享密钥,但是他们之间可用的信道是被第三方窃听的。
首先双方要商定参数(p,a,b,G,n,h)。
双方必须有ECC密钥对,包含私钥d(一个随机选择的整数范围[1,n-1]),公钥表现为一个点Q(Q=dG)。令Alice的密钥对表示为(dA, QA) 令Bob的密钥对表示为(dB, QB)。在执行密钥协商协议之前,双方需要提前知道对方的公钥。
Alice计算点(xk,yk)=dAQB。Bob计算点(xk,yk)=dBQA。共享密钥xk(这个点的x坐标)。大部分基于ECDH的标准协议使用KDF通过xk分散出一个对称密钥。
公钥要么是固定的(可信的,一般是通过数字证书),要么是临时的(ECDHE,E表示临时ephemeral)。如果是固定密钥,那么服务器端(Bob)少一步计算QB,用证书公钥代替,服务器发送证书到客户端,使用ECDH时,服务器必须使用ECC证书,服务器不发送server key exchange报文。ECDH的服务器私钥是固定的(服务器证书对应的私钥),服务器私钥泄露,会导致会话密钥被第三方算出。如果使用ECDHE,Alice和Bob双方的的私钥都是临时生成的,服务器证书对应私钥不参与密钥协商,所以私钥泄露不会影响会话密钥安全,是前向安全的(forward secrity)。