ECC(Elliptic Curves Cryptography) 属于非对称加密算法的一个重要组成部分。
本文尽量简单地阐述椭圆曲线加密的原理,但需要读者有一些初级的数论与离散数学相关的知识,或者推荐简单地阅读《算法导论》第31章:数论算法。
椭圆曲线
首先需要明确的是,我们讨论的是什么样的曲线。
椭圆曲线有比较复杂的定义: https://en.wikipedia.org/wiki/Elliptic_curve .而我们讨论的椭圆曲线比这个简单,它是以下方程所描述的一条 平滑曲线
:
y2=x3+ax+b,4a3+27b2=0
它描述的并不是一个椭圆,之所以称它为"椭圆曲线方程", 是因为它源自于求椭圆弧长的椭圆积分的反函数。椭圆曲线是无奇点的,即没有尖点,且不会自相交。当 a,b 的值不同时,椭圆曲线会表现出不同的形态:

而当 4a3+27b2=0 时, 它不是椭圆曲线:

从图中可以看到,椭圆曲线总是 沿 x 轴对称
的。这是因为 y2 的存在。特殊地,我们规定 无穷远点
也存在于椭圆曲线上。我们用 0 或符号 O 来表示无穷远点,则椭圆曲线在实数域上的定义如下:
{(x,y)∈R2∣y2=x3+ax+b,4a3+27b2=0}∪{0}
椭圆曲线上的运算
加法运算
假设 P(xp,yp),Q(xq,yq) 是椭圆曲线上的两点,我们来定义椭圆曲线上的二元运算 +
:
1) 如果 P=Q, 且 xp=xq ,则过 P,Q 的直线会与椭圆曲线相交于第三点, 记作 R1,R1 , 沿 x 轴的对称点记做 R, 定义 P+Q=R . 同时可定义 取椭圆曲线上沿 x 轴对称的点的操作为 -
.即 R1=−R. 可知P+Q−R=0。
2) 如果 P=Q ,且 yp=−yq (即 P,Q 沿 x 轴对称,过P,Q 的直线垂直于 x 轴), 则此时 P+Q=0
3) 如果 P=Q, 过 P 做椭圆曲线的切线,切线与椭圆曲线的另一个交点记作R1, 令 R=−R1, 则 P+Q=P+P=2P=R

+ 运算的代数表示:
设椭圆曲线上点的集合为 E={(x,y)∣y2=x3+ax+b,4a3+27b2=0)}∪{0} ,且 P(xP,yP),Q(xQ,yQ)∈E , P=0,Q=0 , 有
- 若 yP= −yQ, 则 R=P+Q:
xRyR=m2−xP−yP=yP+m(xR−xP)
,
m={xP−xQyP−yQ2yP3xP2+aif xP=xQif P=Q
- 若 yP=−yQ, R=P+Q=0
+ 运算定义了椭圆曲线上的以 0 为单位元的 群
。
标量乘法
在前面我们定义了椭圆曲线上的加法,其中有 P+P=2P , 同样地,我们定义椭圆曲线上的标量乘法:
若 P 是椭圆曲线上的点,n 是正整数,则
nP=n个P+P+⋯+P
根据定义计算 nP 的过程如下:
2P3PnP=P+P=2P+P⋮=(n−1)P+P
共需要计算 n−1 次。这个算法的时间复杂度为O(n) 下面来探讨一些更快捷的方法。
例如计算 100P ,过程可以如下:
2P4P8P16P20P40P80P100P=P+P =2P+2P =4P+4P=8P+8P=16P+4P=20P+20P=40P+40P=80P+20P
这样 8 次即可算出 100P, 比前面的算法要简单。
过程还可以如下:
100=11001002=1⋅26+1⋅ 25+0⋅24+0⋅23 +1 ⋅22+0 ⋅21+0 ⋅20
则:
20P21P22P23P24P25P26P那么: 96P100P=P=20P+20P=21P+21P=22P+22P=23P+23P=24P+24P=25P+25P=26P+25P=96P+22P
这个算法中,求 2xP的时间复杂度为O(1), 所以整个的时间复杂度为 O(log2n) (或者为O(k),k 为 n 的二进制位数)。
有限域上的椭圆曲线
前面讨论的是椭圆曲线方程在实数域上的情况。接下来讨论椭圆曲线方程在质数有限域上的情况。 椭圆曲线在质数 p 的有限域 Fp 上的点的集合为:
{(x,y)∈(Fp)2 ∣y2≡x3+ax+b(modp),4a3+27b2≡0(modp),a∈Fp,b∈Fp}∪{0}
此时的方程描述的不再是一条平滑曲线,而是 n 个离散点的集合。下图为椭圆曲线 y2≡x3+x+1(modp),p={11,29,61,101} 的图像:

由图不难看出,这些点是关于 P/2 对称的。
GFp 上的运算
前面我们定义了实数域上椭圆曲线两个点进行 + 运算的几何意义,这个意义在有限域内依然是成立的。不同的是,这里的 “直线” 发生了变化, 它同样需要 (modp) 操作。 我们定义有限域上椭圆曲线两点相加的意义,
若 P(px,py),Q(qx,qy) 有限域 GFp 上椭圆曲线的两点:
- 若 px=qx, 可以过两点 P,Q 做直线,它将与椭圆曲线相交于第三点 R1,R1 沿直线 p/2 对称的点称为 R, 则 R=−R1=P+Q
- 若 px=qx,py!=qy , 则 P+Q=0
- 若 px=qx, py=qy, 这里我们无法给点做切线,暂且认为这个操作在几何上是无意义的。但它在代数上是可以计算的。
例如,当 p=29 时,点 P(0,1),Q(1,7) 在椭圆曲线 y2≡x3 +x+1(modp) 上。此时 R=P+Q 如下所示:

GFp 上的代数运算
有限域 GFp上的代码运算和前面所讨论的实数域上的运算差不多,只不过多了 (modp) 运算。假设有限域上的椭圆曲线两点 P(xP,yP),Q(xQ,yQ),R(xR,yR)=P+Q,
- 若 yP=−yQ,
xRyR=m2−xP−yP(modp)=yP+m(xR−xP)(modp)
,
m={ xP−xQyP−yQ(modp) 2yP3xP2+a(modp)xP=xQ xP=xQ
2. 若 yP=−yQ, R=P+Q=0
注意这里的 x−1(modp) 是对 x 求模逆运算。
椭圆曲线的一些其它概念
在有限域内的椭圆曲线上具有有限个点,这些点构成一个有限交换群 S,点的个数称为群的 序(order)
,一般用 n 表示。计算群的序可以使用 “Schoof 算法” https://en.wikipedia.org/wiki/Schoof’s_algorithm
以 S 上的一个点 G 进行重复的加法运算, 能够生成一个子群 S′ . 群S′ 可能与群 S 相同, 也有可能是其真子群。群 mathbbS 与 群 S′ 的比值称为 协因子
或 余因子(confactor)
,一般用 h 表示, h=∣S′∣∣S∣ . 一般令 h=1, 此时群的阶最大,可用的点最多。G 称为这个群的 生成元
椭圆曲线密码学中的离散对数问题
有限域 GFp 上的椭圆曲线 E 中的一点 P, 令 R =kP,k<p .
已知 k,P, 计算R是很容易的,反过来已知P,Q, 求 k 是困难的。目前已知的求 k的有效算法的复杂度为 O(p)
这就是椭圆曲线上的离散对数问题。故可以将 Q 作为公钥,k 作为私钥。