原文链接:https://andrea.corbellini.name/2015/05/23/elliptic-curve-cryptography-finite-fields-and-discrete-logarithms/
这篇文章是ECC系列的第二篇。
在前一篇文章中,我们已经看到了如何基于实数域上的椭圆曲线来定义一个群。具体如下,我们定义了点的加法规则:给定三个共线的点,它们的和是零(P+Q+R=0)然后推导出计算机中点的加法的一个几何方法和一个代数方法(几何加法和代数加法)。
接着我们介绍了标量乘法(
现在我们将椭圆曲线限制在有限域内,而不是实数域,看看情况如何变化。
模p的整数域(The field of integers modulo p)
一个有限域,首先是一个包含有限个元素的集合。有限域的一个例子是模p的整数集,其中p是素数。它通常表示为
在域中,我们有两种二元运算:加法(+)和乘法(·)。它们都具有封闭性,结合律和交换律。对于这两种运算,每个元素都存在一个唯一的单位元,并且每个元素都存在一个唯一的逆元。最后,乘法是对加法的分配:
整数模p的集合由整数0到p-1组成。加法和乘法在运算(也称为“时钟运算”)中工作。这里有一些
- 加法:(18+9)mod23=4
- 减法:(7-14)mod23=16
- 乘法:4·7mod23=5
- 加法逆元:-5mod23=18 实际:(5+(-5))mod23=(5+18)mod23=0
- 乘法逆元:9-1mod23=18 实际:9·9-1mod23=9·18mod23=1
如果这些方程看起来不熟悉,你需要一个模块化的运算入门,看看 Khan Academy。
正如我们已经说过的,模p的整数集是一个域,因此上面列出的所有属性都成立。注意,p是素数的要求是很重要的!(p=4)对4取模的整数集不是一个域:2没有乘法逆元(如:等式2·xmod4=1没有结果)
模p除法(Division modulo p)
我们将定义在
用扩展的欧几里德算法(extended Euclidean algorithm)可以“轻松”计算乘法逆元,其中,最坏的情况下时间复杂度为
我们不讨论扩展的欧几里得算法的细节,因为它离题了,但是这里有一个有效的的Python实现:
1 def extended_euclidean_algorithm(a, b):
2 """
3 Returns a three-tuple (gcd, x, y) such that
4 a * x + b * y == gcd, where gcd is the greatest
5 common divisor of a and b.
6
7 This function implements the extended Euclidean
8 algorithm and runs in O(log b) in the worst case.
9 """
10 s, old_s = 0, 1
11 t, old_t = 1, 0
12 r, old_r = b, a
13
14 while r != 0:
15 quotient = old_r // r
16 old_r, r = r, old_r - quotient * r
17 old_s, s = s, old_s - quotient * s
18 old_t, t = t, old_t - quotient * t
19
20 return old_r, old_s, old_t
21
22
23 def inverse_of(n, p):
24 """
25 Returns the multiplicative inverse of
26 n modulo p.
27
28 This function returns an integer m such that
29 (n * m) % p == 1.
30 """
31 gcd, x, y = extended_euclidean_algorithm(n, p)
32 assert (n * x + p * y) % p == gcd
33
34 if gcd != 1:
35 # Either n is 0, or p is not a prime number.
36 raise ValueError(
37 '{} has no multiplicative inverse '
38 'modulo {}'.format(n, p))
39 else:
40