Montgomery curve的运算(2)——montgomery ladder运算

1. 引言

F ( ( X : Y : Z ) ) = ( X : Z ) F((X:Y:Z))=(X:Z) F((X:Y:Z))=(X:Z)仅对Z!=0的情况成立
需要计算 F ( P ) ↦ F ( [ k ] P ) F(P) \mapsto F([k]P) F(P)F([k]P)
注意:
O = ( 0 : 1 : 0 ) , T = ( 0 , 0 , 1 ) O=(0:1:0), T=(0,0,1) O=(0:1:0),T=(0,0,1),因此有:
F ( [ k ] O ) = F ( O ) , F ( [ k ] T ) = F ( T ) F([k]O)=F(O), F([k]T)=F(T) F([k]O)=F(O),F([k]T)=F(T)

所以以下计算中均假设: P ! = O & P ! = T P != O\&P != T P!=O&P!=T

2. 先计算 P ↦ [ k ] P P\mapsto [k]P P[k]P

采用的是double-and-add算法,将k值以二进制形式表示。
在这里插入图片描述
由上述算法第四行和第六行可知,无论何时, R 1 ⊖ R 0 R_1 \ominus R_0 R1R0的差值都没有变化,都是P,即满足:
R 1 = R 0 ⊕ P R_1=R_0\oplus P R1=R0P
上述算法第二行的循环 i i i是由 l − 2 l-2 l2到0,因此有:
R 0 = [ ( k ) i ] P R 1 = [ ( k ) i + 1 ] P , 其 中 ( k ) i : = ⌊ k / 2 i ⌋ R_0=[(k)_i]P \quad R_1=[(k)_i+1]P, \quad 其中 \quad (k)_i:=\left \lfloor k/2^i \right \rfloor R0=[(k)i]PR1=[(k)i+1]P,(k)i:=k/2i

根据以上两个公式,可推导出Montgomery ladder算法

3. The Montgomery ladder

根本的目的是为了计算 F ( P ) ↦ F ( [ k ] P ) F(P) \mapsto F([k]P) F(P)F([k]P),根据第二节中计算 P ↦ [ k ] P P\mapsto [k]P P[k]P的特征,可做以下假设:
( F 0 , F 1 ) = ( F ( [ ( k ) i ] P ) , F ( [ ( k ) i + 1 ] P ) ) (F_0,F_1)=(F([(k)_i]P), F([(k)_i+1]P)) (F0,F1)=(F([(k)i]P),F([(k)i+1]P))
则若需计算 ( F ( [ ( k ) i − 1 ] P ) , F ( [ ( k ) i − 1 + 1 ] P ) ) (F([(k)_{i-1}]P), F([(k)_{i-1}+1]P)) (F([(k)i1]P),F([(k)i1+1]P))

  • ( k ) i − 1 = 0 (k)_{i-1}=0 (k)i1=0时, ( F ( [ ( k ) i − 1 ] P ) , F ( [ ( k ) i − 1 + 1 ] P ) ) = ( F D B L ( F 0 ) , F A D D ( F 0 , F 1 , F ( P ) ) ) (F([(k)_{i-1}]P), F([(k)_{i-1}+1]P))=(F_{DBL}(F_0),F_{ADD}(F_0,F_1,F(P))) (F([(k)i1]P),F([(k)i1+1]P))=(FDBL(F0),FADD(F0,F1,F(P)))
  • ( k ) i − 1 = 1 (k)_{i-1}=1 (k)i1=1时, ( F ( [ ( k ) i − 1 ] P ) , F ( [ ( k ) i − 1 + 1 ] P ) ) = ( F A D D ( F 0 , F 1 , F ( P ) ) , F D B L ( F 0 ) ) (F([(k)_{i-1}]P), F([(k)_{i-1}+1]P))=(F_{ADD}(F_0,F_1,F(P)),F_{DBL}(F_0)) (F([(k)i1]P),F([(k)i1+1]P))=(FADD(F0,F1,F(P)),FDBL(F0))

以下算法中用x来替换上面的函数F。
在这里插入图片描述

由于上述算法最终执行可返回 F ( P ) ↦ ( F ( [ k ] P ) , F ( [ k + 1 ] P ) ) F(P) \mapsto (F([k]P), F([k+1]P)) F(P)(F([k]P),F([k+1]P)),因此可以由 ( P , F ( [ k ] P ) , F ( [ k + 1 ] P ) ) (P,F([k]P), F([k+1]P)) (P,F([k]P),F([k+1]P))来计算 [ k ] P [k]P [k]P,该计算可用于恢复y-坐标值。

4. y-坐标的恢复

假设P不是E(A;B)曲线上order为2的点(如T:=(0:0:1)是order为2的点之一), Q ∉ { P , ⊖ P , O } Q \notin\{P,\ominus P,O\} Q/{P,P,O},仿射坐标系下
P = ( x P , y P ) , Q = ( x Q , y Q ) , P ⊕ Q = ( x ⊕ , y ⊕ ) P=(x_P,y_P),Q=(x_Q,y_Q),P\oplus Q=(x_\oplus, y_\oplus) P=(xPyP),Q=(xQ,yQ),PQ=(x,y),则根据 x P , y P , x Q 和 x ⊕ x_P,y_P,x_Q和x_\oplus xP,yP,xQx可计算获得 y Q y_Q yQ
∵ x ⊕ = B λ 2 − ( x P + x Q ) − A λ = y Q − y P x Q − x P \because x_\oplus=B\lambda ^2-(x_P+x_Q)-A \quad \lambda=\frac{y_Q-y_P}{x_Q-x_P} x=Bλ2(xP+xQ)Aλ=xQxPyQyP
∴ y Q = ( x P x Q + 1 ) ( x P + x Q + 2 A ) − 2 A − ( x P − x Q ) 2 x ⊕ 2 B y P \therefore y_Q=\frac{(x_Px_Q+1)(x_P+x_Q+2A)-2A-(x_P-x_Q)^2x_\oplus}{2By_P} yQ=2ByP(xPxQ+1)(xP+xQ+2A)2A(xPxQ)2x

注意, y Q y_Q yQ值的计算公式中有A参数和B参数。
在投影坐标系下,应用 x Q = X Q / Z Q , y Q = Y Q / Z Q , x ⊕ = X ⊕ / Z ⊕ x_Q=X_Q/Z_Q,y_Q=Y_Q/Z_Q,x_\oplus =X_\oplus/Z_\oplus xQ=XQ/ZQ,yQ=YQ/ZQ,x=X/Z替换后,将 y Q y_Q yQ值的计算公式转换为:
2 B y P Z Q Z ⊕ Y Q = [ ( x P X Q + Z Q ) ( x P Z Q + X Q + 2 A Z Q ) − 2 A Z Q 2 ] Z ⊕ − ( x P Z Q − X Q ) 2 X ⊕ 2By_PZ_QZ_\oplus Y_Q=[(x_PX_Q+Z_Q)(x_PZ_Q+X_Q+2AZ_Q)-2AZ_Q^2]Z_\oplus -(x_PZ_Q-X_Q)^2X_\oplus 2ByPZQZYQ=[(xPXQ+ZQ)(xPZQ+XQ+2AZQ)2AZQ2]Z(xPZQXQ)2X
可做以下坐标转换,使得所获得的 ( X Q ′ : Y Q ′ : Z Q ′ ) = ( X Q : Y Q : Z Q ) (X'_Q:Y'_Q:Z'_Q)=(X_Q:Y_Q:Z_Q) (XQ:YQ:ZQ)=(XQ:YQ:ZQ),即仍然满足 x Q = X Q ′ / Z Q ′ = X Q / Z Q , y Q = Y Q ′ / Z Q ′ = Y Q / Z Q x_Q=X'_Q/Z'_Q=X_Q/Z_Q,y_Q=Y'_Q/Z'_Q=Y_Q/Z_Q xQ=XQ/ZQ=XQ/ZQyQ=YQ/ZQ=YQ/ZQ:

X Q ′ = 2 B y P Z Q Z ⊕ X Q X'_Q=2By_PZ_QZ_\oplus X_Q XQ=2ByPZQZXQ
Y Q ′ = [ ( x P X Q + Z Q ) ( x P Z Q + X Q + 2 A Z Q ) − 2 A Z Q 2 ] Z ⊕ − ( x P Z Q − X Q ) 2 X ⊕ Y'_Q=[(x_PX_Q+Z_Q)(x_PZ_Q+X_Q+2AZ_Q)-2AZ_Q^2]Z_\oplus -(x_PZ_Q-X_Q)^2X_\oplus YQ=[(xPXQ+ZQ)(xPZQ+XQ+2AZQ)2AZQ2]Z(xPZQXQ)2X
Z Q ′ = 2 B y P Z Q Z ⊕ Z Q Z'_Q=2By_PZ_QZ_\oplus Z_Q ZQ=2ByPZQZZQ

因此可根据 P , F ( Q ) , F ( P ⊕ Q ) P,F(Q),F(P\oplus Q) P,F(Q),F(PQ)来计算获得Q。
具体的算法细节如下:在这里插入图片描述

5. Sclar multiplication on E(A;B)(Fq)

假设要求Q=[k]P,采用第三节的ladder算法可获得 F ( P ) ↦ ( F ( Q ) , F ( P ⊕ Q ) ) F(P) \mapsto (F(Q), F(P\oplus Q)) F(P)(F(Q),F(PQ)),其中 F ( Q ) = ( X Q , Z Q ) , F ( P ⊕ Q ) = ( X ⊕ , Z ⊕ ) F(Q)=(X_Q,Z_Q),F(P\oplus Q)=(X_\oplus, Z_\oplus) F(Q)=(XQ,ZQ),F(PQ)=(X,Z)
然后根据第四节的Recover算法,可根据 P , F ( Q ) = ( X Q , Z Q ) , F ( P ⊕ Q ) = ( X ⊕ , Z ⊕ ) P, F(Q)=(X_Q,Z_Q),F(P\oplus Q)=(X_\oplus, Z_\oplus) P,F(Q)=(XQ,ZQ),F(PQ)=(X,Z),计算获得Q的坐标值 ( X Q ′ : Y Q ′ : Z Q ′ ) (X'_Q:Y'_Q:Z'_Q) (XQ:YQ:ZQ)

具体的算法实现为:
在这里插入图片描述

6. Constant-time ladders

对于实际密码学应用中,要保持scalar multiplication执行时间的一致性,即执行时间与所选择的秘密数据scalar m无关,应具有constant-time特征,这是避免timing attacks的第一步。
在这里插入图片描述

在第四节的ladder算法中,循环的长度取决于k的位长,k为scalar m ∈ [ 0 , r ) m \in [0,r) m[0,r)的二进制表示。
有两种方式可让循环长度与k无关:

  • 1)所有的scalar认为约定设置最高位,时任何scalar的位长都相同。
  • 2)修改算法中的第1步,设置 ( F 0 , F 1 ) ↦ ( F ( O ) , F ( P ) ) (F_0,F_1) \mapsto (F(O),F(P)) (F0,F1)(F(O),F(P)),而不是 ( F ( P ) , F ( 2 P ) ) (F(P),F(2P)) (F(P),F(2P)),这样当从l-2到0循环时,只有遇到第一个非零位时,F0和F1的值才有会被修改,否则将一直保持不变。从而scalar具有固定的长度时,可保证循环的长度也是固定的。实际curve25519-dalek的代码实现中采用的是此方法。

同时第四节的ladder算法中采用if来对秘密数据(k)i做条件判断,存在对if分支进行时间测量的可能,实际应用时,条件判断不用if而是用conditional swaps(如下面算法的SWAP函数),可防止秘密泄露。实现当b=1时,x0=x1,x1=x0;当b=0时,x0=x0,x1=x1。可对应Rust语言中的conditional_swap函数
在这里插入图片描述
完整的constant-time ladder算法如下:
在这里插入图片描述

参考资料:
[1] 论文《Speeding the Pollard and Elliptic Curve Methods of Factorization》
[2] 论文《Montgomery curves and their arithmetic》
[3] 论文《Efficient Elliptic Curve Cryptosystems from a Scalar Multiplication Algorithm with Recovery of the y-Coordinate on a Montgomery-Form Elliptic Curve》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值