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
R1⊖R0的差值都没有变化,都是P,即满足:
R
1
=
R
0
⊕
P
R_1=R_0\oplus P
R1=R0⊕P 上述算法第二行的循环
i
i
i是由
l
−
2
l-2
l−2到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)i−1]P),F([(k)i−1+1]P)):
- 当 ( k ) i − 1 = 0 (k)_{i-1}=0 (k)i−1=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)i−1]P),F([(k)i−1+1]P))=(FDBL(F0),FADD(F0,F1,F(P)));
- 当 ( k ) i − 1 = 1 (k)_{i-1}=1 (k)i−1=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)i−1]P),F([(k)i−1+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=(xP,yP),Q=(xQ,yQ),P⊕Q=(x⊕,y⊕),则根据 x P , y P , x Q 和 x ⊕ x_P,y_P,x_Q和x_\oplus xP,yP,xQ和x⊕可计算获得 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λ=xQ−xPyQ−yP ∴ 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−(xP−xQ)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 2ByPZQZ⊕YQ=[(xPXQ+ZQ)(xPZQ+XQ+2AZQ)−2AZQ2]Z⊕−(xPZQ−XQ)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/ZQ,yQ=YQ′/ZQ′=YQ/ZQ:
X Q ′ = 2 B y P Z Q Z ⊕ X Q X'_Q=2By_PZ_QZ_\oplus X_Q XQ′=2ByPZQZ⊕XQ 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⊕−(xPZQ−XQ)2X⊕ Z Q ′ = 2 B y P Z Q Z ⊕ Z Q Z'_Q=2By_PZ_QZ_\oplus Z_Q ZQ′=2ByPZQZ⊕ZQ
因此可根据
P
,
F
(
Q
)
,
F
(
P
⊕
Q
)
P,F(Q),F(P\oplus Q)
P,F(Q),F(P⊕Q)来计算获得Q。 具体的算法细节如下:
假设要求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(P⊕Q)),其中 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(P⊕Q)=(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(P⊕Q)=(X⊕,Z⊕),计算获得Q的坐标值 ( X Q ′ : Y Q ′ : Z Q ′ ) (X'_Q:Y'_Q:Z'_Q) (XQ′:YQ′:ZQ′)。
具体的算法实现为:
对于实际密码学应用中,要保持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》