GMSSL SM9-解密流程
源代码参见\GmSSL-master\engines\sm_standard\sm9\sm9_standard_enc.c
解密函数:
int SM9_standard_decrypt(unsigned char C[], int C_len, unsigned char deB[], unsigned char *IDB, int EncID,int k1_len, int k2_len, unsigned char M[], int * Mlen)
unsigned char C[]:待解密的密文
int C_len:待解密的密文长度
unsigned char deB[]:
unsigned char *IDB:"Bob";字符串;用户标识;
int EncID:
int k1_len:
int k2_len:
unsigned char M[]:
int * Mlen:密文中,加密的明文(内容部分)的长度
解密过程参见《SM9标识密码算法第四部分密钥封装机制和公钥加密算法》P10 5.2解密算法及流程
1.取出C去,并验证其是否为椭圆曲线上的点
//Step1:get C1,and test if C1 is on G1
epoint_set(x, y, 1, C1);
2.
//Step2:w = e(C1, deB)
ecap(dEB, C1, para_t, X, &w))
3.
//Step3:Calculate plaintext
4.
//Step4:calculate u=MAC(K2,C2)
解密算法
设 mlen 为密文C=C1||C3||C2中 C2的比特长度,K1_len为分组密码算法中密钥 K1的比特长度,K2_len为函数MAC(K2,Z)中密钥K2的比特长度。
为了对 C 进行解密,作为解密者的用户B 应实现以下运算步骤:
B1: 从 C中取出比特串 C1,将C1的数据类型转换为椭圆曲线上的点,验证 C11 是否成立,若
不成立则报错并退出;
B2: 计算群 T中的元素 w’=e(C1,deB),将w’的数据类型转换为比特串;
B3: 按加密明文的方法分类进行计算:
a) 如果加密明文的方法是基于密钥派生函数的序列密码算法,则
1) 计算整数 klen=mlen+K2_len,然后计算K’=KDF(C1||w’||IDB,klen)。令K1’为K’最左边
的 mlen 比特,K2’为剩下的K2_len比特,若 K1’为全0 比特串,则报错并退出;
2) 计算 M’=C2⊕K1’。
b) 如果加密明文的方法是结合密钥派生函数的分组密码算法,则
1) 计算整数 klen=K1_len+K2_len,然后计算K’=KDF(C1||w’||IDB,klen)。令K1’为K’最左
边的 K1_len比特,K2’为剩下的K2_len比特,若 K1’为全0 比特串,则报错并退出;
2) 计算 M’=Dec(K1’,C2)。
B4: 计算 u=MAC(K2’,C2),从C 中取出比特串 C3,若uC3,则报错并退出;
B5: 输出明文 M’。