Page 96 - 《软件学报》2025年第10期
P. 96

张川 等: 抗量子的高效区块链认证存储方案                                                           4493



                                     layer address             tree address

                                        type      hash address  tree height  tree index
                                                      图 5 地址结构

                    为了便于在本文其余部分提供的伪代码中管理类型, 我们分配了特定的常量, 以便于引用. 这些常量是:                            BW_hash,
                 BW_pk, DFORC_tree 和  DFORC_roots.
                  4.3.2    生成承诺
                     dforc_Keygen(PK.seed,SK.seed,ADRS,idx, s) → dforc sk ,dforc pk : 该算法用来生成  DFORC  的公私钥对, 以公私

                                                                 s
                 钥种子   PK.seed, SK.seed、地址   ADRS 、索引  idx 和开始索引   作为输入, 结合树的索引和高度, 依次生成树中的
                 节点. 具体来说, 首先根据      ADRS.setTreeHeight() 和  ADRS.setTreeIdx() 来生成树的索引和高度, 然后通过公式   (9) 生
                                                                       ADRS  方案来控制树的索引和高度, 通过循
                 成私钥, 随后通过对每一棵树进行遍历, 逐层生成节点, 过程中利用了
                 环的方式生成树的每一层节点, 最终合成根节点并返回密钥. 完整的过程见算法                            3, 其中  Th k  和  H  的说明见第
                 2.2  节, 有关  ADRS  的操作参考文献  [30].
                 算法  3.  dforc_Keygen.

                 输入:  PK.seed, SK.seed, ADRS,idx_tree, s;
                 输出:  dforc sk , dforc pk .

                 1.  ADRS.setTreeHeight(0); ADRS.setTreeIdx(idx_tree);
                 2. 根据公式  (9) 生成私钥  dforc_sk;
                 3. for  i ∈ [0,k −1] do
                 4.   for  q = 0 to  a−1 do
                 5.     for   j = 0 to  w  do
                                 ′
                                    j
                 6.       lea f[q][j] = F (PK.seed,ADRS, sk);
                 7.     endfor
                                     ′
                 8.      node[i][q] = lea f[w ];
                 9.   endfor
                 10.   ADRS.setTreeHeight(1);
                 11.   ADRS.setTreeIdx(s+i);
                 12. while  (Stack.top.height == node.height) do
                 13.     ADRS.setTreeIdx((ADRS.getTreeidx()−1)/2);
                 14.     node = H(PK.seed,ADRS,(Stack.pop()||node));
                 15.     ADRS.setTreeHeight = (ADRS.getTreeHeight()+1);
                 16.  endwhile
                 17.    Stack.push(node);
                 18.   root[i] = Stack.pop();
                 19. endfor
                 20.  ADRS.setType(DFORC_roots);
                 21.  dforc pk = Th k (PK.seed,ADRS,root[0]||...||root[k −1]);
                 22. return  dforc sk ,dforc pk
   91   92   93   94   95   96   97   98   99   100   101