原文:Elliptic Curve Cryptography: finite fields and discrete logarithmsandrea.corbellini.name
译者注
本文承接上文所讨论的椭圆曲线,主要区别在于将曲线的定义域从实数域缩小到了有限域。
作者首先介绍了有限域的数学定义,并介绍了一种基于模运算的有限域。
作者介绍了如何在上的椭圆曲线上的点集上建立一个群,即如何计算点加法和乘法。
作者介绍了群的阶数的概念,介绍了计算椭圆曲线上的群的阶数的算法,并讨论群和子群的阶数的联系。
作者展示了如何用椭圆曲线上的任意一点,通过计算点的倍数的方法,构造一个循环子群。
作者介绍了一种算法,可以在椭圆曲线上找到一个基点,并通过该基点生成一个阶数为大质数的循环子群。
前文我们介绍了如何在实数域上的椭圆曲线中定义一个群。现在,我们将把椭圆曲线限制在有限域,而不是实数集,看看情况如何变化。
模p的整数域(The field of integers modulo p)
有限域,顾名思义,首先必须是一个包含有限数量元素的集合。有限域的一个例子是模p的整数集,其中p是素数。它通常表示为
在域中,我们需要定义两个二元运算:加法
加法单位元没有对应的乘法逆元
最后,有限域还满足分配律:
注意:实际上域(field)的数学严格定义与上面描述的稍有不同,但是这并不影响我们后续的讨论,有兴趣的读者可以参考这篇文章
有限域的一个实例就是模质数
- 加法:
- 减法(加逆元):
- 乘法:
- 加法逆元:
并且有: - 乘法逆元:
并且有:
如果这些方程式看起来很陌生,那么你可能需要阅读关于模运算的介绍 Khan Academy.
请注意,这里的
模p除法(Division modulo p)
我们马上就要完成对
利用扩展欧几里德算法可以“轻松”地计算乘法逆元,在最坏的情况下,算法的时间复杂度是
本文不讨论扩展欧几里德算法的细节,因为它已经脱离了主题,但是这里提供了一个有效的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
我们现在已经可以把椭圆曲线的定义到
现在转变为:
这里的0依代表无穷远处的点,a和b是
换句话说,我们完成了从实数域上的连续曲线转变为xy平面上的不相交点的集合的过程。但是可以证明的是,即使限制了我们的定义域,
点加法(Point addition)
我们依旧保留前一篇文章中的点对齐(aligned,即共线)概念。在实数域中,三个对齐的点
我们将扩展一下三点对齐,也就是三点共线的概念。现在
上图展示了如何在曲线
有了新的对齐后,我们就有了计算点加法的方法,这样定义的点加法还需要满足群的几个性质:
-
(根据单位元的定义).
- 给定非零点
,的逆元是横坐标相同但纵坐标相反的点。或者说。例如,如果中的曲线有一个点,则逆元是。
- 此外,
(根据逆元的定义)。
代数和(Algebraic sum)
除了我们需要在每个表达式的末尾添加“
如果
如果
在实数域上计算代数和的公式和 在
区别于实数域上的讨论,我们不再尝试定义一个计算
作者提供了为计算点加法而编写的交互式工具。
椭圆曲线群的阶(The order of an elliptic curve group)
在有限域上定义的椭圆曲线包含的点的数量是有限的。那么一个重要问题是:到底有几个点?
首先,我们给出一个定义:一个群中的元素数量称为这个群的阶(order)。
一个简单的想法就是,我们尝试把0到p-1的所有整数x代入方程,然后对于每个x都找到所有满足方程的解,这样我们就找到了曲线上所有的点。但是这样的算时间复杂度为
幸运的是,有一个更快的计算阶的算法:Schoof's algorithm。本文不讨论算法的细节——重要的是它能在多项式时间内运行完毕。
标量乘法和循环子群(Scalar multiplication and cyclic subgroups)
与实数一样,乘法可以定义为:
我们称nP这样的结果为P的倍数。同样,我们可以用到上一篇中提到的算法进行优化。作者也提供了一个标量乘法的交互式工具。
-
-
-
-
-
-
-
-
-
-
- ...
在这里,我们可以立即发现:P的倍数只有5个点,椭圆曲线的其他点从未出现过。其次,它们是循环重复的。我们可以写作:
这五个方程可以被“压缩”成一个方程:
不仅如此,我们还可以立即验证这五个点是否在加法下闭合。这意味着:无论对这五个点进行多少次相加,结果总是这五点之一。同样,椭圆曲线的其他点永远不会出现在结果中。
对任意一点都有相同的结论,不仅仅是
上式描述了一个简单的事实:如果我们把两个P的倍数相加,结果将是另一个P的倍数。换句话说,P的倍数在点加法下是封闭的。这就可以推导出一个重要的结论:
取椭圆曲线上任意一点P,所有P的倍数构成的集合是”定义在
“子群”首先是一个群,并且它的所有元素是另一个群的非空子集。“循环子群”是元素循环重复的子群,循环群中的每个元素都可以写成是一个基本元素的倍数,就像我们在前面的例子中展示的那样。我们把点P这样的基本元素称为循环子组的生成器或基点。
循环子群是ECC和其他密码系统的基础。我们将在下一篇文章中讨论详细的原因。
子群的阶(Subgroup order)
点
- 我们已经将阶定义为一个群的元素数量。这个定义仍然有效,但是在循环子组中,我们可以给出一个新的等价定义: 子群P的阶是使得
的最小的正整数。
- 子群P的阶可以通过拉格朗日定理与椭圆曲线群的阶相联系,拉格朗日定理指出子群的阶是父群阶的除数。换句话说,如果椭圆曲线包含
个点,并且它的一个子群包含点,那么是的的除数。
这两个信息组合在一起就给我们提供了一种找出一个基点为
- 使用Schoof算法计算椭圆曲线群的阶数
;
- 找到
的所有除数;
- 对每个
的除数,计算;
- 使
成立的最小就是子群P的阶。
此时我们考虑一种特殊情况:假设一个椭圆曲线群的阶数
- 子群的阶是1,此时的子群只包含一个点0;
- 子群的阶是N,此时的子群包含椭圆曲线上的所有点
找到基点(Finding a base point)
对于我们的ECC算法,我们需要的是高阶的子群。所以一般来说,我们会选择一条椭圆曲线,计算它的阶数
首先,我们要再引入一个术语:余因子(cofactor)。通过前文提到的拉格朗日定理推导出群与子群的阶的关系
我们还有一个结论:对椭圆曲线上任意一点
现在假设
有鉴于此,我们的算法概述如下:
- 计算椭圆曲线的阶数
- 选择子群的阶数
。为了使算法有效,这个数字必须是质数,并且必须是的除数。
- 计算余因子
- 选择椭圆曲线上的一个随机点
- 计算
- 若
, 就回到步骤4, 否则,我们就找到了一个子群的基点,阶数为和余因子为
请注意,此算法仅在
对数问题(Discrete logarithm)
正如我们在处理实数域上的椭圆曲线时所做的那样,我们现在将在
这个问题被称为椭圆曲线的离散对数问题,它被认为是一个“难”的问题,因为没有已知的多项式时间算法可以在经典架构的计算机上求解这个问题。一个微妙的事实是,并没有一个严格的数学证明可以确认离散对数问题没有多项式时间算法(感兴趣的同学可以搜索一下NP完全问题)。
椭圆曲线上的离散对数问题也可以类比其他密码系统使用的离散对数问题,例如数字签名算法( DSA )、Diffie-Hellman密钥交换( D-H )和ElGamal算法。不同之处在于,对于这些算法,我们使用模幂运算而不是标量乘法。它们的离散对数问题可以表述如下:已知
这两个问题都是“离散的”,因为它们涉及有限域(更准确地说是循环子群)。它们是“对数”问题,因为它们涉及的运算类似于算术意义上的求对数
ECC的有趣之处在于,与基于模幂的密码学中使用的其他类似问题相比,到今天为止,椭圆曲线的离散对数问题似乎更加“困难”。这意味着,我们可以用更小的整数
下一篇文章将是这个系列的第三篇,关于ECC算法:密钥对生成、ECDH和ECDSA。这将是这个系列中最有趣的部分之一。不要错过它!