ECDH 基础
注: 本章节部分参考了 https://developer.aliyun.com/article/1171611 文章, 做了非常少的修改。
引用这篇文章,主要是为了让整个专栏尽可能完善, 不至于欠缺重要的知识点。
由于 ECC 密钥具有很短的长度,所以运算速度比较快。到目前为止,对于 ECC 进行逆操作还是很难的,数学上证明不可破解,ECC 算法的优势就是性能和安全性高。实际应用可以结合其他的公开密钥算法形成更快、更安全的公开密钥算法,比如结合 DH 密钥形成 ECDH 密钥协商算法,结合数字签名 DSA 算法组成 ECDSA 数字签名算法。
算法原理
椭圆曲线源自于求椭圆弧长的椭圆积分的反函数。一般情况下,椭圆曲线可以用下面的方程式来表示,其中 a, b, c, d 为系数:
E
:
y
2
=
a
x
3
+
b
x
2
+
c
x
+
d
E: y^2 = ax^3 + bx^2 + cx+ d
E:y2=ax3+bx2+cx+d
上面是一条椭圆曲线,但是它的样子也并不是一个椭圆。
1. 椭圆曲线上的运算
加法运算:椭圆曲线上的两点 A 和 B,构成的直线与椭圆曲线的交点,与 X 轴的对称点,定义为 A+B。如下图:
当然也存在两个点重合的情况,这种情况下,就相当于寻找 2 倍点的问题。在椭圆曲线上的一点 A,做一条切线,与椭圆曲线的另外一交点,相对于 X 轴的对称点成为 2 倍点。这种运算成为 2 倍计算,如下图:
点 A 相对于 X 轴的对称位置的点成为 -A。这个运算成为椭圆曲线的正负取反运算。如下图:
2. 椭圆曲线加密实质
椭圆曲线加密的实质是利用椭圆曲线上离散对数问题(Elliptic Curve Discrete Logarithm Problem, ECDLP),实质是已知点 xG 求数 x 的问题。
已知:
椭圆曲线 E
椭圆曲线 E 上的一点 G (基点)
椭圆曲线 E 上的一点 xG (G 的 x 倍)
求:
- 数 x
椭圆曲线在实数域上是连续的,曲线也是一条光滑的曲线。假设椭圆曲线为 E2:y^2 = x^3 + x + 1,如下图:
如果位于有限域 F23 上,那么 E2:y^2 ≡ x^3 + x + 1 (mod 23)。此时椭圆曲线就不是一个连续的曲线了,而是一堆离散的点。如下图:
上图中每个点的 y 坐标对 23 求余,都等于 x^3 + x + 1 对 23 求余。如果我们把 E2 上的点 G=(0,1) 作为基点,那么按照椭圆曲线的计算规则计算 2G、3G、4G、5G、……。
这就是“已知 G 和 xG 求 x 的问题”。这个问题在 p 相当大的时候,很难求解。椭圆曲线无法被破解的原因是:求解椭圆曲线上的离散对数问题是非常困难的
但是椭圆曲线加密算法并非在实数域 R 上,而是在有限域 F§ 上。有限域 F§ 指的是对于某个给定的质数 p,由 0,1,2,……,p-1 共 p 个元素所组成的整数集合中定义的加减乘除运算。
3. 椭圆曲线 Diffie-Hellman 密钥交换 (ECDH)
- p = Field that the Curve is defined over
- a, b = Values define the Curve
- G = the generator point
- n = prime order of G
- h = cofactor
非椭圆曲线的 Diffie-Hellman 密钥交换利用的是:
以 p 为模,已知 G 和 G^x mod p 求 x 的复杂度(有限域上的离散对数问题)
椭圆曲线的 Diffie-Hellman 密钥交换利用的是:
在椭圆曲线上,已知 G 和 xG 求 x 的复杂度(椭圆曲线上的离散对数问题)
- Alice 向 Bob 发送点 G (点 G 被窃听了也没有关系)
- Alice 生成随机数 a。这个数只有 Alice 自己一个人知道, 这个 a 称为 Alice 的私钥.
- Bob 生成随机数 b。这个数只有 Bob 自己一个人知道, 这个 b 称为 Bob 的私钥.
- Alice 向 Bob 发送点 aG。它是 Alice 的公钥。
- Bob 向 Alice 发送点 bG。它是 Bob 的公钥。
- Alice 拿到 Bob 发过来的 bG,开始计算其在椭圆曲线上 a 倍的点,即 a(bG) = abG,它就是 Alice 和 Bob 的共享密钥。
- Bob 拿到 Alice 发过来的点 aG 开始计算其在椭圆曲线上 b 倍的点,即 b(aG) = baG = abG,它就是 Alice 和 Bob 的共享密钥。
窃听者可以拿到 3 个有效信息:G、aG、bG。但是由于“已知 G 和 xG 求 x 非常难”,导致已知 G 和 aG 无法求解出 a,已知 G 和 bG 无法求解出 b。所以最终也就无法求解出私钥 abG。
如果采用静态的 DH 算法和 ECC 结合就是 ECDH 算法。这种方式每次都使用的相同的 G 基点,它的优点在于可以避免每次在初始化连接时服务器频繁生成 G。这个过程比较消耗 CPU。但是它带来的缺点是,一旦随机数 a、b 被泄露了,那么在这之前的所有会话都将会被解密。