12、SM2算法

参考推荐:

国家密码管理局关于发布《SM2椭圆曲线公钥密码算法》公告(国密局公告第21号)_国家密码管理局

https://blog.csdn.net/u013137970/article/details/84573200

SM2算法_无名函数的博客-CSDN博客

国密SM2算法_zcc0721的博客-CSDN博客

图解SM2算法流程(合)_艾米的爸爸的博客-CSDN博客


SM2算法

SM2算法是国家密码据于2010年12月17日发布的国密标准椭圆曲线加密算法。对于一般椭圆曲线的离散对数问题,目前只存在指数级计算复杂度的求解方法。与大数分解问题及有限域上离散对数问题相比,椭圆曲线离散对数问题的求解难度要大得多。因此,在相同安全程度要求下,椭圆曲线密码较其他公钥密码所需的秘钥规模要小得多。

SM2算法数学基础

有限域Fq:q是一个奇素数或者是2的方幂。当q是奇素数p时,要求p > 2^191 ;当q是2的方幂2^m 时,要求m > 192且为素数。

素域Fp:

当q是奇素数p时,素域F p 中的元素用整数0,1,2,··· ,p−1表示。

1) 加法单位元是整数0;

2) 乘法单位元是整数1;

3) 域元素的加法是整数的模p加法,即若a,b∈Fp,则a+b = (a+b) modp;

4) 域元素的乘法是整数的模p乘法,即若a,b∈Fp,则a·b = (a·b) modp。

有限域上的椭圆曲线:有限域F q 上的椭圆曲线是由点组成的集合。在仿射坐标系下,椭圆曲线上点P(非无穷远点)的坐标表示为P=(xP,yP),其中xP,yP为满足一定方程的域元素,分别称为点P的x坐标和y坐标。

椭圆曲线离散对数问题:

已知椭圆曲线E(Fq )、阶为n的点P ∈ E(Fq )及Q ∈〈P〉,椭圆曲线离散对数问题是指确定整数l∈[0,n−1],使得Q = [l]P成立。

椭圆曲线离散对数问题关系到椭圆曲线密码系统的安全,因此必须选择安全的椭圆曲线。

SM2算法推荐使用素数域256位椭圆曲线,推荐曲线方程为:

曲线参数:

p=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF

a=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC

b=28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93

n=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123

SM2算法流程

1、参数生成

输入:一个有效的Fq (q = p且p为大于3的素数,或q = 2 m )上椭圆曲线系统参数的集合。

输出:与椭圆曲线系统参数相关的一个密钥对(d,P)。

1) 用随机数发生器产生整数d∈[1,n−2];

2) G为基点,计算点P = (xP ,yP ) = [d]G;

3) 密钥对是(d,P),其中d为私钥,P为公钥。

2、加解密

加密:

设需要发送的消息为比特串M,klen为M的长度,对M加密流程

  1. 用随机数发生器产生随机数k∈[1,n-1];
  2. 计算椭圆曲线点C1=[k]G=(x1,y1),并将C1的数据类型转换为比特串;
  3. 计算椭圆曲线点S=[h]PB,若S为无穷远点,则报错并退出;
  4. 计算椭圆曲线点[k] PB =(x2,y2),将坐标x2、y2的数据类型转换为比特串;
  5. 计算t=KDF(x2y2,klen),若t为全0比特串,则返回1);
  6. 计算C2=Mt;
  7. 计算C3=Hash(x2∥M∥y2);
  8. 输出密文C=C1∥C3∥C2。

 解密:

 设klen为C2的比特长度,对密文C=C1∥C3∥C2解密流程

  1. 从C中取出比特串C1,将C1的数据类型转换为椭圆曲线上的点,验证C1是否满足椭圆曲线方程,若不满足则报错并退出;
  2. 计算椭圆曲线点S=[h]C1,若S为无穷远点,则报错并退出;
  3. 计算[dB]C1=(x2,y2),将坐标x2、y2的数据类型转换为比特串;
  4. 计算t=KDF(x2∥y2,klen),若t为全0比特串,则报错并退出;
  5. 从C中取出比特串C2,计算M’=C2⊕t;
  6. 计算u=Hash(x2∥M’∥y2),从C中取出比特串C3,若uC3,则报错并退出;
  7. 输出明文M’

3、签名、验签

签名:

M为待签名消息,数字签名结果为(r,s),用户密钥对(d,P)。

  1. e=hash(M) --获取消息散列值;
  2. 产生随机数k --以便即使是同一个消息,每次签名出来的结果不同;
  3. 使用随机数,计算椭圆曲线点(x1,y1)=[k]G;
  4. r=(e+x1) mod n --判断:r=0 或者r+k=n, 继续第2步;
  5. s = ((1 + d)^(-1)∗(k − r∗d )) mod n,若 s = 0,继续第2步;

r,s 为签名信息。

验签:

M为明文, ( r , s ) (r, s)(r,s) 为签名结果,用户公钥P

  1. e=hash(M);
  2. t=(r+s) mod n;
  3. (x,y)=[s]G+[t]P;
  4. R=(e+x) mod n;
  5. 计算R是否等于r;

签名验证原理:

[s]G + [t]P = sG + (r + s)P= sG + (r + s)dG

                 = sG + sdG + rdG

                 = (1 + d)sG + rdG

                 = (1 + d)(1 + d)^{-1} * (k − rd)G + rdG

                 = (k − rd)G + rd

                 = kG − rdG + rdG

                 = kG = (x1, y1)

SM2算法相关

1、SM2算法特点

SM2算法与RSA对比:

SM2

RSA

算法结构

基本椭圆曲线(ECC

基于特殊的可逆模幂运算

计算复杂度

完全指数级

亚指数级

存储空间

192-256bit

2048-4096bit

秘钥生成速度

RSA算法快百倍以上

解密加密速度

较快

一般

SM2性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小。

2、SM2算法应用

国密数字证书、国密SSL等。

注:

如有错误、侵权,请联系笔者更改删除!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三九笔墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值