Page 26 - 《软件学报》2025年第10期
P. 26

杨亚涛 等: SM3-OTS: 基于国密算法      SM3  的紧凑型后量子一次签名方案                                  4423


                 362, 将  362  模除  255  后得  107, 将私钥块  sk 33  做  107  次哈希运算得到第  34  个签名块  σ 33 . 以此类推, 使用每个元素
                 位置信息模除     255  后的数据作为后    16  条哈希链  L 32 L 47  中链节点位置的索引, 将索引到的链节点作为           SM3-OTS
                                                          –
                 签名值中的后     16  个签名块, 记为  σ 32 ,σ 33 ,...,σ 47 , 如表  3  所示.
                    所以  SM3-OTS  方案生成的签名值为       σ = σ 0 ,σ 1 ,...,σ 47 . 签名生成算法如算法  2  所示.
                 算法  2. 签名生成  Sign  算法.

                 输入: 待签名的消息      M, 私钥集合   sk = sk 0 , sk 1 ,..., sk 47 ;
                         σ = σ 0 ,σ 1 ,...,σ 47 .
                 输出: 签名
                 1.     m = H(M) //计算消息  M  的摘要值
                 2.     m_bin ⇐ m //将摘要值转为二进制形式存储到     m_bin 中
                 3.     a = base_8(m_bin) //将  m_bin 中每  8  个比特转为一个十进制数据存储到  a 中
                 4.   for  0 ⩽ i ⩽ 31
                 5.      step[i] = a[i]
                 6.      σ i = H  step[i] (sk i ) //将私钥块分别做  step[i] 次哈希运算得到对应签名块
                 7.   end for
                 8.    hex_symbols = 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
                 9.    m_hex ⇐ m
                 10. for  0 ⩽ i ⩽ 15

                 11.    sum[i] = 0
                 12.  for  1 ⩽ j ⩽ 64
                 13.   if  m_hex[j] = hex_symbols[i] //计算每个字符的位置信息
                 14.      sum[i] = sum[i]+ j
                 15.   end if
                 16.  end for
                 17.  step[i+32] = sum[i](mod 255) //将每个字符的位置信息值模  255
                 18.  σ i+32 = H step[i+32] (sk i+32 ) //将私钥块分别做  step[i+32] 次运算得到对应签名块
                 19. end for
                 20. return  σ = σ 0 ,σ 1 ,...,σ 47  //返回签名值


                  4.3   SM3-OTS  签名验证
                    SM3-OTS  签名验证的过程是从签名值中还原公钥的过程. SM3-OTS                的公钥是由对应私钥经过计算生成的,
                 每条哈希链中间节点为对应私钥块生成公钥块的过程节点, 所以公钥值可以由私钥计算得到的, 同样可由哈希链
                 中间节点经相应的计算获得. 例如图           4  中  4  号链生成的对应签名块为对应私钥块做           2  次哈希运算得到, 所以对该
                 签名块做   3  次哈希运算即可得到对应的公钥块.

                                           1
                                           2
                                           3
                                           4
                                                       图 4 签名链

                    签名验证者对消息的处理过程同签名生成部分类似, 验证者首先计算消息摘要的二进制和十六进制两种形
                 式, 计算消息摘要二进制形式下每          8  位比特为一组的     32  组十进制数字, 计算出消息摘要十六进制形式下元素               0–F
   21   22   23   24   25   26   27   28   29   30   31