椭圆曲线——从仿射坐标到雅可比坐标的转换

Posted yyDrifter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了椭圆曲线——从仿射坐标到雅可比坐标的转换相关的知识,希望对你有一定的参考价值。

2021SC@SDUSC

libsecp256k1比特币密码算法开源库(四)中定义了有限域下椭圆曲线的相关运算,在那一篇中对于椭圆曲线几何加法运算的过程有了非常详细的说明。但是在那一篇中,对与不同的两点P和Q,计算其几何加法结果R必须要经过非常重要的一步,即求斜率m:
m = y P − y Q x P − x Q   m o d   p = ( y P − y Q ) ( x P − x Q ) − 1 m o d   p m=\\frac{y_P-y_Q}{x_P-x_Q} \\,mod\\,p=(y_P-y_Q)(x_P-x_Q)^{-1} mod\\,p m=xPxQyPyQmodp=(yPyQ)(xPxQ)1modp在这一步中不可避免地要求一个乘法逆元,即 ( x P − x Q ) − 1 (x_P-x_Q)^{-1} (xPxQ)1。计算乘法逆元可以使用扩展欧几里得算法,这个开销或许不是很大,但这里的 x P x_P xP x Q x_Q xQ都是非常大的数(BigInt),用扩展欧几里得算法计算相应的乘法逆元是非常困难的。除此之外,计算椭圆曲线的标量乘法也有非常关键的一步,也就是计算最开始两个相同数的几何加法,其中也要计算斜率m:
m = 3 x P 2 + a 2 y P   m o d   p = ( 3 x P 2 + a ) ( 2 y P ) − 1   m o d   p m =\\frac {3 x_P^2 + a} { 2 y_P }\\, mod\\,p=(3 x_P^2 + a)(2 y_P)^{-1}\\, mod\\,p m=2yP3xP2+amodp=(3xP2+a)(2yP)1modp在这一步中还是不可避免地要求乘法逆元 ( 2 y P ) − 1 (2 y_P)^{-1} (2yP)1

除此之外,在介绍椭圆曲线群中的元素中,除了那些满足椭圆曲线方程具有横纵坐标的点之外,我还提到一个“无穷远点”。这个无穷远点从何而来,本文将会进行解答。

那么在实际算法实现过程中,避开扩展欧几里得算法,以求更加快速高效地求大数的乘法逆元是很重要的一个问题。实际上,在椭圆曲线上点的表示有两种形式:仿射坐标Affine表示和射影坐标Projection表示,通过将椭圆曲线上的点坐标从仿射坐标转换到射影坐标中,就可以巧妙地避开扩展欧几里得算法。下面开始:

Affine 仿射坐标

虽然这里给仿射坐标放了一个title,但其实这里已经没有必要给仿射坐标讲太多东西了。之前几篇讲的椭圆曲线的方程表示和坐标运算其实都是基于仿射坐标的。也就是说,椭圆曲线的仿射方程就是 y 2 = x 3 + a x + b y^2=x^3+ax+b y2x3axb,在有限域中,这个方程也就表达为 y 2 = ( x 3 + a x + b )   m o d   p y^2=(x^3+ax+b)\\,mod\\,p y2(x3axb)modp。也就是说,在仿射坐标下才存在要使用扩展欧几里得算法求解乘法逆元的问题。

Projection射影坐标

射影坐标分为:标准射影坐标、Jacobian加重射影坐标、Chudnovsky射影坐标。在椭圆曲线中使用的是Jacobian加重射影坐标,Chudnovsky射影坐标和这里的椭圆曲线没什么关系,所以不讲它。为了说明白Jacobian加重射影坐标,先从最基本的标准射影坐标开始。

标准射影坐标

在仿射坐标中,我们有椭圆曲线方程: y 2 = x 3 + a x + b y^2=x^3+ax+b y2x3axb,对应点的坐标就是 ( x , y ) (x,y) (x,y),射影坐标是三维的,一个点的坐标表示为 ( x , y , z ) (x,y,z) (x,y,z)。这里我们规定:
在标准射影坐标中,点 ( x , y , z ) (x,y,z) (x,y,z)对应仿射坐标中的点 ( x z , y z ) (\\frac xz,\\frac yz) (zx,zy)
同理有,在仿射坐标中的点 ( x , y ) (x,y) (x,y)对应标准射影坐标中的点 ( x , y , 1 ) (x,y,1) (x,y,1)

有了这样的一个对应关系,我们令椭圆曲线方程 y 2 = x 3 + a x + b   y^2=x^3+ax+b\\, y2x3axb   x = x z   \\,x=\\frac xz\\, x=zx   y = y z   \\,y=\\frac yz\\, y=zy就得到了标准射影坐标中的椭圆曲线方程: y 2 z = x 3 + a x z 2 + b z 3   y^2z=x^3+axz^2+bz^3\\, y2zx3axz2bz3可以看到,由于点 ( x , y , z ) (x,y,z) (x,y,z)对应仿射坐标中的点 ( x z , y z ) (\\frac xz,\\frac yz) (zx,zy),这就使得z不能为0,如果z为零,在射影坐标中的点 ( 0 , y , 0 ) (0,y,0) (0,y,0)就找不到一个对应的仿射坐标值。但实际上椭圆曲线的点还是以射影坐标为准,也就是说就是有这样一个点 ( 0 , y , 0 ) (0,y,0) (0,y,0),于是在仿射坐标中称这个点为“无穷远点”,也就是在射影坐标中这个z=0的点。

有了上面的从仿射坐标到标准射影坐标的映射关系,可以定义在标准射影坐标下的几何加法运算。令P和Q为不相等的两点, P ( x 1 , y 1 , z 1 ) P(x_1,y_1,z_1) P(x1,y1,z1) Q ( x 2 , y 2 , z 2 ) Q(x_2,y_2,z_2) Q(x2,y2,z2),令 R ( x 3 , y 3 , z 3 ) R(x_3,y_3,z_3) R(x3,y3,z3),且R=P+Q(几何加法运算),标准射影坐标下的几何加法运算过程如下: λ 1 = x 1 z 2 λ 2 = x 2 z 1 λ 3 = λ 1 − λ 2 λ 4 = y 1 z 2 λ 5 = y 2 z 1 λ 6 = λ 4 − λ 5 λ 7 = λ 1

以上是关于椭圆曲线——从仿射坐标到雅可比坐标的转换的主要内容,如果未能解决你的问题,请参考以下文章

详解OpenCV的椭圆曲线点坐标近似计算函数ellipse2Poly()

编出个区块链:实现区块链的椭圆曲线签名和认证

极坐标解圆锥曲线三角形面积范围问题

ECC椭圆曲线加密

sCrypt 合约中的椭圆曲线算法:第一部分

sCrypt 合约中的椭圆曲线算法:第一部分