赞
踩
SM2算法定义了两条椭圆曲线,一条基于F§上的素域曲线,一条基于F(2^m)上的拓域曲线,目前使用最多的曲线为素域曲线,本文介绍的算法基于素域曲线上的运算,素域曲线方程定义如下:
y
2
−
x
3
+
a
x
+
b
y^2-x^3+ax+b
y2−x3+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
牢记上面参数,在后续的运算过程中会使用到上面参数。
在SM2签名的过程除与RSA算法中私钥参与外,SM2签名还新增了公钥与用户标识(IDa),私钥我们标记为 D,公钥Pub(x,y)。
我们假设待签名消息为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 共同组成了签名结果
假设我们收到的消息原文为 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,若不相等,验证失败
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。