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

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 + λ 2 λ 8 = z 1 z 2 λ 9 = λ 3 2 λ 10 = λ 3 λ 9 λ 11 = λ 8 λ 6 2 − λ 7 λ 9 x 3 = λ 3 λ 11 y 3 = λ 6 ( λ 9 λ 1 − λ 11 ) − λ 4 λ 10 z 3 = λ 10 λ 8 \lambda_1=x_1z_2\\\lambda_2=x_2z_1\\\lambda_3=\lambda_1-\lambda_2\\\lambda_4=y_1z_2\\\lambda_5=y_2z_1\\\lambda_6=\lambda_4-\lambda_5\\\lambda_7=\lambda_1+\lambda_2\\\lambda_8=z_1z_2\\\lambda_9=\lambda_3^2\\\lambda_{10}=\lambda_3\lambda_9\\\lambda_{11}=\lambda_8\lambda_6^2-\lambda_7\lambda_9\\x_3=\lambda_3\lambda_{11}\\y_3=\lambda_6(\lambda_9\lambda_1-\lambda_{11})-\lambda_4\lambda_{10}\\z_3=\lambda_{10}\lambda_{8} λ1=x1z2λ2=x2z1λ3=λ1λ2λ4=y1z2λ5=y2z1λ6=λ4λ5λ7=λ1+λ2λ8=z1z2λ9=λ32λ10=λ3λ9λ11=λ8λ62λ7λ9x3=λ3λ11y3=λ6(λ9λ1λ11)λ4λ10z3=λ10λ8最后得到的 x 3 , y 3 , z 3 x_3,y_3,z_3 x3,y3,z3即为得到的R点标准射影坐标。

对于标量乘法中,我们首先需要计算两个相等点P+P,即计算2P,令 P ( x 1 , y 1 , z 1 ) P(x_1,y_1,z_1) P(x1,y1,z1) R ( x 3 , y 3 , z 3 ) R(x_3,y_3,z_3) R(x3,y3,z3),标准射影坐标运算过程如下:
λ 1 = 3 x 1 2 + a z 1 2 λ 2 = 2 y 1 z 1 λ 3 = y 1 2 λ 4 = λ 3 x 1 z 1 λ 5 = λ 2 2 λ 6 = λ 1 2 − 8 λ 4 x 3 = λ 2 λ 6 y 3 = λ 1 ( 4 λ 4 − λ 6 ) − 2 λ 5 λ 3 z 3 = λ 2 λ 5 λ_1 = 3x_1^2 +az^2_1\\λ_2 = 2y_1z_1\\λ_3 = y^2_1\\λ_4 = λ_3x_1z_1\\λ_5 = λ_2^2\\λ_6 = λ^2_1 −8λ_4\\ x_3 = λ_2λ_6\\y_3 = λ_1(4λ_4 −λ_6)−2λ_5λ_3\\z_3 = λ_2λ_5 λ1=3x12+az12λ2=2y1z1λ3=y12λ4=λ3x1z1λ5=λ22λ6=λ128λ4x3=λ2λ6y3=λ1(4λ4λ6)2λ5λ3z3=λ2λ5最后得到的 x 3 , y 3 , z 3 x_3,y_3,z_3 x3,y3,z3即为得到的R点标准射影坐标。

上面的公式对于libsecp256k1开源库其实意义不大,在libsecp256k1开源库中使用的射影坐标是Jacobian加重射影坐标。

Jacobian加重射影坐标

Jacobian加重射影坐标与标准射影坐标方法类似,在Jacobian加重射影坐标中,一个射影点的坐标表示为 ( x , y , z ) (x,y,z) (x,y,z),这里我们规定:
在Jacobian加重射影坐标,点 ( x , y , z ) (x,y,z) (x,y,z)对应仿射坐标中的点 ( x z 2 , y z 3 ) (\frac {x}{z^2},\frac {y}{z^3}) (z2x,z3y)
同理有,在仿射坐标中的点 ( x , y ) (x,y) (x,y)对应Jacobian加重射影坐标中的点 ( 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 2   \,x=\frac {x}{z^2}\, x=z2x   y = y z 3   \,y=\frac {y}{z^3}\, y=z3y就得到了Jacobian加重射影坐标中的椭圆曲线方程: y 2 = x 3 + a x z 4 + b z 6   y^2=x^3+axz^4+bz^6\, y2x3axz4bz6同样可以看到,由于点 ( x , y , z ) (x,y,z) (x,y,z)对应仿射坐标中的点 ( x z 2 , y z 3 ) (\frac {x}{z^2},\frac {y}{z^3}) (z2x,z3y),当z为零,有射影坐标中的点 ( x , y , 0 ) (x,y,0) (x,y,0),该点同样的在仿射坐标中称为“无穷远点”,也就是在射影坐标中这个z=0的点。

有了上面的从仿射坐标到Jacobian加重射影坐标的映射关系,可以定义在Jacobian加重射影坐标下的几何加法运算。令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(几何加法运算),Jacobian加重射影坐标下的几何加法运算过程如下: λ 1 = x 1 z 2 2 λ 2 = x 2 z 1 2 λ 3 = λ 1 − λ 2 λ 4 = y 1 z 2 3 λ 5 = y 2 z 1 3 λ 6 = λ 4 − λ 5 λ 7 = λ 1 + λ 2 λ 8 = λ 4 + λ 5 x 3 = λ 6 2 − λ 7 λ 3 2 λ 9 = λ 7 λ 3 2 − 2 x 3 y 3 = ( λ 9 λ 6 − λ 8 λ 3 3 ) / 2 z 3 = z 1 z 2 λ 3 λ_1=x_1z_2^2\\λ_2=x_2z_1^2\\λ_3 = λ_1 −λ_2\\λ_4 = y_1z^3_2\\λ_5 = y_2z^3_1\\λ_6 = λ_4 −λ_5\\λ_7 = λ_1 +λ_2\\ λ_8 = λ_4 +λ_5\\x_3 = λ^2_6 −λ_7λ^2_3\\λ_9 = λ_7λ^2_3 −2x_3\\y_3 = (λ_9λ_6 −λ_8λ_3^3)/2\\z_3 = z_1z_2λ_3 λ1=x1z22λ2=x2z12λ3=λ1λ2λ4=y1z23λ5=y2z13λ6=λ4λ5λ7=λ1+λ2λ8=λ4+λ5x3=λ62λ7λ32λ9=λ7λ322x3y3=(λ9λ6λ8λ33)/2z3=z1z2λ3最后得到的 x 3 , y 3 , z 3 x_3,y_3,z_3 x3,y3,z3即为得到的R点Jacobian加重射影坐标。

对于标量乘法中,我们首先需要计算两个相等点P+P,即计算2P,令 P ( x 1 , y 1 , z 1 ) P(x_1,y_1,z_1) P(x1,y1,z1) R ( x 3 , y 3 , z 3 ) R(x_3,y_3,z_3) R(x3,y3,z3),Jacobian加重射影坐标运算过程如下:
λ 1 = 3 x 1 2 + a z 1 4 λ 2 = 4 x 1 y 1 2 λ 3 = 8 y 1 4 x 3 = λ 1 2 − 2 λ 2 y 3 = λ 1 ( λ 2 − x 3 ) − λ 3 z 3 = 2 y 1 z 1 λ_1 = 3x_1^2 +az^4_1\\λ_2 = 4x_1y^2_1\\λ_3 = 8y^4_1\\x_3 = λ^2_1 −2λ_2\\y_3 = λ_1(λ_2 −x_3)−λ_3\\z_3 = 2y_1z_1 λ1=3x12+az14λ2=4x1y12λ3=8y14x3=λ122λ2y3=λ1(λ2x3)λ3z3=2y1z1最后得到的 x 3 , y 3 , z 3 x_3,y_3,z_3 x3,y3,z3即为得到的R点Jacobian加重射影坐标。

可以看到,在这两个过程中没有除法运算,也就不需要定义乘法逆元。那么这时候想要避开扩展欧几里得算法求乘法逆元就很简单了:只需将椭圆曲线在仿射坐标中的点,转化为在射影坐标中的点,用射影坐标几何加法运算得到结果点,最后再把这个点的射影坐标转化为仿射坐标就可以了。

libsecp256k1的坐标转换

在libsecp256k1中就采用了从仿射坐标到射影坐标再到仿射坐标的过程。
libsecp256k1采用的坐标就是Jacobian加重射影坐标。这个方法避开了扩展欧几里得算法求乘法逆元,大大提高了算法效率。

同时注意,在secp256k1中定义椭圆曲线参数a=0,b=7,那么就可以得到Jacobian射影坐标中的secp256k1椭圆曲线方程: y 2 = x 3 + 7 z 6   y^2=x^3+7z^6\, y2x37z6同样地,把a=0代入到上面Jacobian加重射影坐标几何加法运算公式中,就可以得到secp256k1在射影坐标中的几何加法运算过程。

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值