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

