Page 98 - 《软件学报》2025年第10期
P. 98
张川 等: 抗量子的高效区块链认证存储方案 4495
算法 5. chain.
输入: PK.seed, ADRS, r, s, i;
输出: r 迭代 s 次后的哈希值.
1. if s = 0 then
2. return r;
3. endif
4. if (i+ s) > w−1 then
5. return NULL;
6. endif
7. tmp = chain(PK.seed,ADRS,r, s−1,i);
8. ADRS.setHashAddr(i+ s−1);
9. tmp = F(PK.seed,ADRS,tmp);
10. return tmp
bw_Keygen(PK.seed,ADRS,SK.seed) → (bw pk ,bw sk ): 全节点利用该算法用于生成 BW 公私钥对, 私钥中的每个
n 字节字符串都由 SK.seed 和地址 ADRS 生成, 相应的公钥通过对私钥进行 w 次哈希计算生成. 具体而言, 结合
ADRS 地址对每个私钥进行哈希计算, 生成对应的公钥, 这个过程中, 私钥地址根据哈希链的结构进行更新, 根据
链函数 (算法 5) 计算哈希链每次迭代的结果. 算法 6 展示了 BW 密钥对的生成步骤, 有关 ADRS 的操作参考文献 [30].
通过 ADRS.setChainAddr() 和 ADRS.setHashAddr() 来调用对应地址, 并对每个私钥执行哈希操作, 生成 个 l BW
bw pk , 如下所示:
密钥对, 之后计算
bw pk = Th l (PK.seed,ADRS,bw pk [0]||...||bw pk [l−1]) (10)
算法 6. bw_Keygen.
输入: PK.seed, SK.seed, ADRS ;
输出: bw sk , bw pk .
1. for i = 0 to l do
2. ADRS.setChainAddr(i);
3. ADRS.setHashAddr(0);
4. bw sk [i] = PRF(SK.seed,ADRS);
5. endfor
6. for j = 0 to l do
7. ADRS.setChainAddr( j);
8. ADRS.setHashAddr(0);
9. tmp[ j] = chain(bw sk [ j],0,w−1,PK.seed,ADRS );
10. endfor
11. 根据公式 (10) 生成 bw pk ;
12. return bw sk ,bw pk
bw_sig(PK.seed,ADRS,SK.seed) → SIG bw : 根据 Size-optimal 编码 (见第 2.3 节), 我们用 BW 私钥进行签名生
SIG bw . 具体过程见算法 1 (详见第 2.3 节).
成
4.4.2 超树签名
本节将说明 BW 如何与 Merkle 树结合生成超树 (HT), 从而产生固定输入长度的签名方案. HT 的公钥位于顶

