Page 25 - 《软件学报》2025年第10期
P. 25
4422 软件学报 2025 年第 36 卷第 10 期
链, 将待签名的消息摘要信息处理后映射到对应的链节点如图 3(b) 中深色节点, 被映射到的链节点将作为签名块
记录到最后生成的签名值中. 本节将详细介绍 SM3-OTS 签名过程中的具体映射方式.
(a) 哈希链 (b) 签名值
图 3 哈希链映射
首先使用国密算法 SM3 对待签名的消息 M 做哈希运算: m = H(M), 得到 32 字节的消息摘要值, 使用 m_bin
m_hex 记录下消息摘要的十六进制信息. 32 字节消息摘要的二进制形式每 8
记录下消息摘要的二进制信息, 使用
位比特可以转为 32 组 0–255 之间的十进制数字. 使用消息摘要转换后的十进制数字分别作为前 32 条哈希链 L 0 −
L 31 中链节点位置的索引, 将索引到的链节点作为 SM3-OTS 签名值中的前 32 个签名块, 记为 σ 0 ,σ 1 ,...,σ 31 . 例如
“Hello World!”经过 SM3 算法计算出的消息摘要值为 0AC0A9FEF0D212AA76A3C431F793853CE145659CA1D14B114
E96C1215CF26582. 其中第 1 个字节为 0A, 转换为二进制为 00001010, 则其对应的十进制数字为 10, 将第 1 个私
钥块 sk 0 做 10 次哈希运算得到第 1 个签名块 σ 0 . 摘要中第 2 个字节为 C0, 转换为二进制的结果为 11000000, 则其
对应的十进制数字为 192, 将第 2 个私钥块 sk 1 做 192 次哈希运算得到第 2 个签名块 σ 1 , 摘要中第 3 个字节为 A9,
转换为二进制的结果为 10101001, 则其对应的十进制数字为 169, 将第 3 个私钥块 sk 2 做 169 次哈希运算得到第 2
个签名块 σ 2 , 以此类推, 计算出 0–31 号哈希链对应的签名块, 如表 3 所示.
表 3 过程参数与签名 (部分省略)
哈希链 哈希值中的信息 对应值 index 签名块
10
0 0A 10 10 H (sk 0 )
1 C0 192 192 H 192 (sk 1 )
… … … … …
31 82 130 130 H 130 (sk 31 )
15
32 0 15 15 H (sk 32 )
33 1 362 107 H 107 (sk 33 )
… … … … …
92
40 8 92 92 H (sk 40 )
41 9 123 123 H 123 (sk 41 )
98
42 A 98 98 H (sk 42 )
46
43 B 46 46 H (sk 43 )
… … … … …
47 F 100 100 H 100 (sk 47 )
15
98
10
σ = H (sk 0 ),...,H 130 (sk 31 ),H (sk 32 ),...,H 123 (sk 41 ),H (sk 42 ),...,H 100 (sk 47 )
32 字节消息摘要的十六进制形式包含 64 个 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F 中的数据元素, 以十六进
制形式的消息摘要下第 1 个元素的位置定义为 1, 最后一个元素的位置定义为 64, 计算出 0–F 的每个元素所在位
置的和作为每个元素的位置信息, 将每个元素的位置信息模除 255, 元素 0 的位置信息为 1+4+10=15, 将计算出的
位置信息模除 255 得到 15, 将私钥块 sk 32 做 15 次哈希运算得到第 33 个签名块 σ 32 . 元素 1 的位置信息经计算为

