内容来自ANDREA CORBELLINI的椭圆曲线密码学的介绍:Elliptic Curve Cryptography: a gentle introduction
文章目录
前言
本文是椭圆曲线介绍中的第二篇:整数域上面的椭圆曲线以及离散对数问题。
在上一篇中,一届看到了实数域上面的椭圆曲线以及如何用椭圆曲线的性质来定义一个群。两个点之间的加法定义为:一条直线与椭圆曲线的三个交点,他们的和为0: ( P + Q + R = 0 ) (P+Q+R=0) (P+Q+R=0)。
标量乘法的定义为: ( n P = P + P + ⋯ + P ) (nP=P+P+\cdots +P) (nP=P+P+⋯+P),可以使用类似二进制分解的方法加速标量乘法的运算。
现在将椭圆曲线限制到一个有限域中。
模p的整数域
有限域的概念可以参考这个链接。这里略过了。
F p 上 面 的 椭 圆 曲 线 \mathbb{F}_p上面的椭圆曲线 Fp上面的椭圆曲线
在实数上面的椭圆曲线定义为:
{
(
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 \quad |\quad y^2 = x^3+ax+b,4a^3+27b^2\ne 0 \right\} \cup \{0\}
{(x,y)∈R2∣y2=x3+ax+b,4a3+27b2=0}∪{0}
而有限域上面的椭圆曲线为:
{
(
x
,
y
)
∈
(
F
p
)
2
∣
y
2
=
x
3
+
a
x
+
b
(
m
o
d
p
)
,
4
a
3
+
27
b
2
≠
0
(
m
o
d
p
)
}
∪
{
0
}
\left\{(x,y)\in (\mathbb{F}_p)^2 \quad |\quad y^2 = x^3+ax+b \pmod p,4a^3+27b^2\ne 0 \pmod p \right\} \cup \{0\}
{(x,y)∈(Fp)2∣y2=x3+ax+b(modp),4a3+27b2=0(modp)}∪{0}
,其中
0
0
0表示无穷远点,
a
a
a和
b
b
b是
F
p
\mathbb{F}_p
Fp中的元素。
上面的图片分别为
y
2
≡
x
3
−
7
x
+
10
(
m
o
d
p
)
y^2 \equiv x^3-7x+10 \pmod p
y2≡x3−7x+10(modp)在
p
=
19
,
97
,
127
,
487
p=19,97,127,487
p=19,97,127,487时的情况。可以注意到
x
x
x要么没有对应的
y
y
y值,要么有两个对应的
y
y
y值,且这两个
y
y
y值是对于
y
=
p
/
2
y=p/2
y=p/2对称的。
上图为有限域上面的奇异曲线的例子,即
3
a
3
+
27
b
2
=
0
3a^3+27b^2=0
3a3+27b2=0的情况,这里的例子是
y
2
≡
x
3
(
m
o
d
29
)
y^2\equiv x^3 \pmod{29}
y2≡x3(mod29)的情况,可以看到有一个奇异点
(
0
,
0
)
(0,0)
(0,0),所以这不是一个有效的椭圆曲线。
点之间的加法(几何上)
在实数上面,我们定义加法为三个一条直线上面的点的和为零 ( P + Q + R = 0 ) (P+Q+R=0) (P+Q+R=0),在有限域 F p \mathbb{F}_p Fp上面也可以这么定义,但是怎么理解有限域上面的在一条直线上呢?
显然,这条直线和实数上面的直线是不一样的。在实数上面我们定义满足同一个 a x + b y + c = 0 ax+by+c=0 ax+by+c=0关系式的点是在一条直线上面。那么类似的,我们在有限域 F p \mathbb{F}_p Fp上面可以定义 a x + b y + c ≡ 0 ( m o d p ) ax+by+c\equiv 0 \pmod p ax+by+c≡0(modp)上面的点在一条直线上面。
上图的椭圆曲线为
y
2
≡
x
3
−
x
+
3
(
m
o
d
127
)
y^2 \equiv x^3-x+3\pmod{127}
y2≡x3−x+3(mod127),其中
P
=
(
16
,
20
)
,
Q
=
(
41
,
120
)
P=(16,20),Q=(41,120)
P=(16,20),Q=(41,120)。直线为
y
≡
4
x
+
83
(
m
o
d
127
)
y \equiv 4x + 83 \pmod{127}
y≡4x+83(mod127)。
这样的加法仍然是满足群的性质的:
- Q + 0 = 0 + Q = Q Q+0=0+Q=Q Q+0=0+Q=Q, 0 0 0是单位元。
- 逆元的定义为 Q = ( x Q , y Q ) m o d p Q=(x_Q,y_Q) \bmod p Q=(xQ,yQ)modp, − Q = ( x Q , − y Q ) m o d p -Q=(x_Q,-y_Q) \bmod p −Q=(xQ,−yQ)modp,比如 F 29 \mathbb{F}_{29} F29中点 Q = ( 2 , 5 ) Q=(2,5) Q=(2,5)的逆元为 − Q = ( 2 , 24 ) -Q=(2,24) −Q=(2,24)。
- P+(-P)=0。
遗憾的是,这样的 0 0 0并不能给出几何上面的解释。
点之间的加法(代数上)
在 F p \mathbb{F}_p Fp中计算加法和 R \mathbb{R} R中的计算方法是一致的,除了要模 p p p。
那么,给定
P
=
(
x
P
,
y
P
)
,
Q
=
(
x
Q
,
y
Q
)
P=(x_P,y_P),Q=(x_Q,y_Q)
P=(xP,yP),Q=(xQ,yQ),以及
R
=
(
x
R
,
y
R
)
R=(x_R,y_R)
R=(xR,yR),那么可以按如下方法计算
P
+
Q
=
−
R
P+Q=-R
P+Q=−R:
x
R
=
(
m
2
−
x
P
−
x
Q
)
m
o
d
p
y
R
=
[
y
P
+
m
(
x
R
−
x
P
)
]
m
o
d
p
=
[
y
Q
+
m
(
x
R
−
x
Q
)
]
m
o
d
p
\begin{aligned} x_{R} &=\left(m^{2}-x_{P}-x_{Q}\right) \bmod p \\ y_{R} &=\left[y_{P}+m\left(x_{R}-x_{P}\right)\right] \bmod p \\ &=\left[y_{Q}+m\left(x_{R}-x_{Q}\right)\right] \bmod p \end{aligned}
xRyR=(m2−xP−xQ)modp=[yP+m(xR−xP)]modp=[yQ+m(xR−xQ)]modp
如果
P
≠
Q
P\ne Q
P=Q,那么
m
=
(
y
P
−
y
Q
)
(
x
P
−
x
Q
)
−
1
m
o
d
p
m=\left(y_{P}-y_{Q}\right)\left(x_{P}-x_{Q}\right)^{-1} \bmod p
m=(yP−yQ)(xP−xQ)−1modp。
如果
P
=
Q
P=Q
P=Q,那么
m
=
(
3
x
P
2
+
a
)
(
2
y
P
)
−
1
m
o
d
p
m=\left(3 x_{P}^{2}+a\right)\left(2 y_{P}\right)^{-1} \bmod p
m=(3xP2+a)(2yP)−1modp。
椭圆曲线的阶:
有限域上面的椭圆曲线是由有限个点所构成的,那么具体有几个点呢?
首先,定义概念椭圆曲线群的阶为当前椭圆曲线群上面的点的数量。
可以直接将 x x x从 0 0 0到 p − 1 p-1 p−1计数有多少点,但这样的复杂度是 O ( p ) O(p) O(p)的,在 p p p比较大的时候会很慢,也有比较高效的算法来计算椭圆曲线的阶,比如Schoof算法,这里不具体展开。
标量乘法以及循环群
标量乘法的计算方法即为计算多次的加法:
n
P
=
P
+
P
+
⋯
+
P
⏟
n
times
n P=\underbrace{P+P+\cdots+P}_{n \text { times }}
nP=n times
P+P+⋯+P
同样的,可以用之前提出的二进制分解的方法来加快运算。
但有限域上面的乘法有一个有趣的性质,就是他会构成一个乘法循环子群。
拿
y
2
=
x
3
+
2
x
+
3
(
m
o
d
97
)
y^2=x^3+2x+3 \pmod {97}
y2=x3+2x+3(mod97)来举例,
P
=
(
3
,
6
)
P=(3,6)
P=(3,6)的话,会发现
n
P
nP
nP会在
(
0
,
P
,
2
P
,
3
P
,
4
P
)
(0,P,2P,3P,4P)
(0,P,2P,3P,4P)这些值中不断循环。可以在这个链接里面试一下。
这样的 P P P被称作这个循环子群的生成元(generator)或者基本点(base point)。
子群的阶
有一个问题就是由 P P P生成的循环子群的阶是多少呢?。或者换一种说法, P P P的阶是多少?。
- P P P的阶就是令 n P = 0 nP=0 nP=0的最小的 n n n,( 0 0 0本身除外),在上面的例子里面就是 5 5 5。
- P P P的阶和整个椭圆曲线的阶是满足拉格朗日定理的,也就是说子群的阶可以整除父群的阶。
因此就可以用下面的方法找出某个点 P P P的阶了:
- 使用Schoof算法计算得出整个椭圆曲线的阶 N N N。
- 找到阶 N N N的所有因子。
- 对于 N N N的每个因子 n n n,按照从小到大的方式,计算 n P nP nP。
- 如果 n P = 0 nP=0 nP=0,那么 n n n是子群的阶。
特例是如同 y 2 = x 3 − x + 1 ( m o d 29 ) y^2=x^3-x+1 \pmod{29} y2=x3−x+1(mod29)这样的阶为素数 37 37 37的曲线,那么他的子群就是本身。也就是这个一个循环群。
如何找生成元
在椭圆曲线密码学中,我们需要一个较高次数的子群。所以一般来说,是先取一个曲线,然后计算他的阶 N N N,选择一个比较大的因子 n n n,然后根据这个因子来找到一个合适的生成元。
首先,介绍一下cofactor的概念,因此拉格朗日定理的存在,所以可以推断 h = N / n h=N/n h=N/n是一个整数,那么这个 h h h就是子群的cofactor。
那么对于曲线中的任意一个点,满足 N P = 0 NP=0 NP=0,也可以写成是 n ( h P ) = 0 n(hP)=0 n(hP)=0。
当 n n n为素数时,只要任取一点 P P P,令 G = h P G=hP G=hP,那么 G G G就是一个阶为 n n n的生成元。
总结一下找生成元的步骤:
- 计算椭圆曲线的阶 N N N。
- 选择某个因子 n n n作为子群的阶。
- 计算cofactor h = N / n h=N/n h=N/n。
- 选择曲线上面随机一个点 P P P。
- 计算 G = h P G=hP G=hP。
- 如果 G = 0 G=0 G=0,那么从第四步开始重新选,否则 G G G就是我们要的生成元了。
椭圆曲线上面的离散对数问题
在有限域的椭圆曲线中,其离散对数问题定义为:
如果知道 P P P和 Q Q Q,那么如何找到一个 k k k使得 Q = k P Q=kP Q=kP?。
这样一个问题是一个标准的密码学难题假设,也就是大家公认这个问题是比较困难的。
而那些基于整数群上面的离散对数问题的算法比如DSA或者Diffle-Hellman以及Elgamal,都有其在椭圆曲线上面的平替。
椭圆曲线一个优秀的性质在于,同样对于整数上面的离散对数问题 b = a k m o d p b=a^k \bmod p b=akmodp,在参数大小相同的情况下,椭圆曲线的离散对数问题更难解决。
因此,要达到同样的安全等级,椭圆曲线的参数大小更小。