GMSSL SM9-封装解封装流程

 GMSSL SM9-封装解封装流程

1.初始化

2.生成密钥(同加密算法中生成密钥一致)

3.密钥封装

SM9_standard_key_encap(hid, IDB, rand, Ppub, C, K, Klen);

3.1

 //----------Step1:calculate QB=[H1(IDB||hid,N)]P1+Ppube

 SM9_standard_h1(Z, Zlen, N, h);

3.2

 //-------------------- Step2:randnom

3.3

 //----------------Step3:C=[r]QB

3.4

 //----------------Step4:g=e(Ppube,P2)

ecap(P2, Ppube, para_t, X, &g)

3.5

 //----------------Step5:w=g^r------------------------
    zzn12_pow(g, r);

3.6

 //----------------Step6:K=KDF(C||w||IDB,klen)

 SM3_kdf(Z, Zlen, Klen, K);

密钥封装算法
为了封装比特长度为klen的密钥给用户B,作为封装者的用户A需要执行以下运算步骤:
A1: 计算群 1 中的元素 QB=[H1(IDB||hid, N)]P1+Ppub-e
A2: 产生随机数 r[1, N1]
A3: 计算群 1 中的元素 C=[r]QB,将 C 的数据类型转换为比特串;
A4: 计算群 T中的元素 g=e(Ppub-e, P2)
A5: 计算群 T中的元素 w=gr,将 w 的数据类型转换为比特串;
A6: 计算 K=KDF(C||w||IDB, klen),若 K 为全 0 比特串,则返回 A2
A7: 输出(K, C),其中 K 是被封装的密钥,C 是封装密文。


4.密钥解封装

SM9_standard_key_decap(IDB, deB, C, Klen, K_decap);

4.1

  //----------Step1:test if C is on G1-----------------

    Test_Point(Cipher))

4.2

 //----------Step2:calculate w=e(C,deB)-----------------
    !ecap(dEB, Cipher, para_t, X, &w))

4.3

 //----------Step3:K=KDF(C||w'||IDB,klen)------------------------

SM3_kdf(Z, Zlen, Klen, K);

解封装算法
用户B收到封装密文C后,为了对比特长度为klen的密钥解封装,需要执行以下运算步骤:
B1: 验证 C1 是否成立,若不成立则报错并退出;
B2: 计算群 T 中的元素 w=e(C, deB),将 w的数据类型转换为比特串;
B3: 将 C 的数据类型转换为比特串,计算封装的密钥 K=KDF(C||w||IDB, klen),若 K为全 0 比特
串,则报错并退出;
B4: 输出密钥 K


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值