GMSSL SM9-签名验签流程

GMSSL SM9-签名验签流程

1.初始化

SM9_standard_init();

2.生成签名主密钥

SM9_standard_generatesignkey(hid, IDA, strlen(IDA), ks, Ppub, dSA);

3.签名

SM9_standard_generatesignkey(hid, IDA, strlen(IDA), ks, Ppub, dSA);

3.1

//Step1:g = e(P1, Ppub-s)
    ecap(Ppubs, P1, para_t, X, &g)

3.2

 //Step2:calculate w=g(r)

w = zzn12_pow(g, r);

3.3

 //Step3:calculate h=H2(M||w,N)

 SM9_standard_h2(Z, Zlen, N, h);

3.4

 //Step4:l=(r-h)mod N

3.5

//Step5:S=[l]dSA=(xS,yS)

数字签名生成算法
设待签名的消息为比特串 M,为了获取消息 M 的数字签名(h, S),作为签名者的用户 A 应实现以下
运算步骤:
A1: 计算群 GT 中的元素 g = e(P1, Ppub-s)
A2: 产生随机数 r[1, N-1]
A3: 计算群 GT 中的元素 w = gr, 将 w 的数据类型转换为比特串;
A4: 计算整数 h = H2(M||w, N)
A5: 计算整数 l = (r-h) mod N,若 l = 0 则返回 A2
A6: 计算群 G1 中的元素 S = [l]dsA
A7: 消息 M 的签名为(h, S)

4.验签

SM9_standard_verify(h, S, hid, IDA, message, mlen, Ppub);

4.1

   //Step 1:test if h in the rangge [1,N-1]
    Test_Range(h)

4.2

   //Step 2:test if S is on G1

 Test_Point(S1)

4.3

  //Step3:g = e(P1, Ppub-s)
    ecap(Ppubs, P1, para_t, X, &g)

4.4

    //Step4:calculate t=g(h)
    zzn12_pow(g, h);

4.5

  //Step5:calculate h1=H1(IDA||hid,N)

SM9_standard_h1(Z1, Zlen1, N, h1);

4.6

 //Step6:P=[h1]P2+Ppubs

4.7

 //Step7:u=e(S1,P)
    ecap(P, S1, para_t, X, &u))

4.8

 //Step8:w=u*t
    zzn12_mul(u, t, &w);

4.9

 //Step9:h2=H2(M||w,N)

SM9_standard_h2(Z2, Zlen2, N, h2);


数字签名验证算法

为了检验收到的消息 M及其数字签名( h, S),作为验证者的用户 B 应实现以下运算步骤:

B1: 检验 h[1, N-1] 是否成立,若不成立则验证不通过;

B2: 将 S的数据类型转换为椭圆曲线上的点,检验 SG1 是否成立,若不成立则验证不通过;

B3: 计算群 GT 中的元素 g = e(P1, Ppub-s)

B4: 计算群 GT 中的元素 t = gh

B5: 计算整数 h1= H1(IDA||hid, N)

B6: 计算群 G2 中的元素 P = [h1]P2+ Ppub-s

B7: 计算群 GT 中的元素 u = e(S, P)

B8: 计算群 GT 中的元素 w= ut, 将 w的数据类型转换为比特串;

B9: 计算整数 h2 = H2(M||w, N),检验 h2 = h是否成立,若成立则验证通过;否则验证不通过。



 









你可能感兴趣的:(GMSSL SM9-签名验签流程)