前言:前文讲了DH密钥交换协议,DH的数学基础是离散对数,而一个算法在数学上逆运算越困难,其本身被破解的难度越大。
而我们今天要讲的椭圆曲线算法,在数学上,就复杂的多。
-
椭圆曲线的数学概念
椭圆曲线是由下面的方程描述的曲线:
y² = x³ + ax + b
4a³ + 27b² !=0
比如,y² = x³ - x + 1的图像是:
椭圆曲线有这样的两个性质:
- 关于X轴对称
- 画一条直线跟椭圆曲线相交,它们最多有三个交点
-
运算
首先定义椭圆曲线上点的加法。设椭圆曲线上有两点,A和B点,那么作过这两点的直线与该曲线相交于第三点(C点),然后关于X轴对称得到D点,则D为这两个点的和,记作D=A+B。很明显,D点也在该曲线上。所以椭圆曲线上两点之和也是曲线上的点。
特别地,如果两点重合,则作椭圆曲线在A点处的切线,与曲线相交于第二点(B点),然后关于X轴对称得到C点,则C点为A点与自身的和,记作C=A+A
计算A+B=D
当A != B时,两点纵坐标相减的值与横坐标相减的值就是直线的斜率:λ = (Ya - Yb)/(Xa - Xb)
当A == B,计算过 C(D) 点切线的斜率,既椭圆曲线公式两边求导相除:λ = (3Xa² - 1)/2Yb
斜率计算之后,对点R的坐标进行计算,公式如下:
Xd = (λ² - Xa - Xb)
Yd = (λ(Xa - Xr) - Ya)
那么关于椭圆曲线的加法,我们可以得到以下结论
交换律:A+B=B+A
结合律:(A+B)+C = A+(B+C)
-
椭圆曲线乘法
简单介绍完椭圆曲线上定义的加法运算,椭圆曲线上的乘法运算就比较简单了,因为加法可以退化为加法运算,就像算数上的1*3等价与1+1+1。
假设我们需要求2P,则可以化简为P+P=2P
同理,当我们需要求3P时,可以化简为P+2P=3P,其中2P=P+P
最后,我们可以得到规律,当求nP时(n为任意正整数),P+(n-1)P=nP,其中(n-1)P=P+(n-2)P
这样,通过上述介绍的椭圆曲线加法公式,完全可以进行椭圆曲线的乘法计算
这个乘法满足以下性质:
对于任意正整数kkk和jjj,有
k*(j*P) = (k*j)*P = j*(k*P)
-
有限域上的椭圆曲线
但是密码学中,并不能使用上面介绍的实数域上的椭圆曲线。因为实数域上的椭圆曲线是连续的,有无限个点,密码学要求有限点。
实数域上的椭圆曲线的运算有误差,不精确。密码学要求精确。
所以我们需要引入有限域上的椭圆曲线。
y² = x³ + ax + b mod P
4a³ + 27b² !=0 mod P
讲了这么多数学概念,相信大家头都大了,终于可以到整体了
-
椭圆曲线的DH密钥交换(ECDH)
Tom和小明约定使用某条椭圆曲线(包括曲线参数,有限域参数以及基点P等)
Tom生成私钥A,计算A*P作为公钥公布出去
Jerry生成私钥B,计算B∗P作为公钥公布出去
Tom得知B*P后,计算
key=A*(B*P)
Jerry得到A*P后,计算
key=B*(A*P)
双方都得到了相同的密钥的key,交换完毕
-
安全
由于计算椭圆曲线上的离散对数是很难的,所以第三方没办法在只知道A∗P和B∗P的情况下计算出A或B的值。
需要注意的是,椭圆曲线DH算法相对于DH算法的安全性提升,仅仅只是在破解难度上,或者说在相等长度的密钥的情况下,ECDH更不容易被破解,对于中间人攻击这样的手段,依旧无能为力。