edwards25519 add/sub算法

edwards25519 curve表示为:

− x 2 + y 2 = 1 + d x 2 y 2 , d = − ( 121665 / 121666 ) , q = 2 255 − 19 -x^2+y^2=1+dx^2y^2,d=-(121665/121666),q=2^{255}-19 x2+y2=1+dx2y2,d=(121665/121666),q=225519

1. edwards25519 add算法

根据博客Extended twisted Edwards curve坐标系中提及:


注意,在Extended坐标系下,可提供更快的加法运算,在Projective坐标系下,可提供更快的double运算!!!实际使用时,可根据不同的计算选择不同的坐标系。


所以,add加法运算使用Extended坐标系,采用论文《Twisted Edwards Curves Revisited》中的Dedicated Addition in ε e \varepsilon ^e εe算法:
在这里插入图片描述
对于edwards25519 curve, a = − 1 a=-1 a=1
根据 https://doc-internal.dalek.rs/curve25519_dalek/backend/serial/curve_models/index.html 中定义,计算所得的 ( X 3 : Y 3 : T 3 : Z 3 ) (X_3:Y_3:T_3:Z_3) (X3:Y3:T3:Z3)为extended坐标,对应的为 ( W 1 : W 2 : W 0 : W 3 ) (W_1:W_2:W_0:W_3) (W1:W2:W0:W3),详细的计算过程为:
A = ( Y 1 − X 1 ) ∗ ( Y 2 − X 2 ) ; B = ( Y 1 + X 1 ) ∗ ( Y 2 + X 2 ) ; C = 2 d T 1 ∗ T 2 = T 1 ∗ ( 2 d T 2 ) ; D = 2 Z 1 ∗ Z 2 ; E = B − A ; F = D − C ; G = D + C ; H = B + A A=(Y_1-X_1)*(Y_2-X_2); B=(Y_1+X_1)*(Y_2+X_2); C=2dT_1*T_2=T_1*(2dT_2); D=2Z_1*Z_2; E=B-A;F=D-C;G=D+C;H=B+A A=(Y1X1)(Y2X2);B=(Y1+X1)(Y2+X2);C=2dT1T2=T1(2dT2);D=2Z1Z2;E=BA;F=DC;G=D+C;H=B+A

W 1 = X 3 = E ∗ F ; W 2 = Y 3 = G ∗ H ; W 0 = T 3 = E ∗ H ; W 3 = Z 3 = F ∗ G W_1=X_3=E*F;W_2=Y_3=G*H;W_0=T_3=E*H;W_3=Z_3=F*G W1=X3=EF;W2=Y3=GH;W0=T3=EH;W3=Z3=FG

∵ W 1 W 3 = X T Z T = X Z = x = E ∗ F F ∗ G = E G \because \frac{W_1}{W_3}=\frac{XT}{ZT}=\frac{X}{Z}=x=\frac{E*F}{F*G}=\frac{E}{G} W3W1=ZTXT=ZX=x=FGEF=GE
∵ W 2 W 3 = Y Z Z T = Y T = y = G ∗ H F ∗ G = H F \because \frac{W_2}{W_3}=\frac{YZ}{ZT}=\frac{Y}{T}=y=\frac{G*H}{F*G}=\frac{H}{F} W3W2=ZTYZ=TY=y=FGGH=FH
∴ X = E ; Y = H ; Z = G ; T = F \therefore X=E; Y=H; Z=G; T=F X=E;Y=H;Z=G;T=F

以上得到的即为 σ : ( ( X : Z ) , ( Y : T ) ) \sigma :((X:Z),(Y:T)) σ:((X:Z),(Y:T))
相应的代码实现为:

impl<'a, 'b> Add<&'b EdwardsPoint> for &'a EdwardsPoint {
    type Output = EdwardsPoint;
    fn add(self, other: &'b EdwardsPoint) -> EdwardsPoint {
        (self + &other.to_projective_niels()).to_extended()
    }
}

/// Convert to a ProjectiveNielsPoint
    pub(crate) fn to_projective_niels(&self) -> ProjectiveNielsPoint {
        ProjectiveNielsPoint{
            Y_plus_X:  &self.Y + &self.X,
            Y_minus_X: &self.Y - &self.X,
            Z:          self.Z,
            T2d:       &self.T * &constants::EDWARDS_D2,
        }
    }

impl<'a, 'b> Add<&'b ProjectiveNielsPoint> for &'a EdwardsPoint {
    type Output = CompletedPoint;

    fn add(self, other: &'b ProjectiveNielsPoint) -> CompletedPoint {
        let Y_plus_X  = &self.Y + &self.X;
        let Y_minus_X = &self.Y - &self.X;
        let PP = &Y_plus_X  * &other.Y_plus_X;
        let MM = &Y_minus_X * &other.Y_minus_X;
        let TT2d = &self.T * &other.T2d;
        let ZZ   = &self.Z * &other.Z;
        let ZZ2  = &ZZ + &ZZ;

        CompletedPoint{
            X: &PP - &MM,
            Y: &PP + &MM,
            Z: &ZZ2 + &TT2d,
            T: &ZZ2 - &TT2d
        }
    }
}

P r o j e c t i v e N i e l s P o i n t : ( Y + X , Y − X , Z , 2 d T ) ProjectiveNielsPoint: (Y+X, Y-X, Z, 2dT) ProjectiveNielsPoint:(Y+X,YX,Z,2dT)

2. edwards25519 sub算法

根据Extended twisted Edwards curve坐标系, 在Extended坐标系下, ( X : Y : T : Z ) (X:Y:T:Z) (X:Y:T:Z)的负数为 ( − X : Y : − T : Z ) (-X:Y:-T:Z) (X:Y:T:Z) ⇒ P 1 − P 2 = P 1 + ( − P 2 ) = ( X 1 : Y 1 : T 1 : Z 1 ) + ( − X 2 : Y 2 : − T 2 : Z 2 ) \Rightarrow P_1-P_2=P_1+(-P_2)=(X_1:Y_1:T_1:Z_1)+(-X_2:Y_2:-T_2:Z_2) P1P2=P1+(P2)=(X1:Y1:T1:Z1)+(X2:Y2:T2:Z2)

相应的代码实现如下:

impl<'a, 'b> Sub<&'b EdwardsPoint> for &'a EdwardsPoint {
    type Output = EdwardsPoint;
    fn sub(self, other: &'b EdwardsPoint) -> EdwardsPoint {
        (self - &other.to_projective_niels()).to_extended()
    }
}

impl<'a, 'b> Sub<&'b ProjectiveNielsPoint> for &'a EdwardsPoint {
    type Output = CompletedPoint;

    fn sub(self, other: &'b ProjectiveNielsPoint) -> CompletedPoint {
        let Y_plus_X  = &self.Y + &self.X;
        let Y_minus_X = &self.Y - &self.X;
        let PM = &Y_plus_X * &other.Y_minus_X;
        let MP = &Y_minus_X  * &other.Y_plus_X;
        let TT2d = &self.T * &other.T2d;
        let ZZ   = &self.Z * &other.Z;
        let ZZ2  = &ZZ + &ZZ;

        CompletedPoint{
            X: &PM - &MP,
            Y: &PM + &MP,
            Z: &ZZ2 - &TT2d,
            T: &ZZ2 + &TT2d
        }
    }
}

参考资料:
[1] Extended twisted Edwards curve坐标系
[2] 论文《Twisted Edwards Curves Revisited》
[3] https://doc-internal.dalek.rs/curve25519_dalek/backend/serial/curve_models/index.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值