对椭圆曲线的学习,个人推荐如下的链接,没有太多的术语,解释的比较清楚。
https://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introduction/
https://andrea.corbellini.name/2015/05/23/elliptic-curve-cryptography-finite-fields-and-discrete-logarithms/
本文也是在上述链接的基础上的总结。
1. 实数域上的椭圆曲线
1.1 定义
椭圆曲线的数学定义可以查看Wolfram MathWorld:http://mathworld.wolfram.com/EllipticCurve.html。不是密码学或者数学专业的小伙伴,看的是一头雾水。便于工程理解,椭圆曲线是一系列满足如下方程的点:
y 2 = x 3 + a x + b y^2 = x^3 + ax + b y2=x3+ax+b
并且 4 a 3 + 27 b 2 ≠ 0 4a^3 + 27b^2 \ne 0 4a3+27b2=0。该方程称为椭圆曲线的Weierstrass方程。
如下是b=1, a从2到-3的椭圆曲线:
图1
从方程可以看出,椭圆曲线是关于x坐标对称的曲线。除了坐标系上曲线的点,椭圆曲线额外定义一个点(无穷远处),记为 0。
也就是说,椭圆曲线是由如下的点组成:
{ ( x , y ) ∈ R 2 ∣ y 2 = x 3 + a x + b , 4 a 3 + 27 b 2 ≠ 0 } ∪ { 0 } \left\{ (x, y) \in \mathbb{R}^2\ |\ y^2 = x^3 + ax + b,\ 4 a^3 + 27 b^2 \ne 0 \right\}\ \cup\ \left\{ 0 \right\} { (x,y)∈R2 ∣ y2=x3+ax+b, 4a3+27b2=0} ∪ { 0}
1.2 基于椭圆曲线的群定义
在椭圆曲线的基础上,可以定义一个加法群:
-
所有椭圆曲线上的点,就是这个群里的元素
-
单位元就是0
-
点P的逆元是点P相对x坐标的对称点
-
加法定义如下:在椭圆曲线上,和一条直线相交的3个点P,Q以及R,三点相加满足 P + Q + R = 0 P + Q + R = 0 P+Q+R=0。也就说,椭圆曲线上的两点相加的结果,还在椭圆曲线上。
结合群的定义,可以证明定义的这个加法群,就是阿贝尔群。
- 封闭性:因为椭圆曲线上的点相加,还是椭圆曲线上的点。
- 结合律:$P + (Q + R) = (P+Q) + R = 0 $
- 单位元: 单位元是0
- 逆元: 一个椭圆曲线上的点P的逆元,是相对x坐标的对称点
- 交换律: P + Q = Q + P P+Q = Q+P P+Q=Q+P
1.3 椭圆曲线加法计算
因为 P + Q + R = 0 P+Q+R = 0 P+Q+R=0,也就是说 P + Q = − R P+Q = -R P+Q=−R。计算 P + Q P+Q P+Q的方法就比较直观了:连接P和Q划一条线,该线和椭圆曲线交的另外一个点为R。 P + Q P+Q P+Q的结果就是R的逆。
图2
考虑几种特殊情况,对加法计算进行“修正”:
-
P = 0 P=0 P=0或者 Q = 0 Q=0 Q=0:因为定义0为无穷远处,不能基于无穷远处划线。但是因为定义了0为单位元,所以 P + 0 = P P + 0 = P P+0=P以及 0 + Q = Q 0 + Q = Q 0+Q=Q。
-
P = − Q P = -Q P=−Q:因为两个点是对称的,所以基于这两个点划的线垂直于x轴,不再相交于其他点。 P + Q = − Q + Q = 0 P+Q = -Q + Q = 0 P+Q=−Q+Q=0。
-
P = Q P=Q P=Q:如果P和Q是同一个点的话, 那存在多条线穿过这“两个”点。如果把Q看作是无限接近P的过程,可以看出,穿过P和Q的是椭圆曲线在P点的切线。如果切线和椭圆曲线相交的点为R,则 P + P + R = 0 P+P+R=0 P+P+R=0, P + P = 2 P = − R P+P = 2P = -R P+P=2P=−R。
图3
-
P ≠ Q P \ne Q P=Q,并且不存在第三个点相交:这种情况和上一种情况有点类似,也就是说,P/Q的连线是椭圆曲线的切线。如果P点是切点, P + P + Q = 0 P+P+Q = 0 P+P+Q=0。也就是说, P + Q = − P P+Q = -P P+Q=−P。
图4
1.4 加法计算推导
加法的定义是完备的。针对最普通的情况,就是在椭圆曲线上一条直线能穿过三个点,分别是 P , Q , R P, Q, R P,Q,R。 P = ( x P , y P ) , Q = ( x Q , y Q ) , R = ( x R , y R ) P = (x_P, y_P), Q = (x_Q, y_Q), R = (x_R, y_R) P=(xP,yP