2021SC@SDUSC
符号及辅助算法
下面对在SM9算法中用到的符号及函数进行了声明
源代码
在源程序\GmSSL-master\crypto\sm9\sm9_lcl.h中,找到了针对这些全局变量的定义:
私钥提取算法类型: 所用到的椭圆曲线类型: 椭圆曲线上的双线性对类型(即eid): 不同的嵌入度: 定义最大明密文长度: 源文件中还有其他函数及变量声明,在此不一一赘述。
用户A私钥的生成过程
用户A私钥的生成过程如下: (1) KGC首先在有限域FN上计算t1=H1(IDA|| hid ,N)+ks ,若t =0则需重新产生签名主私钥,计算和公开签名主公钥,并更新已有用户的签名私钥(小概率事件,大多数情况下可以忽略) (2) KGC计算t2=ks·t1-1mod N (3) 然后计算dsA=[t2]P1。
签名主公钥的生成
Ppub-s=[ks]P2
数字签名的生成
生成过程如下: A1:计算群GT中的元素g =e(P1,Ppub-s. ) A2:产生随机数r∈[1,N一1] A3:计算群Gr中的元素ω = gr,将ω 的数据类型转换为比特串﹔ A4 :计算整数h= H2(M || ω ,N ); A5:计算整数l=(r—h )mod N,若l=0则返回A2; A6:计算群G中的元素S=[l]dsA ; A7:将h的数据类型转换为字节串,将S的数据类型转换为字节串,消息M的签名为(h ,S)。
其中A3、A6两步运算用到了离散对数的安全性,其复杂性分析较为复杂,对理解算法内容影响不大,不再在此分析。
签名的认证
认证过程如下: B1:将h’的数据类型转换为整数,检验h’∈[1,N-1]是否成立,若不成立则验证不通过; B2:将S’的数据类型转换为椭圆曲线上的点﹐检验S’∈G是否成立,若不成立则验证不通过; B3:计算群GT中的元素g =e(P1,Ppub- s )﹔ B4 :计算群GT中的元素t= gh’﹔ B5:计算整数h=H1 (IDA || hid ,N ); B6:计算群G2:中的元素P=[h1]P2+Ppub-s ; B7:计算群GT中的元素u = e(S’ ,P); B8:计算群GT中的元素ω’= u·t ,将w’的数据类型转换为比特串; B9 :计算整数h2= H2(M’||ω‘,N) ,检验h2=h’是否成立,若成立则验证通过;否则验证不通过。
下面进行签名认证正确性的相关推导: w’ = u·t =e(S’ ,P)gh’ =e(S’,[h1]P2 + Ppub-s) gh’ =e([r - h’]dsA , [h1]P2 + Ppub-s) gh’ =e([r - h’][ks · (h1+ks)-1]P1 , [h1]P2 + Ppub-s) gh’ =e([r - h’][ks · (h1+ks)-1]P1 , [h1][ks-1]Ppub-s + Ppub-s) gh’ =e(P1,Ppub-s)(r-h’)(ks*(h1+ks)-1)(h1* ks-1+1) · gh’ =g(r-n")(h1+ks)-1 (h1+ks) gh’ =gr =w
总结
对SM9的数字签名算法及其验证过程进行了较为充分的理论研究,正在逐步拆解源代码库中有关SM9算法的.c文件,以进行下一步更为详细的代码分析步骤。
参考文献:GMT 0044.1-2016 SM9标识密码算法 第1部分:总则、《密码学原理与实践》、《信息安全数学基础》
|