ECC椭圆曲线算法详解
椭圆曲线方程
椭圆曲线 E p ( a , b ) Ep(a,b) Ep(a,b), p p p为质数, x , y ∈ [ 0 , p − 1 ] x,y∈[0,p-1] x,y∈[0,p−1]:
y 2 = x 3 + a x + b ( m o d p ) y^{2}=x^{3}+ax+b\ (mod \ p) y2=x3+ax+b (mod p)
其中,要求曲线是非奇异的(处处可导),有 4 a 3 + 27 b 2 ≠ 0 4a^{3}+27b^{2}≠0 4a3+27b2=0。
椭圆曲线上的运算定义
P
+
Q
=
R
P + Q = R
P+Q=R是椭圆曲线上点的加法运算,任意取椭圆曲线上两点
P
P
P、
Q
Q
Q(若
P
P
P、
Q
Q
Q两点重合,则作
P
P
P点的切线),作直线交于椭圆曲线的另一点
R
′
R'
R′,取
R
′
R'
R′关于
x
x
x轴的对称点为
R
R
R,定义
P
+
Q
=
R
P+Q=R
P+Q=R。这样,加法的和也在椭圆曲线上。
k
P
kP
kP是椭圆曲线上点的倍点运算,以
3
P
3P
3P为例。
3
P
=
2
P
+
P
=
(
P
+
P
)
+
P
3P=2P+P=(P+P)+P
3P=2P+P=(P+P)+P,可以按照椭圆曲线上的加法定义进行运算,如下图所示。
其他相关概念
-
两点和的计算:
根据所学的求直线方程、求交点、求对称点的知识,可以求出 P + Q = R P+Q=R P+Q=R中 R R R的表达式。设 P P P为 ( x 1 , y 1 ) (x_{1},y_{1}) (x1,y1), Q Q Q为 ( x 2 , y 2 ) (x_{2},y_{2}) (x2,y2), R R R为 ( x 3 , y 3 ) (x_{3},y_{3}) (x3,y3),则 R R R的计算公式如下:
x 3 = ( k 2 − x 1 − x 2 ) ( m o d p ) x_{3}=(k^{2}-x_{1}-x_{2})\ (mod\ p) x3=(k2−x1−x2) (mod p)
y 3 = ( k ( x 1 − x 3 ) − y 1 ) ( m o d p ) y_{3}=(k(x_{1}-x_{3})-y_{1})\ (mod\ p) y3=(k(x1−x3)−y1) (mod p)
若 P = Q P=Q P=Q,则 k = ( ( 3 x 2 + a ) / 2 y 1 ) ( m o d p ) k=((3x_2+a)/2y_1)\ (mod\ p) k=((3x2+a)/2y1) (mod p)
若 P ≠ Q P≠Q P=Q,则 k = ( y 2 − y 1 ) / ( x 2 − x 1 ) ( m o d p ) k=(y_2-y_1)/(x_2-x_1) \ (mod\ p) k=(y2−y1)/(x2−x1) (mod p)
注意:计算 k k k时的除法,实际上是乘分母的逆元;其他的运算包括模加/减、模乘;即点加运算可以分解为模加/减、模乘和模逆运算。 -
零元的概念:
设无穷点处是零元,则有 0 ∞ + P = P 0∞+P=P 0∞+P=P。
-
负元的概念:
一个点和其负元的和应该是零元,则有 P + ( − P ) = 0 ∞ P+(-P)=0∞ P+(−P)=0∞。
那负元的具体表达式是什么呢?负元是 P P P关于 x x x轴的对称点,即 P ( x , y ) P(x,y) P(x,y)的负元是 ( x , − y m o d p ) = ( x , p − y ) (x,-y \ mod\ p)= (x,p-y) (x,−y mod p)=(x,p−y)。
-
阶的概念:
如果椭圆曲线上一点 P P P,存在最小的正整数 n n n使得数乘 n P = 0 ∞ nP=0∞ nP=0∞ ,则将 n n n称为 P P P的阶;若 n n n不存在,则 P P P是无限阶的。
-
阶的求法:
按照椭圆曲线上加法的定义,依次求 2 P 、 3 P 、 4 P 2P、3P、4P 2P、3P、4P等,直到求出的点 ( k − 1 ) P (k-1)P (k−1)P和 P P P关于 x x x轴对称,有 P P P的阶是 k k k。如下图所示,这里的 P ( 3 , 10 ) P(3,10) P(3,10)在椭圆曲线 y 2 = x 3 + x + 1 ( m o d 23 ) y^{2}=x^{3}+x+1\ (mod\ 23) y2=x3+x+1 (mod 23) 上,求出的 27 P 27P 27P和 1 P 1P 1P关于 x x x轴对称,则 P P P的阶为 28 28 28。
-
椭圆曲线上离散对数问题的复杂性:
当椭圆曲线上的素数 p p p选的比较大时,有 k k k和 P P P,容易求出 Q = k P Q=kP Q=kP。相反,有 Q Q Q和 P P P,是难以求出 k k k的。
椭圆曲线加密算法的过程
-
公私钥生成:
-
Alice首先构造一条椭圆曲线 E E E,在曲线上选择一点 G G G作为生成元,并求 G G G的阶为 n n n,要求 n n n必须为质数;
-
Alice选择一个私钥 k ( k < n ) k (k < n) k(k<n),生成公钥 Q = k G Q = kG Q=kG;
-
Alice将公钥组 E 、 Q 、 G E、Q、G E、Q、G发送给Bob。
-
-
加密过程:
-
Bob收到信息后,将明文编码为 M M M, M M M为曲线上一点,并选择一个随机数 r r r( r < n , n r < n, n r<n,n为 G G G的阶);
-
Bob计算点 C i p h e r 1 Cipher1 Cipher1与 C i p h e r 2 Cipher2 Cipher2即两段密文,计算方法如下
C i p h e r 1 = M + r Q Cipher1 = M + rQ Cipher1=M+rQ
C i p h e r 2 = r G Cipher2 = rG Cipher2=rG
-
Bob把 C i p h e r 1 Cipher1 Cipher1和 C i p h e r 2 Cipher2 Cipher2发给Alice。
-
-
解密过程:
- Alice收到密文后,为了获得
M
M
M,只需要
C
i
p
h
e
r
1
−
k
⋅
C
i
p
h
e
r
2
Cipher1 - k · Cipher2
Cipher1−k⋅Cipher2,因为
C i p h e r 1 − k ∗ C i p h e r 2 = M + r Q − k r G = M + r k G − k r G = M Cipher1 - k*Cipher2 = M + rQ - krG = M + rkG - krG = M Cipher1−k∗Cipher2=M+rQ−krG=M+rkG−krG=M - 将M解码即可。
- Alice收到密文后,为了获得
M
M
M,只需要
C
i
p
h
e
r
1
−
k
⋅
C
i
p
h
e
r
2
Cipher1 - k · Cipher2
Cipher1−k⋅Cipher2,因为