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 才通过认证. 详细
   94   95   96   97   98   99   100   101   102   103   104