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

