Page 99 - 《软件学报》2025年第10期
P. 99
4496 软件学报 2025 年第 36 卷第 10 期
层的根节点, 下面将解释计算超树签名的生成过程.
ht_sig(PK.seed,SK.seed,ADRS,idx_tree,idx_leaf) → SIG ht : 轻节点利用该算法用于生成 HT ht_sig 算
签名. 在
法中, 输入包括 SK.seed、PK.seed、idx 和 ADRS , 其中, idx 用于选择对消息签名的超树叶子节点. 该算法首先通
AUTH[ j], 然后利用哈希函数依次从底部叶子节点向上生成树的节点哈希值, 哈希
过设置相关参数生成认证路径
函数 H 见第 2.2 节, 最后输出签名 SIG ht . 注意, idx 是作为两个单独的参数传递的: 一个参数处理树索引, 而另一个
参数表示该树中的叶子索引. 具体来说, 算法通过 ADRS.setTreeIdx 函数调用树节点的索引地址, 并逐层生成每一
层的认证路径节点. 根据认证路径中的相邻节点 (通过 AUTH j 获取), 递归计算出节点, 最终合并得到树根节点
[ ]
root. 详细过程见算法 7, 其中 h 表示 HT 中 Merkle 树的高度, 有关 ADRS 和部分函数操作, 例如 SIG XMSS ,ADRS.set
′
等函数, 具体请参考文献 [30].
算法 7. ht_sig.
输入: PK.seed, SK.seed, ADRS, idx_tree, idx_leaf ;
输出: SIG ht , root.
1. ADRS.setLayerAddr(0);
2. ADRS.setTreeAddr(idx_tree);
3. for j = 0 to do
′
h
4. AUTH[ j] = SIG XMSS .getAUTH( j);
5. ADRS.setTreeHeight( j+1);
j
6. if (idx/2 )%2 == 0 do
7. ADRS.setTreeIdx(ADRS.getTreeIdx()/2);
8. node[1] = H(PK.seed,ADRS,(node[0]||AUTH[j]));
9. else
10. ADRS.setTreeIdx(ADRS.getTreeIdx()−1)/2);
11. node[1] = H(PK.seed,ADRS,(AUTH[j]||node[0]));
12. endif
13. endfor
14. root = node[0];
15. for j = 1 to d −1 do
16. idx_leaf = idx_tree 中前 ⌊h/d⌋ bits;
17. idx_tree = idx_tree 中后 ⌊h−( j+1)×(h/d)⌋ bits;
18. ADRS.setLayerAddr( j);
19. ADRS.setTreeAddr(idx_tree);
20. ADRS.setType(BW_hash);
21. ADRS.setKeypairAddr(idx);
22. 根据算法 1 生成签名 SIG bw ;
;
23. tmp = SIG bw ||AUTH SIG ht [] = NULL;
24. SIG ht = SIG ht ||tmp;
25. endfor
26. return SIG ht ,root
4.5 认 证
在本节中, 我们验证承诺的有效性和证明的正确性. 只有当两者都通过认证时, 对应的 key 才通过认证. 详细

