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

4492                                                      软件学报  2025  年第  36  卷第  10  期


                 言, 当状态更新发生时, DFORC       只需要对当前状态变更涉及的那条哈希链进行更新操作, 而无需频繁读取和写入
                 磁盘. 通过避免大量无关节点的读写操作, DFORC             有效地降低了磁盘       I/O  瓶颈问题. 这不仅显著提高了更新效率,
                 还减轻了全节点的存储压力.
                  4.2   初始化
                                               md  及其在  DFORC  中的相应索引, 以便稍后用于生成承诺和证明, 具体过
                                                 ′
                    首先计算随机生成器        R, 消息摘要
                 程参见算法    2. 生成  EQAS  的  SK.seed、PK.seed、SK.prf  需要调用  3  次随机数生成器  (算法  2  第  1  行). 然后, 基于
                 key 和   SK.prf  生成  R, 定义为:

                                                 R = PRF(SK.prf,Optrand.key)                          (6)
                 其中,  Optrand  是  n 字节字符串, 初始化为   0, 可以选择性地用     1  随机覆盖来进行设置. 通过添加额外的随机性,             R
                 具有非确定性, 这有助于抵御侧信道攻击. 然后, 我们推导出使用的索引                    idx, 以及  md:

                                             (md||idx) = H msg (R,PK.seed,PK.root,key)                (7)
                 其中,  H msg  详见第  2.2 节,  PK.root 来源于超树的顶层根节点  (见  ht_sig 算法中第  1–14 行),   md 的长度为  m = ⌊(ka+7)⌋+
                 ⌊(h−h/d +7)⌋+⌊(h/d +7)⌋ bits. 根据选择的参数  (算法  2  的第  5–7  行) 将  (md||idx) 拆分为  md 、树地址  idx_tree 和
                                                                                        ′
                                                               ′                      m 3  字节用于叶子节点索
                 叶子索引   idx_lea f , 其中需要  m 1  字节用于  key 的消息摘要   md , 需要  m 2  字节用于树地址和
                                                 k
                                           ′                                           k 是
                 引, 使  m = m 1 +m 2 +m 3 . 接着将  md  拆分成   个  log(t) 位的字符来生成索引数组  idx[k], 其中   DFORC  树的数量,
                                                    k 个索引中的每个都对应        DFORC       sk. 具体来说, 第   1  个索引
                 t 是叶子节点数量. 例如     idx[k] = [2,5,7,...], 这                     中每个
                 选择第   1  个树中的第   2  个  sk; 第  2  个选择第  2  棵树中的第  5  个  sk; 以此类推, 最后一个索引选择最后一棵树中的
                 第  idx[k −1] 个   sk. 随后, 将与   key 对应的索引添加到  ID 中.
                 算法  2. 初始化.

                 输入:  key;
                        ′
                 输出:  md , idx_tree, idx_lea f .
                 1.  SK.seed, SK.prf, PK.seed ← Random(n);
                 2.  PK.root ← ht_sig() (见  ht_sig  算法中第  1–14 行);
                 3. 根据公式  (6) 生成  R;
                 4. 根据公式  (7) 生成  (md||idx);
                 5.  md  为  (md||idx) 中前  ⌊ka+7⌋ bits;
                     ′
                 6.  idx_tree 为  (md||idx) 中接下来的  ⌊(h−h/d +7)⌋ bits;
                 7.  idx_leaf  为   (md||idx) 后面的  ⌊h/d +7⌋ bits;
                         ′
                 8. return  md , idx_tree, idx_lea f
                  4.3   承诺和证明
                       ADRS  方案
                  4.3.1
                      ADRS  方案采用一组操作地址的方法, 具体的所有操作方法见文献                  [30], 所有节点在每次哈希调用后更新地
                 址. 对于不同的用例, 有      5  种类型的地址: 第   1  种类型用于平衡 WOTS+ (BW) 方案中的哈希函数, 另一种用于压
                 缩  BW  公钥, 第  3  种类型用于超树中    Merkle 树的哈希函数, 以及另一种用于         DFORC  中每棵树的哈希, 最后一种
                 类型用于压缩     DFORC  的根节点. 如图    5  所示, layer address 表示节点在超树中的高度, 对于底层的树, layer address
                 为  0; tree address 表示从最左边的树索引   0  开始, 节点在超树中的位置; type 表示地址的类型: BW          哈希地址为     0,
                 BW  公钥压缩为    1, 哈希树地址为    2, DFORC  地址为  3, DFORC  树的根节点压缩为    4; hash address 表示键值对的地
                 址; tree height 表示节点在  DFORC  中的高度; tree index  的计算方式在第  4.3.2  节.
   90   91   92   93   94   95   96   97   98   99   100