数字签名是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。目前主流的签名算法有RSA数字签名算法和DSA数字签名算法,而国密算法SM2也同样可以用作于数字签名算法。下面我们就来了解一下SM2算法在数字签名中的应用。

ECDSA数字签名算法

首先,SM2算法是一种基于椭圆曲线的密码算法,与ECC算法类似。而在数字签名领域中,DSA算法结合ECC,称为ECDSA数字签名算法。

ECDSA

对于椭圆曲线密码算法而言,最重要的是选择一条命名曲线,包括几个重要的参数:p、a、b、G(x,y)和n。而在ECDSA算法中,有三个参数很重要:

  1. 命名曲线。
  2. G,椭圆曲线的基点。
  3. n,相当于G基点的打点次数。

ECDSA签名算法密钥对的生成为:

  • 选择一个随机数作为私钥d, 1 < d < n -1
  • 基于私钥生成公钥,P(x, y) = d * G(x, y)

签名生成

下面的步骤中,M是消息,HASH(M)是对消息进行摘要运算。d为私钥,P为公钥。

  1. 生成一个随机数k,1 < k < n -1
  2. 计算(x, y) = k * G
  3. 计算r = x mod n
  4. 计算s = (k**-1 * (HASH(M) + d*r)) mod n
  5. 得到签名值(r, s)。

验证签名

  1. 将签名转化为两个数r和s,假如r和s小于1或者大于n-1,验证直接失败。
  2. 计算c = (s)**-1 mod n
  3. 计算u1 = ((HASH(M)) * c) mod n
  4. 计算u2 = ((r) * c) mod n
  5. 计算(x, y) = u1 * G + u2 * P
  6. 如果r = x mod n,则签名验证成功,否则失败。

SM2数字签名算法

虽然SM2也是一种椭圆曲线(EC)密码算法,但它和标准ECDSA的流程并不完全相同。

SM2

签名生成

设待签名的消息为M,为了获取消息M的数字签名(r,s),作为签名者的用户A应实现以下运算步骤:

  1. 置M=ZA||M;
  2. 计算e=Hv(M),将e的数据类型转换为整数;
  3. 用随机数发生器产生随机数k∈[1,n-1];
  4. 计算椭圆曲线点(x1,y1)=[k]G,将x1的数据类型转换为整数;
  5. 计算r=(e+x1)modn,若r=0或r+k=n则返回第3步;
  6. 计算s=((1+dA)-1·(k-r·dA))mod n,若s=0则返回第3步;
  7. 将r、s的数据类型转换为字节串,消息M的签名为(r,s)。

签名验证

  1. 检验r'∈[1,n-1]是否成立,若不成立则验证不通过;
  2. 检验s'∈[1,n-1]是否成立,若不成立则验证不通过;
  3. 置M'=ZA||M';
  4. 计算e'=Hv(M'),将e'的数据类型转换为整数;
  5. 将r'、s'的数据类型转换为整数,计算t=(r'+s')modn,若t=0,则验证不通过;
  6. 计算椭圆曲线点(x1',y1')=[s']G+[t]PA
  7. 将x1'的数据类型转换为整数,计算R=(e'+x1')modn,检验R=r'是否成立,若成立则验证通过;否则验证不通过。

SM2

SM2数字签名算法和ECDSA数字签名算法的不同

  1. 对消息的处理不同,国密签名算法对消息进行了处理,然后才计算摘要。其中 ZA 的计算涉及到命名曲线参数的a、b、G、P。
  2. SM2数字签名算法签名生成的5、6步的运算和ECDSA的第3、4步不一样。
  3. 国密签名过程中,如果出现不合法的值,需要返回到第3步,重新生成随机数,直到值合法。

免责声明:素材源于网络,如有侵权,请联系删稿。