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

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


                 其中,   D n,m  表示前  n 个码字的总和为  m 的大小, 定义初始值为:

                                                 
                                                  D 1,m = 1, m ∈ {0,1,...,w−1}
                                                 
                                                                                                     (2)
                                                 
                                                   D n,m = 0, 2 ⩽ n ∈ Z,m ∈ Z
                                                 
                                                                    −
                    递归关系为:

                                              ∑  w−1
                                         D n,m =   D n−1,m−i , 2 ⩽ n ∈ Z,m ∈ {0,1,...,l(w−1)}         (3)
                                                 i=0
                    接下来解释一下公式        (3) 的递归关系. 要计算     D n,m , 首先考虑最后一个求和的值, 可以是       {0,1,...,w−1} 中的任
                 意值. 假设将该值设为      i, 则前  n−1 个元素的和必须为     m−i. 因此, 可以将问题“    n 个元素的和为     m ”变成“  n−1 个元
                 素的和为   m−i ”. 通过这种推导, 我们可以简单地累加          D n−1,m−i  来计算  D n,m . 根据这种方法, 具体的平衡  WOTS+签名
                 算法如算法    1.
                 算法  1.  bw_sig.

                 输入:  l,w;
                 输出:  SIG bw .

                 1. 设  d 是大小为  l 的数组;
                 2.  m = ⌊l(w−1)/2⌋;
                 3. for  i = l to 1 do
                 4.  for   j = 0 to  min{w−1,m} do
                 5.    if  x ⩾ D i−1,s− j  then
                 6.     x = x− D i−1,s− j ;
                 7.    else
                 8.       d[i] = j;
                 9.      break;
                 10.  endif
                 11. endfor
                 12.   m = m−d[i];
                 13. endfor
                             d[i]
                 14.  SIG bw [i] = F (sk i );
                 15. return  SIG bw

                                                                               λ
                    算法  1  中, 私钥   sk  由   个随机数据块组成, 即   sk = (sk 1 , sk 2 ,..., sk l ), sk i ∈ {0,1} . 公钥  {pk i } l i=1  是通过对私钥中的
                                     l
                 每个块迭代应用哈希函数         w−1 次而生成的, 即    pk i = F w−1 (sk i ). 最后, 通过可调整的哈希函数  Th l  (详见第  2.2  节) 将
                                                                l
                 这些块合并为公钥       pk, 即   pk = Th l (pk 1 , pk 2 ,..., pk l ). 对于包含   个块的签名  SIG bw , 验证者将哈希函数应用于每个块
                                                                               ′
                                                                                    ′
                                                                                                    ′
                                ′
                                                                                            ′
                                                                                               ′
                 w−1−d[i] 次, 即  pk = F  w−1−d[i] (SIG bw [i]). 最后, 再次使用  Th l  将这些块合并为  pk , 即  pk = Th l (pk , pk ,..., pk ). 如
                                i                                                          1   2    l
                         ′
                 果  pk = pk , 验证者接受此签名.
                  2.4   超 树
                    引入超树前, 先介绍      Merkle 树. 为了对  2 h ′   条消息进行签名, 签名者生成   2 h ′  个  WOTS+密钥对, 并将这  2 h ′  个公
                 钥作为叶子节点构建二叉树. 具体而言, 对于每对叶子节点, 签名者重复应用哈希函数生成对应的父节点, 直到到
                 达树的根节点, 即这个树的公钥. 在进行签名时, 签名者选择一个                  WOTS+叶子节点, 并发布      WOTS+签名以及从叶
                 子节点到根节点的路径上所有节点的兄弟节点, 这就构成了“认证路径” (详见图                          1). 验证者首先从签名中获得
                 WOTS+公钥, 然后使用认证路径上的节点及其兄弟节点来重建根节点.
   85   86   87   88   89   90   91   92   93   94   95