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

2021SC@SDUSC

一、

SM2使用素数域256位椭圆曲线

椭圆曲线参数方程:y^{2}=x^{3}+ax+b

曲线参数:

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 DDBCBD414D940E93

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

xG一32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7

yG一BC3736A2 F4F6779C 59BDCEE3 6B692153 DOA9877C C62A4740 02DF32E5 2139F0AO

二、SM2-ECDSA算法与SM2算法的区别

        2010 年12月,为满足电子认证服务系统等应用需求,在国家商用密码管理管理办公室发布了国家密码管理局公告(第21号),发布SM2椭圆曲线公钥密码算法。加上原来的SM1商密对称算法,中国自主定义的算法终于开始以自信、大方的姿态走上商用密码舞台。
        前面的文章介绍了ECDSA算法,在SM2中的椭圆曲线数字签名算法,通过查阅文章后(《国密SM2数字签名算法与ECDSA算法对比分析研究》),找到了两个算法的一些区别。

 1.文章给出了SM2数字签名算法的正确性证明

先来回顾一下两个算法的签名以及验签过程:

ECDSA签名以及验签过程:

ECDSA签名的生成:

输入:参数组D(q, FR, S, a,b,P,n,h),私钥d,消息m。

输出:签名(r,s)。

(1)选择随机数k ∈[1,n-1];

(2)计算 kP=(x,y)),并将x_{1}转化为整数z;

(3)计算r=z mod n,若r=0,跳至步骤1;

(4)计算e=H(m);

(5)计算 s=k^{-1}(e+dr)\bmod n。若s=0,则跳至步骤1;

(6)返回(r,s)。

ECDSA签名的验证:

输入:参数组D(q, FR,S, a, b, P, n, h),公钥Q,消息m,签名(r,s)。

输出:判断签名是否合法。

(1)检验r,s ∈[1,n-1],若不成立,返回拒绝签名;(2)计算e=H(m);

(3)计算w=s^{-1} \bmod n;

(4)计算u_{1}=ew \bmod nu_{2}=rw \bmod n;

(5)计算X=u_{1}P+u_{2}Q;

(6)若X=\infty,返回(“拒绝该签名”);

(7)将X的x坐标转化为整数z,计算v=z\bmod n;

(8)若v=r,则返回(“接受该签名”),否则返回(“拒绝该签名”)。

SM2椭圆曲线签名算法签名过程:

1.置\overline{M}=Z_{A}\left | \right |M

2.计算e=H_{V}(\overline{M}),将e转化为整数;

3.用随机数发生器产生随机数k∈[1,n-1];

4.计算椭圆曲线点(x_{1},y_{1})=kG,将x_{1}转化为整数

5.计算r=(e+x_{1})\bmod n,若r=0或者r+k = n,则返回3;

6.计算s=(1+d_{A})^{-1}\cdot (k-r\cdot d_{A})\bmod n,若s=0,则返回3

7.将转化为字节串,消息M的签名为(r,s)。

SM2椭圆曲线数字签名算法验签步骤:

为了验证收到的消息M'及其数字签名(r',s'),作为验证者用户B实现以下运算步骤

1.检验r{}'\in [1,n-1]是否成立,若不成立验证不通过;

2.检验s{}'\in [1,n-1]是否成立,若不成立验证不通过;

3.置\overline{M{}'}=Z_{A}\left | \right |M{}'

4.计算e{}'=H_{V}(\overline{M{}'}),将e'化为整数

5.将r',s'转化为整数,计算t=({r}'+{s}') \bmod n,若t =0,则验证不能通过;

6.计算椭圆曲线点(x_{1}{}',y_{1}{}')=s{}'G+tP_{A}

7.将{x_{1}}'化为整数,计算t=({e}'+{x_{1}}')\bmod n,检验R=r'是否成立,若成立,验证通过,否则验证不通过。

SM2数字签名算法的签名和验证依赖于椭圆曲线的上两个点 (x1,y1)与(x1',y1')这两点应该是相等的,如果签名结果没有被篡改过,应该有({r}',{s}')=(r,s)

那么如何证明 (x_{1},y_{1})=({x_{1}}',{y_{1}}')呢?

因为r=(e+x_{1})\bmod n,s=(1+d_{A})^{-1}\cdot (k-r\cdot d_{A})\bmod n,所以(x_{1}{}',y_{1}{}')=s{}'G+tP_{A} = s{}'G+(r{}'+s{}')\cdot d_{A}G=(1+d_{A})s{}'G+r{}'\cdot d_{A}G = (1+d_{A})(1-d_{A})^{-1}-1\cdot (k-r\cdot d_{A})G=(k-r\cdot d_{A})G+r{}'d_{A}G=kG=(x_{1},y_{1})

2.对比分析

①对待签名消息预处理

ECDSA中,对待签名消息M不做人任何处理,但在SM2中,需要将M变为\overline{M}=Z_{A}\left | \right |M

②哈希算法

ECDSA没有规定使用哈希算法,在SM2椭圆曲线数字签名算法中使用的哈希算法是SM3

③安全性

攻击ECDSA都需要解决两个椭圆曲线离散对数问题,SM2椭圆曲线数字签名算法和ECDSA安全性是一个级别,SM2椭圆曲线数字签名算法安全性相对高一些。

猜你喜欢

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