椭圆曲线上的加法
免责声明:这对椭圆曲线这一丰富话题没有任何根据。它简化了很多。由于椭圆曲线最近在加密方面引起了媒体的广泛关注,我想提供一些小见识,以了解如何在椭圆曲线上进行“计算”实际上是如何工作的。
介绍
椭圆曲线是(x,y)
表单平面中的点集y^2 = x^3+Ax+B
。(此外,4A^3+27B^2 ≠ 0
为了避免令人讨厌的奇异性。)您可以在任何字段中考虑这些曲线。如果使用实数字段,则曲线可以可视化,看起来像这样:
这些曲线的特殊之处在于它们具有内置的算术运算,类似于加法运算。您可以添加和减去点,并且此操作既是关联的又是交换的(阿贝尔群)。
加法如何工作?
注意:在椭圆曲线上添加点并不直观。之所以定义这种加法,是因为它具有某些不错的属性。很奇怪,但是行得通。
当椭圆曲线形成一个组时,存在一个等于0 的加法标识。也就是说,添加0
到任何点都不会改变结果。此加性标识是无穷大的“点”。平面上的所有线都在无穷远处包含此点,因此添加它没有区别。
假设任何给定的线在三个点处可能与曲线相交0
,而这三个点的总和为0
。牢记这一点,请看一下这张图片。
现在,自然的问题是,什么是P+Q
?好吧,如果是P+Q+R = 0
,那么P+Q = -R
(或者写成R'
)。哪里-R
呢 它是其中R + (-R) = 0
,这是在x轴的另一侧,从R
使得通过它们的行是垂直的,只有相交R
,-R
以及0
。您可以在此图像的第一部分看到这一点:
您可以在这些图像中看到的另一件事是,一个点与自身的总和意味着该线与曲线相切。
如何找到直线和椭圆曲线的交点
在两个不同点的情况下
通常,只有一条直线穿过两点P=(x0,y0), Q=(x1,y1)
。假设它不是垂直的并且两个点是不同的,我们可以将其写为y = m*x+q
。当我们想找到与椭圆曲线的交点时,我们可以写成
0 = x^3+Ax+B-y^2 = x^3+Ax+B-(m*x+q)^2
这是三次多项式。这些通常不那么容易求解,但是我们已经知道该多项式的两个零:我们要相加的两个点的两个x
坐标x0, x1
!
这样,我们就可以分解出线性因子(x-x0)
,(x-x1)
并且剩下第三个线性因子,其根是x
点的-坐标R
。(-R
。因为太多的对称性,请注意,如果R = (x2,y2)
随后-R = (x2,-y2)
的。-
从该组;它不是一个矢量负)。
如果P
自己加一点
在这种情况下,我们必须计算处的曲线的切线P=(x0,y0)
。我们可以直接写入m
,并q
在以下方面A,B,x0,y0
:
3*x0^2 + A
m = ------------
2*y0
-x0^3 + A*x0 + 2*B
q = --------------------
2*y0
我们得到了等式,y = m*x+q
并且可以按照与上段相同的方式进行。
完整的案例树
这是如何处理所有这些情况的完整列表:
令P,Q
为椭圆曲线上的点(包括“无穷大”点0
)
- 如果
P = 0
或Q = 0
,则分别为P+Q = Q
或P+Q = P
- 否则
P ≠ 0
和Q ≠ 0
,让我们P = (x0,y0)
和Q = (x1,y1)
:- 如果
P = -Q
(表示x0 = x1
和y0 = -y1
)则P+Q = 0
- 其他
P ≠ -Q
- 如果
x0 = x1
有P=Q
,我们就可以计算出切线(见上文)R
。然后P+Q = P+P = 2P = -R
- 否则:我们可以
y = m*x+y
通过这两点构造一个形式的线(请参见上文)以进行计算R
。然后P+Q=-R
- 如果
- 如果
有限域
对于这个挑战,我们将只考虑大小的领域p
,其中p
为素数(因为一些细节p ≠ 2, p ≠ 3
)。这样的好处是您可以简单地进行计算mod p
。其他领域的算法要复杂得多。
在本示例中,我们设置了此示例p = 5
,此处的所有等式都是等价的mod 5
。
2+4 ≡ 6 ≡ 1
2-4 ≡ -2 ≡ 3
2*4 ≡ 8 ≡ 3
2/4 ≡ 2*4 ≡ 3 because 4*4 ≡ 16 ≡ 1, therefore 1/4 ≡ 4
挑战
给定A,B
椭圆曲线的参数,素场特性p
和P,Q
椭圆曲线上的两个点,将其求和。
- 您可以假设参数
A,B
实际上描述了一条椭圆曲线,这意味着4A^3+27B^2 ≠ 0
。 - 您可以假定
P,Q
实际上是椭圆曲线或0
-point上的点。 - 您可以假设
p ≠ 2,3
是素数。
测试用例
我在MATLAB / Octave中实现了一个(不是很好)的实现,可以将其用于自己的测试用例:ideone.com,我希望它是正确的。它至少重现了我手工进行的一些计算。
请注意我们在这里考虑的适用于所有曲线的琐碎测试用例:
加零:P+0 = P
加逆:(x,y) + (x,-y) = 0
对于p = 7, A = 0, B = 5
两个点P = (3,2)
,Q = (6,2)
分别在椭圆曲线上。然后成立:
2*Q = Q+Q = P
2*P = P+P = (5,2)
3*P = P+P+P = (5,2)+P = (6,5)
4*P = P+P+P+P = (5,2)+(5,2) = (6,5)+(5,2) = Q
椭圆曲线上的所有点都是 (3,2),(5,2),(6,2),(3,5),(5,5),(6,5),0
因为p = 13, A = 3, B = 8
我们得到
(1,8)+(9,7) = (2,10)
(2,3)+(12,11) = (9,7)
2*(9,6) = (9,7)
3*(9,6) = 0
对于p = 17, A = 2, B = 2
,P=(5,1)
我们得到
2*P = (6,3)
3*P = (10,6)
4*P = (3,1)
5*P = (9,16)
6*P = (16,13)
7*P = (0,6)
8*P = (13,7)
9*P = (7,6)
10*P = (7,11)
如果您真的有雄心壮志,
p = 1550031797834347859248576414813139942411
A = 1009296542191532464076260367525816293976
x0 = 1317953763239595888465524145589872695690
y0 = 434829348619031278460656303481105428081
x1 = 1247392211317907151303247721489640699240
y1 = 207534858442090452193999571026315995117
并尝试找到一个n
这样的自然数n*(x0,y0) = (x1,y1)
。此处有更多信息。
附录
首先,非常感谢@ El'endiaStarman审核和编辑我的草稿!
为什么是椭圆曲线?
好吧,它看起来像某种任意方程式,但事实并非如此,它很笼统:通常我们考虑投影平面中的那些几何“形状” (也就是“无穷大”的来源。在这里,我们考虑所有齐次的三阶多项式(较低或较高阶的多项式太难或难以研究。)在应用了一些限制以获取我们想要的优良性质之后,并对这些多项式进行了均质化(投影到三个仿射平面之一) )我们最终得到像y^2+a*x*y+b*y = x^3+c*x^2+d*x+e
这是长Weierstrass形式的椭圆曲线。这些曲线与我们考虑的基本相同,但有些偏斜。通过线性坐标变换,您可以轻松地生成一个简短的Weierstras方程。example,它仍然包含所有有趣的属性。
我们为什么要排除在外p=2,3
?
这与以下事实有关:对于简短的Weierstrass形式,我们需要限制条件4A^3+27B^2 ≠ 0
以避免奇异性(更多内容见下文)。在特征2 4 = 0
的字段中,在特征3的字段中27 = 0
,对于这些类型的字段,不可能以短的weierstrass形式形成曲线。
什么是奇点?
如果方程式4A^3+27B^2=0
成立,我们将具有如下奇点:如您所见,在这些点上您找不到导数,因此也没有切线,从而“扼杀”了运算。您可能会看方程式y^2 = x^3
或y^2 = x^3-3*x+2
为什么它们仍被称为椭圆曲线?
原因是这种形状的方程会在椭圆积分中弹出,例如,当您要计算椭圆的弧长时,就会得到这些积分。关于名称来源的简短幻灯片。
他们与密码学有什么关系?
有许多方法可以nP = P+P+...+P
非常有效地进行计算。例如,这可用于Diffie Hellman密钥交换中。可以用扭转子组上的加法来代替模块化算法,这些子组只是曲线上具有有限阶的点。(这意味着mP = 0
对于某些m
,基本上只是在计算mod m
)。
y^2 = x^3 + x
是有效的椭圆曲线,并且(0,0) ≠ 0
是曲线上的一个点!)