SM2 - 数字签名算法

符号
A,B:使用公钥密码系统的两个用户。
\(a,b\)\(F_q\)中的元素,他们定义\(F_q\)上的一条椭圆曲线\(E\)
\(d_A\):用户A的私钥。
\(E⁡(F_q )\)\(F_q\)上椭圆曲线\(E\)的所有有理点(包括无穷远点\(O\))组成的集合。
\(e\):密码杂凑函数作用于消息\(M\)的输出值。
\(e'\):密码杂凑函数作用于消息\(M'\)的输出值。
\(F_q\):包含\(q\)个元素的有限域。
\(G\):椭圆曲线的一个基点,其阶为素数。
\(H_v()\):消息摘要长度为\(v\)比特的密码杂凑函数。
\(ID_A\):用户A的可辩别标识。
\(M\):待签名消息。
\(M'\):待验证消息
\(\mbox{mod }n\):模\(n\)元素。例如,\(23\mbox{ mod }7=2\)
\(n\):基点\(G\)的阶(\(n\)\(♯⁡E⁡(F_q )\)的素因子)。
\(O\):椭圆曲线上的一个特殊点,称为无穷远点或零点,是椭圆曲线加法群的单位元。
\(P_A\):用户A的公钥。
\(q\):有限域\(F_q\)中元素的数目。
\(x‖y\)\(x\)\(y\)的拼接,其中\(x\)\(y\)是比特串或字节串。
\(Z_A\):关于用户A的可辨识标识、部分椭圆曲线系统参数和用户A公钥的杂凑值。
\((r,s)\):发送的签名。
\((r',s')\):收到的签名。
\([k]P\):椭圆曲线上点\(P\)\(k\)倍点,即:\(\lbrack k\rbrack P = \underset{k\text{个}}{\underbrace{P + P + \cdots + P}}\),其中\(k\)是正整数。
\([x,y]\):大于或等于\(x\)且小于或等于\(y\)的整数的集合。
\(⌈x⌉\):顶函数,大于或等于\(x\)的最小整数。例如,\(⌈7⌉=7\)\(⌈8.3⌉=9\)
\(⌊x⌋\):底函数,小于或等于\(y\)的最大整数。例如,\(⌊7⌋=7\)\(⌊8.3⌋=8\)
\(♯⁡E⁡(F_q )\)\(E⁡(F_q )\)上点的数目,称为椭圆曲线\(E⁡(F_q )\)的阶。

用户密码对
用户A的密钥对包括其私钥\(d_A\)和公钥\(P_A=[d_A ]G=(x_A,y_A )\)

用户其他信息
用户A具有长度为\(entlen_A\)比特的可辨识标识\(ID_A\),记\(ENTL_A\)是由整数\(entlen_A\)转换而成的两个字节。将椭圆曲线方程参数\(a\)\(b\)\(G\)的坐标\(x_G\)\(y_G\)\(P_A\)的坐标\(x_A\)\(y_A\)的数据类型转换为比特串,\(Z_A=H_{256}⁡(ENTL_A ‖ID_A ‖a‖b‖x_G ‖y_G ‖x_A ‖y_A )\)

数字签名的生成算法
设待签名的消息为\(M\),为了获取消息\(M\)的数字签名\((r,s)\),作为签名者的用户A应实现以下运算步骤:
 A1.置\(\overline{M}=Z_A‖M\)
 A2.计算\(e=H_v⁡(\overline{M})\)
 A3.用随机数发生器产生随机数\(k∈[1,n-1]\)
 A4.计算椭圆曲线点\((x_1,y_1 )=[k]G\)
 A5.计算\(r=(e+x_1 )\mod{n}\),若\(r=0\)\(r+k=n\)则返回A3;
 A6.计算\(s=((1+d_A )^{-1}⋅(k-r⋅d_A ))\mod{n}\),若\(s=0\)则返回A3;
 A7.消息\(M\)的签名为\((r,s)\)

数字签名的验证算法
为了检验收到的消息\(M'\)及其数字签名\((r',s')\),作为验证者的用户B应实现以下运算步骤:
 B1.检验\(r'∈[1,n-1]\)是否成立,若不成立则验证不通过;
 B2.检验\(s'∈[1,n-1]\)是否成立,若不成立则验证不通过;
 B3.置\(\overline{M}'=Z_A ‖M'\)
 B4.计算\(e'=H_v⁡(\overline{M}')\)
 B5.计算\(t=(r'+s')\mod{n}\),若\(t=0\),则验证不通过;
 B6.计算椭圆曲线点\((x_1',y_1')=[s']G+[t]P_A\)
 B7.计算\(R=(e'+x_1')\mod{n}\),检验\(R=r'\)是否成立,若成立则验证通过;否则验证不通过。

注:假定收到的待验证消息\(M'\)及其数字签名\((r',s')\)与待签名消息\(M\)及其数字签名\((r,s)\)无误,则步骤B3计算\(\overline{M}'=\overline{M}\),进而\(e'=e\)。在步骤B6中考虑\(P_A=[d_A ]G\),有

$ \begin{array}{lll} \left( {x_{1}',y_{1}'} \right) & = & {\left\lbrack {s'} \right\rbrack G + \lbrack t\rbrack P_{A}} \\ & = & {\lbrack s\rbrack G + \left\lbrack {d_{A} \cdot \left( {r + s} \right)} \right\rbrack G} \\ & = & {\left\lbrack {\left( {1 + d_{A}} \right) \cdot s + d_{A} \cdot r} \right\rbrack G} \\ & = & {\left\lbrack {k - r \cdot d_{A} + r \cdot d_{A}} \right\rbrack G} \\ & = & {\lbrack k\rbrack G = \left( {x_{1},y_{1}} \right)} \end{array} $
从而$R=(e'+x_1')\mod{n}=(e+x_1 )\mod{n}=r$,即签名验证通过。此外,对消息$M$的修改会导致$\overline{M}'≠\overline{M}$,进而$e'≠e$,而对数字签名的修改会导致$(x_1',y_1')≠(x_1,y_1 )$,最终有$R≠r$即签名验证失败。

参考 GM/T 0003.2—2012
posted @ 2024-12-23 11:17  Miro'  阅读(91)  评论(0编辑  收藏  举报