GMSSL :SM2椭圆曲线公钥密码算法-公钥加密算法

2021SC@SDUSC 

目录

一、简介

二、算法详情

三、密钥派生函数


一、简介

公钥加密算法规定发送者用接收者的公钥将消息加密成密文,接收者用自己的私钥对收到的密文进行解密还原成原始消息。

与密钥交换协议一样,需要相同的三个辅助函数

密码杂凑函数:哈希函数。Hash函数H将可变长度的数据块M作为输人,产生固定长度的 Hash值h = H(M)。

密钥派生函数:作用在密钥交换所获共享的秘密比特串上,从中产生所需的会话密钥或进一步加密所需的密钥数据。

会话密钥:是保证用户跟其它计算机或者两台计算机之间安全通信会话而随机产生的加密和解密密钥。会话密钥贯穿各个会话始终,这个密钥与各个消息一起传输,并使用接收者的公共密钥加密。由于其大部分安全性依赖于其使用时间的短暂性,会话密钥常常频繁更改。各个消息可能使用不同的会话密钥。

随机数发生器

二、算法详情

加密算法:

 可以看出密文由三部分(C_{1},C_{2},C_{3})连接而成.其中C1涉及到椭圆曲线上得点的乘法,C2需要点坐标与明文连接再进行哈希,C2则需要用到密钥派生函数。

其中有一步是要计算S=\left [ h \right ]P_{B},这个h叫做余因子,有时也叫协因子,是椭圆曲线有限域的阶与基点G的比值。通常情况下取h,可以时的穷举攻击的可能性接近于0.

解密算法:

流程图:

三、密钥派生函数

下面来详细看一下这个密钥派生函数

 

 这个派生函数需要调用一个杂凑函数

①先算klen÷ v,向上取整举个栗子:9÷ 2=4.5,向上取整得5。

②下面的步骤就相当于一个for函数

for (i=1,i<\left \lceil klen/v \right \rceil,i++,ct++){

H_{ai}=H_{v}(Z\parallel ct)

}

if klen\bmod v=0{

H_{a\left \lceil klen/v \right \rceil}=H_{a\left \lceil klen/v \right \rceil}

}else{

H_{a\left \lceil klen/v \right \rceil}等于H_{a\left \lceil klen/v \right \rceil}左边的keln-v\cdot \left \lfloor klen/v \right \rfloor

}

③最后将算的H_{a1},H_{a2},H_{a3},\cdots ,H_{a\left \lceil klen/v \right \rceil-1},H_{a\left \lceil klen/v \right \rceil}连接起来

用一个简单的例子实现上述过程,假设我们最后想要输出9位的比特串,既klen=9,杂凑函数每次的输出只有2位,既v=2,\left \lceil 9/2 \right \rceil=5,for(i=1,i<5,i++),会循环四次,四次分别计算出H_{a1},H_{a2},H_{a3},H_{a4}H_{a1},H_{a2},H_{a3},H_{a4},H_{a5},也就是四次循环算出来了\left \lfloor keln/v \right \rfloor*v=\left \lfloor 9/2 \right \rfloor*2=8位比特,由于9÷2不是整数,所以H_{a5}的结果左边keln-\left \lfloor keln/v \right \rfloor*v=9-\left \lfloor 9/2 \right \rfloor*2=1位的比特串,经过最后这一步截取,将H_{a1},H_{a2},H_{a3},H_{a4},H_{a5}连接起来,得到9位的比特串。

猜你喜欢

转载自blog.csdn.net/vincy_yeha/article/details/122161906