椭圆曲线上的加法
免责声明:这对椭圆曲线这一丰富话题没有任何根据。它简化了很多。由于椭圆曲线最近在加密方面引起了媒体的广泛关注,我想提供一些小见识,以了解如何在椭圆曲线上进行“计算”实际上是如何工作的。
介绍
椭圆曲线是(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是曲线上的一个点!)