GMSSL SM9-解密流程

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||C2C2的比特长度,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)。令K1K最左边
mlen 比特,K2为剩下的K2_len比特,若 K1为全0 比特串,则报错并退出;
2) 计算 M=C2K1
b) 如果加密明文的方法是结合密钥派生函数的分组密码算法,则
1) 计算整数 klen=K1_len+K2_len,然后计算K=KDF(C1||w||IDB,klen)。令K1K最左
边的
K1_len比特,K2为剩下的K2_len比特,若 K1为全0 比特串,则报错并退出;
2) 计算 M=Dec(K1,C2)
B4: 计算 u=MAC(K2,C2),从C 中取出比特串 C3,若uC3,则报错并退出;
B5: 输出明文 M

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值