SM2签名与验证过程

1. SM2基本介绍

SM2算法定义了两条椭圆曲线,一条基于F§上的素域曲线,一条基于F(2^m)上的拓域曲线,目前使用最多的曲线为素域曲线,本文介绍的算法基于素域曲线上的运算,素域曲线方程定义如下:
y 2 − x 3 + a x + b y^2-x^3+ax+b y2x3+ax+b
SM2算法定义了5个默认参数,即有限域F§的规模p,椭圆曲线参数a,b,椭圆曲线的基点G(x,y),与G的阶n。

国密算法标准中给出了对应的默认值,默认值如下:

p:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
n:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
a:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
b:28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
Gx:32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7
Gy:BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0

牢记上面参数,在后续的运算过程中会使用到上面参数。

2. SM2签名与验证的参数

在SM2签名的过程除与RSA算法中私钥参与外,SM2签名还新增了公钥与用户标识(IDa),私钥我们标记为 D,公钥Pub(x,y)。

3.SM2签名过程

我们假设待签名消息为M,我们要先对消息进行预处理,处理过程如下:

Za = HASH256(ENTL||IDa||a||b||Gx||Gy||Pubx||Puby)

ENTL是用户标识(IDa)的长度,占两个字节的长度。

A1: M' = Za || M

A2: e = Hash(M'),将e转换成一个大整数

A3:产生随机数 k , k的范围在 [1, n-1]上

A4:计算点(x1,y1) = kG,将x1转换为一个大整数

A5:计算 r = (e + x1) mod n , 若 r = 0 或 r + k = n 返回A3重新选择随机数

A6:计算 s = ((1 + D)^-1 · (k - r · D)) mod n , 若 s = 0 返回A3重新选择随机数

A7:将 r 与 s 转换成大整数,r 与 s 共同组成了签名结果

4. SM2 签名验证

假设我们收到的消息原文为 M,签名值为(r,s),对于该签名的验证流程如下:

B1: r 的范围是否在 [1, n-1] 中,如不在,验证失败

B2: s 的范围是否在 [1, n-1] 中,如不在,验证失败

B3:M' = Za || M

B4:e = Hash(M'),将e转换成一个大整数

B5:计算 t = (r + s) mod n ,若 t = 0,验证失败

B6:计算点(x1,y1)= [s]G + [t]Pub(x,y)

B7: 计算 R = (e + x1) mod n,检验 R = r,若不相等,验证失败

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值