本节讲了SM2签名算法,总体过程与secp256k1签名过程类似
上一节说了sm2与KDF密钥导出函数并且整理20-30篇目录。KDF在密码学中用途很多,当然不局限sm2.
本文详细说说sm2的签名和验证过程。
假设用户A作为签名者,拥有长度为$entlen_A$比特的可辨别标识$ID_A$,私钥$d_A$, 公钥$P_A=(x_A,y_A)$ , 待签名的消息为M 。
预计算出 $ZA=H{256}(entlen_A | ID_A |a |b |G_x |G_y |x_A | y_A)$
在签名的时候,如果不指定用户身份标识ID参数,该参数是有默认值的。默认值为
0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38
流程图可表示如下:
作为验证者的用户B,为了检验收到的消息M及其数字签名(r, s),执行以下步骤:
[注:$H_v$表示消息摘要长度为v比特的杂凑算法或者哈希算法,没什么特别之处] 流程图可表示如下:
凡事多问个为什么总是好习惯,为什么可以这样来验证?
验证的关键是验签步骤计算的点$(x_1,y_1)$ 等于签名步骤中产生的点 $(x_1,y_1)$ 看下具体推导: $sG +tP_A=sG+sP_A+rP_A$ $=sG +sd_AG +r d_AG$ $=(1+d_A) \times sG +r d_AG$ $=(k-r d_A)G +r d_AG$ $=KG=(x_1,y_1)$
所以R == r
可以看到整个过程与secp256k1签名和验证过程较为相似,关于后者可在本文最后相关阅读中找到。
本节讲了SM2签名算法,总体过程与secp256k1签名过程类似,不难理解,没有举例子说明,感兴趣的朋友自己选取数据实际操练一下。
本文内容主要参照 《《GBT 32918.2-2016 信息安全技术 SM2椭圆曲线公钥密码算法 第2部分:数字签名算法》GM/T0009-2012《SM2密码算法使用规范》
好了,下一篇继续说sm2的密钥协商过程。
欢迎关注公众号:blocksight
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!