Page 97 - 《软件学报》2025年第10期
P. 97
4494 软件学报 2025 年第 36 卷第 10 期
ADRS 中 tree index 部分计算为:
tree_index = i×t +idx[i] (8)
私钥利用 SK.seed 和 ADRS 通过 PRF 来生成:
dforc sk = PRF(SK.seed,ADRS) (9)
2
1
′ leaf[q][w +1] = [F ,F , sk[q]], 表示
′
然后, 我们迭代地将 F 应用于每个私钥 w 次, 将每次哈希的结果添加到
第 q 个叶子节点上的哈希链上节点, 其中 F 见第 2.2 节的说明. 每个哈希值作为哈希链上节点, 最后哈希的节点作
为叶子节点, 接着从叶子节点开始, 根据算法 3 中的第 3–18 行来生成每层的节点, 直到根节点.
4.3.3 生成证明
′ md 、
′
dforc_sig(PK.seed,ADRS,SK.seed,idx,md ) → SIG dforc : 全节点通过该算法来生成对应的证明. 该算法输入
idx, 输出 DFORC k(log(t)+1) 的字符串数
SK.seed、PK.seed、ADRS 和 签名 SIG dforc , 即 proof . 该 proof 是长度为
组, 其中 k 是 Merkle 树的数量, t 是叶子节点的数量, 包含从叶子节点到根节点的认证路径上的节点. 每个认证路
径的元素由 n 字节的私钥和树中节点组合而成, 认证路径见图 1 所示. 在实际生成过程中, 认证路径的每个节点都
使用 SK.seed 和 ADRS 通过伪随机函数 PRF 进行计算. 对于每个 key, 算法通过遍历 Merkle 树来生成相应的认证
路 径 , 并 将 这 些 路 径 与 签 名 组 合 , 输 出 完 整 的 proof . 具 体 过 程 见 算 法 4 , 有 关 ADRS 的 操 作 和 部 分 函 数
(SIG XMSS .getAUTH) 参考文献 [30].
算法 4. dforc_sig.
输入: PK.seed, SK.seed, ADRS, idx, md ;
′
输出: SIG dforc .
1. for i = 0 to k −1 do
2. ADRS.setTreeHeight(0);
3. ADRS.setTreeIdx(i×t +idx[i]);
4. SIG dforc [i] = PRF(SK.seed,ADRS);
5. for j = 0 to a−1 do
j
6. s = (idx/2 )⊕1;
7. AUTH[j] = SIG XMSS .getAUTH(j);
8. endfor
9. SIG dforc = SIG dforc [i]||AUTH[j];
10. endfor
11. return SIG dforc
4.4 超树构造
在本节中, 我们详细阐述超树的构造过程. 由于超树中的叶子节点都是平衡 WOTS+ (BW) 的公钥, 所以首先
介绍 BW, 然后基于 BW 来构造超树.
4.4.1 BW 签名
w×l 次 (见第 2.2 F (sk i ) 时, 私钥的地址在每次迭代都会发生
w
F
首先需要调用 节) 来生成相应的 bw pk . 当计算
PK.seed 被结合使用, 用于计算新的哈希值, 并且更新后的地址会对
变化. 每次迭代过程中, 地址 ADRS 和公钥种子
应当前节点在哈希链中的位置, 并将其用作下一步计算的输入. 这样设计确保每个哈希步骤的不可预测性, 增强了
签名方案的抗量子攻击能力. 该过程详细描述于算法 5, 通过对哈希和私钥地址的更新, 输出哈希链中的每一次迭
代的哈希值, i 表示开始索引, 有关 ADRS 的操作参考文献 [30].

