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: 验证 C 1 是否成立,若不成立则报错并退出;
B2: 计算群 T 中的元素 w’=e(C, deB),将 w’的数据类型转换为比特串;
B3: 将 C 的数据类型转换为比特串,计算封装的密钥 K’=KDF(C||w’||IDB, klen),若 K’为全 0 比特
串,则报错并退出;
B4: 输出密钥 K’。