椭圆曲线算法:简单介绍
椭圆曲线
首先:什么是椭圆曲线,Wolfram MathWorld提供了出色而完整的定义。但是对于我们的目标,椭圆曲线将简单表示为方程式所描述的点集:y^2=x^3+ax+b
其中4a^3+27b^2!=0
需要排除特殊曲线。上面的等式是椭圆曲线的Weierstrass范式。
下图为奇异的椭圆曲线:
奇异点的类型:左侧是具有尖点的曲线,y^2=x^3
右侧是具有自相交的曲线,y^2=x^3-3x+2
这两个曲线都不是有效的椭圆曲线。
根据不同的a
与b
的值,椭圆曲线在平面上可能具有不同的形状。可以很容易看到和验证的是,椭圆曲线是关于x
轴对称的。
为了我们的目标,我们还需要一个无穷大的点(也称为理想点)作为曲线的一部分。 从现在开始,我们将用符号0(零)表示无穷大点。
如果我们要明确考虑无穷大点,可以按如下方式改进椭圆曲线的定义:
群
数学上的群是一个集合,我们为其定义了一个二进制运算,我们称之为“加法”,并用符号+表示。 为了使集合G成为一个群,必须定义添加项,以便它遵守以下四个属性:
- 闭环: 如果
a
和b
为G中的成员,那么a+b
也是G中的成员. - 关联:
(a+b)+c=a+(b+c)
. - 存在一个标识元素0使得
a+0=0+a=a
. - 每个元素都有其相反数,例如对于任意的数
a
都存在b
使得a+b=0
.
如果我们添加第五个要求:
可交换性:a+b=b+a
那么符合以上属性的群可以称为阿贝尔群。
按照通常的加法概念,整数集Z也是一个群(也是一个阿贝尔群),但是,自然数的集合N不是一个群,因为无法满足第四个属性.
群具有很好的属性,因为,如果我们可以证明这四个属性成立,那么我们可以免费获得其他一些属性。 例如:标识元素是唯一的; 相反数也唯一,即:对于每个数a
,仅存在一个这样的b
使得a+b=0
(并且我们可以写成b=-a
)。 无论是直接还是间接,关于群的这些属性和其他属性对我们以后都将非常重要。
椭圆曲线的群属性
我们可以在椭圆曲线上定义一个群。 尤其:
- 该群的元素是椭圆曲线的点
- 标识元素是无穷大的点0
- 椭圆曲线上任意一点
P
的倒数是关于x
轴对称的点 - 通过以下规则给出加法:给定同一条直线上三个的非零点
P,Q,R
,他们的和P+Q+R=0
.
注意,关于最后一条规则,我们只需要三个点在同一条直线上,并且三个点不考虑顺序。这意味着,如果P,Q,R
三点在同一条直线上,那么总有P+(Q+R)=Q+(P+R)=R+(P+Q)=...=0
这样,我们直观地证明了+
运算符既具有关联性又具有可交换性:这些点属于阿贝尔群。但是,我们实际上如何计算两个任意点的和?
几何加法
由于这些点在阿贝尔群中,我们可以写为P+Q+R=0或者P+Q=-R
,通过这种形式的方程,我们可以导出一种几何方法来计算两个点P
和Q
之间的和。如果我们画一条穿过点P
和点Q
的线,该线将和椭圆曲线相交于第三点R
(表明了P,Q,R三点在穿过椭圆曲线的同一条直线上。
),如果我们找出点R
的相反数-R
,我们则找到了P+Q
相加的结果。
画一条线穿过P
和Q
,该线则与椭圆曲线相交于第三点R
,与R
对称的点-R
即为P+Q
的结果。
这种几何方法有效,但需要改进。 并且,我们需要回答一些问题:
-
如果
P=0
或者Q=0
呢?当然,如果这样的话将不能画任何线(因为0不在坐标轴上)。但是鉴于我们已将0定义为标识元素,即对于任意的P
或者Q
,都有P=0=P,0+Q=Q
. -
如果
P=-Q
呢?在这种情况下,穿过两点的线是垂直的,并且不与任何第三点相交。 但是,如果P
是Q
的相反数,则我们有相反数的定义P+Q=P+(-P)=0
。 -
如果
P=Q
呢?在这种情况下,有无限多的线穿过该点。 在这里,事情开始变得更加复杂。 但考虑一点Q'!=P
。如果我们将Q'
不断靠近P
会怎样?
当两个点变得更靠近时,通过它们的线与曲线相切.
如果Q'
趋于P
,穿过点P
和Q'
的线变得与曲线相切。那么,我们可以说P+P=-R
,这里的R
为过点P
的与曲线相切的线与曲线相交的点。 -
如果
P!=Q
并且没有与曲线相交的第三点呢?在这种情况下,与上一种情况非常相似。 实际上,在这种情况下,直线穿过P
与Q
并与曲线相切。
如果我们的线仅与曲线相交两个点,则意味着它与曲线相切。 很容易看到总和的结果如何对称于两点之一。假设点P
是切点。 在前一种情况下,我们可以写为P+P=-Q
。 这个等式现在变成了P+Q=-P
。 另一方面,如果点Q
是相切点,则正确的方程式应为P+Q=-Q
。
几何加法现已完成,考虑了所有情况。我们可以执行涉及任何椭圆曲线每个点的加法操作。 如果要尝试,可以通过这里在线测试.
代数加法
如果要计算机执行点加法,则需要将几何方法转换为代数方法。 将上述规则转换为一组方程似乎很简单,但实际上这可能非常乏味,因为它需要求解三次方程。 因此,在这里仅报告结果。
首先,让我们摆脱最烦人的极端情况。
Pending......
标量乘法
与加法不同,我们可以定义另一组操作,标量乘法:
这里的n
是自然数,如上述式子,看起来计算nP
需要n
次加法。如果n
具有k
个二进制数字,则算法复杂度为O(2^k)
,这并不是很好,因此需要更快的算法。
其中一种为倍乘算法,比如n=151
,可以用二进制表示为10010111
,该二进制用加法可以表示为:
(我们取了n
的每个二进制数并乘以2的幂)
可以化简为:
用倍乘算法我们可以描述为:
- 获取
P
- 倍乘
P
,可以获得2P
- 将
P
与2P
相加,为了得到2^1*P + 2^0*P
- 倍乘
2P
,可以获得2^2*P
- 再次相加,得到
2^2*P+2^1*P + 2^0*P
- ...
最后,通过7次倍乘和4次加法我们可以得到151P
。
如果倍乘和加法都是复杂度为O(1)
的运算,那么这个算法复杂度就是O(log_n)
(或者O(k)
如果我们考虑位长),这是相当不错的。 当然比初始算法要好得多!
对数
给出n
和P
,我们现在至少有一个多项式时间算法可用于计算Q=nP
.但是反过来呢?如果我们知道Q
和P
是否可以计算出n
?,该问题称为对数问题.为了与其他密码系统保持一致,我们称其为“对数”而不是“除法"(在这里不是乘法,而是取幂)。
我不知道有任何针对对数问题的“简单”算法,但是通过乘法运算很容易看到一些模式。例如,给予曲线y^2=x^3-3x+1
和点P=(0,1)
,我们可以立即验证,如果n
是奇数,则nP
在左半平面的曲线上;如果n
为偶数,则nP
在右半平面曲线上,如果我们进行更多的实验,我们可能会发现更多的模式,这些模式最终可能导致我们编写一种算法来有效地计算该曲线上的对数。
但是对数问题有一个变体:离散对数问题。 如我们在下一篇文章中将看到的,如果我们减小椭圆曲线的域,则标量乘法仍然“容易”,而离散对数则成为“困难”的问题。 这种对偶性是椭圆曲线密码学的关键。
参考这里