这篇文章是ECC系列的第二篇
在上一篇文章中,我们看到了基于实数域的的椭圆曲线如何构成了群(Group),我们如下定义了群中的加法:P + Q + R = 0,我们分别用几何方法和代数方法计算了了椭圆曲线点的加法。
随后,我们有介绍了数乘(nP = P + P + P + … + P),然后找到了一个较为快速的计算nP的算法:double and add。
现在,我们要限制我们的椭圆曲线在有限域上(实数域不是有限域),而不是实数域,让我们来看看有哪些变化。
The field of integers modulo p
有限域,首先是一个拥有有限元素的几何。例如,一个简单的有限域就是以素数p为模数的数的集合(模P余数的集合,即模p剩余类环),常被写为Z/p,GF(P),Fp,我们在后文会这么描述一个模P的有限域。
在域中,我们有2种二元运算,加法 和 乘法,两者运算都是封闭的、满足结合律、分配率。两个运算都是唯一的单位元。并且对于每一个元素,都有唯一的逆元。最后,乘法对加法满足分配率:x *( y + z) = x*y + x*z.
整数模p的集合,包括了从0~p-1的数,加法和乘法的运算都是模p的。下面是F23例子。
加法:(18 + 9)mod 23 = 4
减法:(7 - 14) mod 23 = 16
乘法:4 * 7 mod 23 = 5
加法逆元: x + 5 = 0 mod 23 => x= 18
乘法逆元: x *9 = 1 mod 23 => x= 18
(上面两个例子和原文中不一样,个人觉得原文中举例不恰当。
作为加法群,单位元为0,作为乘法群,单位元为1。
乘法逆元使用欧几里得拓展算法可求x,即 9x - 23y = 1,辗转相除即可求得x值x = -5,去其最小正整数则为18。
)
上文已说过,如果p是素数,则模p剩余类环是域。P是素数很重要,如果p不是素数,比如p=4,则集合Zp={0, 1, 2, 3},显然2没有逆元。
(
2*1 mod 4 = 2
2*2 mod 4 = 0
2*3 mod 4 = 2
没有逆元
)
模p作用的除法运算
我们将要定义在Fp上的椭圆曲线,但是在这之前,我们需要弄清几点概念。
x/y代表什么?数论中,x/y表示 x* y^-1,即 x 乘上 y的逆元。所以除法运算分为两步:第一步求逆元,第二步计算乘法。
乘法逆元可以使用欧几里得拓展算法轻松的计算,这里不多讲欧几里得拓展算法的细节,只是贴出Python代码
def extended_euclidean_algorithm(a, b):
“””
Returns a three-tuple (gcd, x, y) such that
a * x + b * y == gcd, where gcd is the greatest
common divisor of a and b.
This function implements the extended Euclidean
algorithm and runs in O(log b) in the worst case.
"""
s, old_s = 0, 1
t, old_t = 1, 0
r, old_r = b, a
while r != 0:
quotient = old_r // r
old_r, r = r, old_r - quotient * r
old_s, s = s, old_s - quotient * s
old_t, t = t, old_t - quotient * t
return old_r, old_s, old_t
def inverse_of(n, p):
“””
Returns the multiplicative inverse of
n modulo p.
This function returns an integer m such that
(n * m) % p == 1.
"""
gcd, x, y = extended_euclidean_algorithm(n, p)
assert (n * x + p * y) % p == gcd
if gcd != 1:
# Either n is 0, or p is not a prime number.
raise ValueError(
'{} has no multiplicative inverse '
'modulo {}'.format(n, p))
else:
return x % p
Fp上的椭圆曲线
现在,我们可以在Fp上来定义椭圆曲线,上篇文章中,椭圆曲线如下描述:
而现在变成了下面的描述:
当然,0依旧表示无限远的点,也即单位元;参数a、b在Fp上
上面四张图,分别是 曲线方程 Y^2≡x^3−7x+10(modp) 参数p取为19,97,127,487的几何图形。(显然,p越小,集合Fp中的元素越少,满足Fp的椭圆曲线的点也越少)
当然,我们也可以证明,在Fp上的椭圆曲线的点,构成阿贝尔群(交换群)。
点加
在实数域,我们定义了三个“aligned”的点相加结果为0,P + Q+ R = 0,当然,该定义在Fp上也适用。实数域上“aligned”就是共线,但是Fp上,我们需要重新定义“aligned”。
Fp上,如果(x, y)满足方程(ax + by+ c ) mod p = 0,则这些(x, y)是共线的.
上图中,是椭圆曲线方程y^2 = X^3 - x + 3 mod 127 的所有点。
点P(16,20), Q(41, 120),则方程y = 4x + 83(mod 127) 和 椭圆曲线方程相交于点P。
当然,点的加法依旧保持了原有的性质:
(1):Q + 0 = 0 + Q = Q
(2):Q及其逆元-Q,实数域上他两关于X轴对称,但是在Fp上,-Q = (Xq, -Yq mod p)
(3):p + (-P) = 0
代数方法计算加法
计算点的等式和上篇文章中基本差不多,唯一的区别就是在等式中加上mod p.