SM2数字签名算法由一个签名者对数据产生数字签名,并由一个验证者验证签名的可靠性。每个签名者有一个公钥和一个私钥,其中私钥用于产生签名,验证者用签名者的公钥验证签名。在签名的生成过程之前,要用密码杂凑函数对M (包含ZA和待签消息M)进行压缩;在验证过程之前,要用密码杂凑函数对M′(包含ZA和验证消息M′)进行压缩。 SM2推荐椭圆曲线参数如下: 使用素数域256位椭圆曲线 椭圆曲线方程:y2 = x3 + 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 DDBCBD41 4D940E93 n= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123 Gx= 32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7 Gy= BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0 数字签名生成流程: 关键参数说明: ZA=H256(ENT LA || IDA || a || b || xG || yG || xA || yA) (SM3算法做摘要) ENT LA : 用户ID的位长度 IDA :用户ID xA:公钥X yA:公钥Y M(—):ZA || M (ZA 与 M拼接) e: 密码杂凑函数作用于消息M的输出值(SM3(ZA||M)预处理得到的结果) k: [1,n-1]范围内的随机数 r: (e+x1)mod n (mod同余定理) S:((1+dA)-1 *(k-r*dA)) mod n (dA 用户的私钥 )
|