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
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。
具体的算法细节如下:
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(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′)。
具体的算法实现为:
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》