参考推荐:
国家密码管理局关于发布《SM2椭圆曲线公钥密码算法》公告(国密局公告第21号)_国家密码管理局
https://blog.csdn.net/u013137970/article/details/84573200
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加密流程:
- 用随机数发生器产生随机数k∈[1,n-1];
- 计算椭圆曲线点C1=[k]G=(x1,y1),并将C1的数据类型转换为比特串;
- 计算椭圆曲线点S=[h]PB,若S为无穷远点,则报错并退出;
- 计算椭圆曲线点[k] PB =(x2,y2),将坐标x2、y2的数据类型转换为比特串;
- 计算t=KDF(x2∥y2,klen),若t为全0比特串,则返回1);
- 计算C2=M⊕t;
- 计算C3=Hash(x2∥M∥y2);
- 输出密文C=C1∥C3∥C2。
解密:
设klen为C2的比特长度,对密文C=C1∥C3∥C2解密流程:
- 从C中取出比特串C1,将C1的数据类型转换为椭圆曲线上的点,验证C1是否满足椭圆曲线方程,若不满足则报错并退出;
- 计算椭圆曲线点S=[h]C1,若S为无穷远点,则报错并退出;
- 计算[dB]C1=(x2,y2),将坐标x2、y2的数据类型转换为比特串;
- 计算t=KDF(x2∥y2,klen),若t为全0比特串,则报错并退出;
- 从C中取出比特串C2,计算M’=C2⊕t;
- 计算u=Hash(x2∥M’∥y2),从C中取出比特串C3,若u≠C3,则报错并退出;
- 输出明文M’。
3、签名、验签
签名:
M为待签名消息,数字签名结果为(r,s),用户密钥对(d,P)。
- e=hash(M) --获取消息散列值;
- 产生随机数k --以便即使是同一个消息,每次签名出来的结果不同;
- 使用随机数,计算椭圆曲线点(x1,y1)=[k]G;
- r=(e+x1) mod n --判断:r=0 或者r+k=n, 继续第2步;
- s = ((1 + d)^(-1)∗(k − r∗d )) mod n,若 s = 0,继续第2步;
r,s 为签名信息。
验签:
M为明文, ( r , s ) (r, s)(r,s) 为签名结果,用户公钥P
- e=hash(M);
- t=(r+s) mod n;
- (x,y)=[s]G+[t]P;
- R=(e+x) mod n;
- 计算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等。
注:
如有错误、侵权,请联系笔者更改删除!!!