本文主要论述SM2算法的基本理论,着重分析SM2的数字签名过程中存在的不安全步骤,分析其安全性原因。
椭圆曲线算数理论
著名的维尔斯方程定义了椭圆曲线 E E E 在域 K K K 上的表现形式如下:
E : y 2 + a 1 x y + a 3 y = x 3 + a 2 x 2 + a 4 x + a 6 (1) E:y^2+a_1xy+a_3y=x^3+a_2x^2+a_4x+a_6 \tag{1} E:y2+a1xy+a3y=x3+a2x2+a4x+a6(1)
其中,
Δ = − d 2 2 d 8 − 8 d 4 3 − 27 d 6 2 + 9 d 2 d 4 d 8 \Delta = -d_2^2d_8-8d_4^3-27d_6^2+9d_2d_4d_8 Δ=−d22d8−8d43−27d62+9d2d4d8,
d 2 = a 1 2 + 4 a 2 d_2 = a_1^2 + 4a_2 d2=a12+4a2,
d 4 = 2 a 4 + a 1 a 3 d_4 = 2a_4+a_1a_3 d4=2a4+a1a3,
d 6 = a 3 2 + 4 a 6 d_6 = a_3^2 + 4a_6 d6=a32+4a6,
d 8 = a 1 2 a 6 + a 2 a 6 − a 1 a 3 a 4 + a 2 a 3 2 − a 4 2 d_8 = a_1^2a_6 + a_2a_6 - a_1a_3a_4 + a_2a_3^2 - a_4^2 d8=a12a6+a2a6−a1a3a4+a2a32−a42。
系数 a 1 , a 2 , a 3 , a 4 , a 6 ∈ K a_1,a_2,a_3,a_4,a_6 \in K a1,a2,a3,a4,a6∈K, Δ ≠ 0 \Delta \neq 0 Δ=0, 保证曲线上点的切线至多2个,公式(1)称为Weierstrass方程,可以利用相容性变换进行简化,如,存在 u , r , s , t ∈ E u,r,s,t\in E u,r,s,t∈E, 且 u ≠ 0 u \neq 0 u=0,使得公式(2)满足, E 1 E_1 E1就可以变换成 E 2 E_2 E2:
E 1 : y 2 + a 1 x y + a 3 y = x 3 + a 2 x 2 + a 4 x + a 6 E_1:y^2+a_1xy+a_3y=x^3+a_2x^2+a_4x+a_6 E1:y2+a1xy+a3y=x3+a2x2+a4x+a6
E 2 : y 2 + a 1 ˉ x y + a 3 ˉ y = x 3 + a 2 ˉ x 2 + a 4 ˉ x + a 6 ˉ E_2:y^2+\bar{a_1}xy+\bar{a_3}y=x^3+\bar{a_2}x^2+\bar{a_4}x+\bar{a_6} E2:y2+a1ˉxy+a3ˉy=x3+a2ˉx2+a4ˉx+a6ˉ
( x , y ) → ( u x + r , u 3 y + u 2 s x + t ) (2) (x,y)\rightarrow (u^x + r, u^3y+u^2sx+t)\tag{2} (x,y)→(ux+r,u3y+u2sx+t)(2)
E 1 E_1 E1 和 E 2 E_2 E2 称为域 K K K 上的同构曲线。
SM2依赖于椭圆曲线上点的运算,又依赖于域的运算,域的选择可以使素数域也可以是二元域,接下来进行素数域 F p F_p Fp 进行研究,其中 p p p 代表大素数。
素域 F p F_p Fp上的基本计算
(1) 加法 ⊕ \oplus ⊕ 的单位元为0
(2) 乘法 ⊗ \otimes ⊗ 的单位元为1
(3) 域上的加法要模上素数 p p p,存在 a , b ∈ F p a,b\in F_p a,b∈Fp,即, a + b = ( a + b ) m o d p a + b = (a+b) \mod p a+b=(a+b)modp
(4) 域上的乘法要模上素数 p p p,存在 a , b ∈ F p a,b\in F_p a,b∈Fp,即, a ⋅ b = ( a ⋅ b ) m o d p a \cdot b = (a \cdot b) \mod p a⋅b=(a⋅b)modp
素域 F p F_p Fp上的群运算法则
对椭圆曲线上 E ( F p ) E(F_p) E(Fp) 的点制定运算规则使其构成一个交换群,如在仿射坐标下的运算规则:
1)两个无穷远点 O O O 相加: O + O = O O+O=O O+O=O
2)点 P = ( x , y ) ∈ E ( F p ) ) \ { O } P=(x,y)\in E(F_p))\backslash \{O\} P=(x,y)∈E(Fp))\{
O}, P + O = O + P = P P+O=O+P=P P+O=O+P=P
3)点 P = ( x , y ) ∈ E ( F p ) ) \ { O } P=(x,y)\in E(F_p))\backslash \{O\} P=(x,y)∈E(Fp))\{
O}, P P P的逆元 − P = ( x , − y ) -P = (x,-y) −P=(x,−y), P + ( − P ) = O P+(-P)=O P+(−P)=O
4) 点加运算:
不同点 P 1 ∈ ( x 1 , y 1 ) ∈ E ( F p ) ) \ { O } , P 2 ∈ ( x 2 , y 2 ) ∈ E ( F p ) ) \ { O } P_1\in (x_1,y_1)\in E(F_p))\backslash \{O\}, P_2\in (x_2,y_2)\in E(F_p))\backslash \{O\} P1∈(x1,y1)∈E(Fp))\{
O},P2∈(x2,y2)∈E(Fp))\{
O} 且 P 1 ≠ ± P 2 P_1 \neq \pm P_2 P1=±P2, 则 P 1 + P 2 = ( x 3 , y 3 ) P_1+P_2=(x_3,y_3) P1+P2=(x3,y3),其中
x 3 = ( y 2 − y 1 x 2 − x 1 ) 2 − x 1 − x 2 x_3 = (\frac{y_2-y_1}{x_2-x_1})^2-x_1-x_2 x3=(x2−x1y2−y1)2−x1−x2
y 3 = ( y 2 − y 1 x 2 − x 1 ) ( x 1 − x 3 ) − y 1 y_3 = (\frac{y_2-y_1}{x_2-x_1})(x_1-x_3)-y_1 y3=(x2−x1y2−y1)(x