您当前的位置: 首页 >  ar

mutourend

暂无认证

  • 0浏览

    0关注

    661博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

edwards25519 add/sub算法

mutourend 发布时间:2019-08-07 15:00:22 ,浏览量:0

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=2255−19

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=(Y1​−X1​)∗(Y2​−X2​);B=(Y1​+X1​)∗(Y2​+X2​);C=2dT1​∗T2​=T1​∗(2dT2​);D=2Z1​∗Z2​;E=B−A;F=D−C;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​=E∗F;W2​=Y3​=G∗H;W0​=T3​=E∗H;W3​=Z3​=F∗G

∵ 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} ∵W3​W1​​=ZTXT​=ZX​=x=F∗GE∗F​=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} ∵W3​W2​​=ZTYZ​=TY​=y=F∗GG∗H​=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 Add 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 Add 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,Y−X,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) ⇒P1​−P2​=P1​+(−P2​)=(X1​:Y1​:T1​:Z1​)+(−X2​:Y2​:−T2​:Z2​)。

相应的代码实现如下:

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

impl Sub 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

关注
打赏
1664532908
查看更多评论
立即登录/注册

微信扫码登录

0.0424s