Hi all,我来翻译第二篇啦。若大家发现那些翻译的不够准确还望指出,不胜感激。首先放上原文链接:
http://andrea.corbellini.name/2015/05/23/elliptic-curve-cryptography-finite-fields-and-discrete-logarithms/andrea.corbellini.name在上一篇文章里,我们已经展示了在实数域上的椭圆曲线在“群”上是如何使用的。尤其是,我们还针对“加”(point addition) 定义了一个规则:对于在一条线上的三个点,他们的和是0(P+Q+R=0). 我们也推出了一个几何方法和代数方法去计算这些点的加法。
然后呢,我们介绍了标量积(scalar multiplication) (nP=P+P+...+P),我们还发现了一个“简单的”算法去计算这些标量积。double and add
首先,有限域是一个带有有限元素的集合。比如,有一个有限域是整数模p的集合(integers mod p,p是素数),可表示为
在这个有限域中,我们有两个二元操作:加(+)和乘( * )。这两种操作都是封闭的,满足结合律和交换律,[这块的封闭应当这样理解:在有限域中,两个数的加和乘的结果仍然在这个有限域中。--译者注] 且含有一个独一无二的单位元,对于所有的有限域里的元素,都有一个独一无二的相反数。最后,乘法还满足分配律:
整数模p的集合包含所有从0到
如果这些式子你觉得不太能理解,那么你可能需要一些关于模运算的入门指导,请参考:Khan Academy.
就如我前面提到的,整数模p是一个域,因此上面列的所有属性都是满足的。请注意p是素数这个条件很重要!比如 整数模4的集合就不是域:2没有乘法逆元(
我们即将定义在
用欧几里得拓展算法来计算乘法逆元非常的“简单易做”,它的时间复杂度是
def
现在,所有的必要元素都已就位,用来在
现在,可以写成:
这里的0仍然是无限远的点,a和b是
图1:曲线
图2:曲线
图1是连续的椭圆曲线在xy轴平面上表现为不相交的点集。在
显然,我们需要改变一点点关于加法的定义,为了使它能更好的工作在
我们可以说,如果一条直线连接了三个点,这三个点就是对齐的。当然,
注释1: 上图的所有点都在
鉴于这已经是一个群,所以点加具备一些通用的属性:
点加的计算和上篇文章中基本差不多,除了要在每个等式后加上“
如果
如果
这个式子长的和在实数域的点加差不多吧,这不是个巧合,事实上,以上的方程式适用于任一域,无论是有限域还是无限域(除了
言归正传,由于在几何方法上有一些问题,所以我们不会定义一个几何方法。比如,在第一篇稿子中,我们说 要计算
我们之前说到每个在有限域上的椭圆曲线都由有限个点组成。那么我们不禁要问:到底是多少个点?
首先,我们要定义一下 在一个群有多少个点就叫做这个群的“阶”(order)【在此放上wiki关于order的解释】。
群举从
还好,有一个更快的算法来计算阶:Schoof算法。在此不展细节,我们只需要知道他的复杂度是多项式时间(大名鼎鼎的Polynomial-Time.在此奉上wiki)
在实数域乘法的定义是:
我们可以用倍加算法(请见上一篇)去做乘法,时间复杂度是
在
到此,我们发现了两个事情:第一,P的倍乘只有5个取值,永远不会出现第6个。第二,他们是循环重复的。我们可以写成这样: (
所以呢,这五个式子可以被“压缩”成一个(模运算):
不仅如此,我们可以立即验证:P的加法是个闭环。(These five points are closed under addition. )这意味着:不论我加的是0, P, 2P, 3P 还是 4P, 结果永远都是这五个点中的一个。Again, 其他点永远不会出现在这根椭圆曲线的结果里。
这个规则同样适用于所有的点,不仅仅是对
这意味着:如果我们将n倍的P进行相加,我们获得的仍然是P的倍数(If we add two multiples of P, we obtain a multiple of P)【由于这个定理太重要了,我把英文也放上来】。(比如,nP的相加是个闭环。)这足够来证明:nP的集合是椭圆曲线形成的群里的一个具有循环性质的子群(the set of the multiples of P is a cyclic subgroup of the group formed by the elliptic curve.)。这里的点
我们可以扪心自问下,由P生成子群的阶到底是什么?(或者,P的阶是什么?)为了回答这个问题,我们不能使用Schoolf的算法,因为这个算法只能在整个的椭圆曲线上生效,在子群上无效。在解决这个问题之前,我们需要打点地基:
以上两条规则结合起来给我们指了一条明路,如何根据基点
举个栗子,在
请注意,很重要的一点是一定一定要是最小的因子,而不是随机的一个因子。如果我们随机处理一下,我们可能取
另一个例子:定义在
在ECC算法中,我们想找到一个阶数比较大的子群。所以通常呢,我们会选择一条椭圆曲线,然后去计算它的阶(
首先,我们要介绍一个术语。拉格朗日定理说,
现在,思考一下对于椭圆曲线中的每一个点,我们有
假设
现在我们总结一下算法:
请注意,上面这个算法仅仅适用于
当有一条连续的椭圆曲线,我们现在要讨论的问题是:如果我们已知
这个问题,就是椭圆曲线中大名鼎鼎的离散对数问题,它被认为是个很难很难的问题!【插一句,这也是ECC的核心的核心,也是为什么ECC安全的原因】。到目前为止,没有找到一个能在多项式时间内解出来的算法。因此,也没有数学证明。
这个难题同样也是其他涉及离散对数问题的加密算法的难题,比如DSA算法,D-H密钥交换算法,ElGamal算法。不同点在于,上述算法使用了模幂算法而不是数乘。模幂算法的离散对数问题可以简述为:当我们知道
这两个问题中,值都是“离散”的,因为他们都取自于有限的集合(循环的子群)。而且都是“对数”,就是普通意义上的对数运算。
ECC有趣的地方在于,到今天为止,它的离散问题看上去比其他密码学中的离散问题难多了。这就说明我们可以用更少的位数的整数
下一篇会介绍:键值对的生成,ECDH和ECDSA算法。
【我已经尽量的还原文章了,其中加了一点点个人见解和wiki的简介。阅读愉快:)--xiaopei】