DH
算法概述
通过椭圆曲线 Diffie-Hellman (DH) 密钥协商协议,两个用户可以创建共享的机密协议。他们可以在不安全的公共媒体上完成此操作,而不必事先交换任何私有信息。该共享机密协议通常用于派生密钥材料。对称算法(如高级加密标准 (AES) 算法)可以使用密钥材料对后续消息进行加密。
数学论证
DH 协议依赖两个公共参数:p 和 g。参数 p 是一个大的质数,参数 g 是一个小于 p 的整数。这两个参数通过不安全的线路进行交换。Alice 和 Bob 收到这两个公共参数后,选择私有整数。Alice 选择了 a,Bob 选择了 b。这些值称为私钥。
然后,Alice 和 Bob 使用公共参数及其私钥创建公钥。Alice 使用 (g^a) mod p,Bob 使用 (g^b) mod p。这些是非对称密钥,因为它们不匹配。
Alice 和 Bob 交换这些公钥,并使用它们计算共享的机密协议。虽然 Alice 和 Bob 不知道彼此的私钥,DH 数学也会保证 Alice 和 Bob 将计算出同一共享机密协议。
任何截获交换的人都能够复制 p、g 和两个公钥。但是,要在不知道 Alice 和 Bob 的私钥的情况下从四个公开共享值生成共享机密协议,在计算上是不可行的。
使用暴力(即尝试所有可能的密钥)对 DH 加密的消息进行解密的难度与离散对数问题属同一级别。不过,DH 算法使用较短的密钥即可达到相同程度的安全性,这是因为它依赖椭圆曲线而不是对数曲线。
交换过程
变量:
p是一个素数,公开
g是一个整数,g是p的一个原根,公开
a是Server的私钥
A是Server的公钥
b是Client的私钥
B是Client的公钥
K是Server和Client的共享机密协议
wireshark抓包
-
Diffie-Hellman Group Exchange Request
-
Diffie-Hellman Group Exchange Group
-
Diffie-Hellman Group Exchange Init
e:Client生成的公钥 -
Diffie-Hellman Group Exchange Reply ,New Keys
RSA根据下面两个参数计算公钥:
e:RSA的幂数
N:模数DH生成的公钥
f:Server端计算出的公钥RSA对DH签名
KEX H signature:对DH的内容进行签名 -
New Keys
算法示例
下面的示例使用小整数来演示 DH 算法。
- Alice 和 Bob 同意使用质数 p 和基础整数 g:
p = 83, g = 8 - Alice 选择机密整数 a = 9,然后向 Bob 发送 (g^a) mod p:
(8^9) mod 83 = 5 - Bob 选择机密整数 b = 21,然后向 Alice 发送 (g^b) mod p:
(8^21) mod 83 = 18 - Alice 计算 ( ( (g^b) mod p)^a) mod p:
(18^9) mod 83 = 24 - Bob 计算 ( ( (g^a) mod p)^b) mod p:
(5^21) mod 83 = 24
由于 g^(ab) = g^(ba),Alice 和 Bob 计算出相同的值 (24)。该值就是共享机密协议。Alice 和 Bob 使用这个值派生使用对称加密算法用来对其消息进行加密的密钥材料。
此示例使用值 24 生成共享机密协议。由于这是一个小的值,它生成的加密消息很容易被暴力攻击破坏。在实际情况中,p、g、a 和 b 是很大的数,需要计算机来生成相应的共享机密协议。
协议限制
由于 DH 密钥交换协议不验证公钥发送者的身份,因此无法阻止中间人攻击。如果监听者 Mallory 截获了 Alice 的公钥,就可以替换为他自己的公钥,并将其发送给 Bob。Mallory 还可以截获 Bob 的公钥,替换为他自己的公钥,并将其发送给 Alice。这样,Mallory 就可以轻松地对 Alice 与 Bob 之间发送的任何消息进行解密。他可以更改消息,用他自己的密钥对消息重新加密,然后将消息发送给接收者。
为了解决此问题,Alice 和 Bob 可以在交换公钥之前使用数字签名对公钥进行签名。有两种方法可以实现此目的:
- 使用安全的媒体(例如语音通信或可信载运商)在双方之间传输数字签名密钥。
- 使用公共证书颁发机构 (CA) 向双方提供可信数字签名密钥。
在这两种情况下,都必须使用外部身份验证方案来验证公钥发送者的身份。
EDCH
算法概述
EDCH是ECC和DH的结合,在DH交换密钥的基础上结合ECC椭圆曲线难题生成。试想给定一个椭圆点p,一个整数q,求解k=pq很容易,但给定p和k,求解q是一个数学难题。
常见的ECDH协议有:ecdh-sha2-nistp521、ecdh-sha2-nistp384、ecdh-sha2-nistp256
数学论证
ECDH协议根据指定的椭圆曲线参数,生成椭圆曲线函数:
- 素数p,这个值定义了有限域的大小
- 椭圆曲线的系数a、b
- 基点G(子群的生成元)
- 子群的阶n
- cofactor h (h = N/n)
假设密钥交换双方为Alice、Bob,其有共享曲线参数(椭圆曲线E、阶N、基点G)。
-
Alice生成随机整数a,计算A=a*G。 #生成Alice公钥
-
Bob生成随机整数b,计算B=b*G。 #生产Bob公钥
-
Alice将A传递给Bob。A的传递可以公开,即攻击者可以获取A。
由于椭圆曲线的离散对数问题是难题,所以攻击者不可以通过A、G计算出a。
-
Bob将B传递给Alice。同理,B的传递可以公开。
-
Bob收到Alice传递的A,计算Q =b*A #Bob通过自己的私钥和Alice的公钥得到对称密钥Q
-
Alice收到Bob传递的B,计算Q`=a*B #Alice通过自己的私钥和Bob的公钥得到对称密钥Q’
Alice、Bob双方即得Q=bA=b(aG)=(ba)G=(ab)G=a(bG)=aB=Q’ (交换律和结合律),即双方得到一致的密钥Q。
wireshark抓包
-
Elliptic Curve Diffie-Hellman Key Exchange Init
Q_C:Client根据ECDH算法生成的临时公钥 -
Elliptic Curve Diffie-Hellman Key Exchange Reply , New Keys
RSA根据下面两个参数计算公钥:
e:RSA的幂数
N:模数DH生成的公钥
Q_S:Server端计算出的公钥RSA对DH签名
KEX H signature:对DH的内容进行签名