基于哈希的后量子签名(2):从树到森林

1. 引言

前序博客有:

在该前序博客中:

  • 剖析了基于哈希的密码学的核心构件:一次性签名(One-Time Signature,OTS)。
  • 回顾了 W-OTS+ 等方案如何仅依靠密码学哈希函数的安全性,实现后量子安全。

但 OTS 有一个重大限制:只能使用一次 。按照定义,一对 OTS 密钥 ( s k O T S , p k O T S ) (\mathsf{sk}{\mathrm{OTS}},\mathsf{pk}{\mathrm{OTS}}) (skOTS,pkOTS) 只能安全地签署一条消息。如果系统需要签署 N N N 条消息(对于区块链validator而言, N N N 通常可能达到 2 20 2^{20} 220,甚至更多),那么就必须生成并分发 N N N 个不同的公钥:

P K = { p k O T S , 0 , p k O T S , 1 , ... , p k O T S , N − 1 } . \mathsf{PK}=\{\mathsf{pk}{\mathrm{OTS},0},\mathsf{pk}{\mathrm{OTS},1},\ldots,\mathsf{pk}_{\mathrm{OTS},N-1}\}. PK={pkOTS,0,pkOTS,1,...,pkOTS,N−1}.

这种线性增长会带来巨大的管理负担。verifier(如区块链轻客户端或智能合约)若要验证签名,就需要能够访问整份公钥登记表。要让基于哈希的签名在高吞吐量系统中真正与 RSA 或 BLS 竞争,需要一种方法,将所有这些临时公钥压缩为一个大小恒定的主公钥。

本文将深入介绍密码学如何解决这一问题:从 Ralph Merkle 最初提出的方法,到后来改进而成的 XMSS(eXtended Merkle Signature Scheme,扩展 Merkle 签名方案)。

1.1 Merkle 承诺

Ralph Merkle 的突破性想法简单而有力:不再以线性列表的形式排列 OTS 公钥,而是将它们组织为一棵哈希树(Merkle 树) 的叶子。通过递归地对成对节点进行哈希,系统只需一个哈希值,也就是树的根,就能对数量随树高呈指数增长的 OTS 公钥作出承诺。

P K M a s t e r = R o o t . \mathsf{PK}_{\mathrm{Master}}=\mathsf{Root}. PKMaster=Root.

这种结构从根本上改变了验证过程。验证者不再对照一份线性的公钥列表检查签名,而是检查一种密码学证明,即认证路径 。它将某个只使用一次的公钥 p k O T S \mathsf{pk}{\mathrm{OTS}} pkOTS 与可信的全局主公钥 P K M a s t e r \mathsf{PK}{\mathrm{Master}} PKMaster 联系起来。

1.2 从 MSS 到 XMSS

经典的 Merkle 签名方案(Merkle Signature Scheme,MSS) 奠定了理论框架,但其效率和安全证明的紧致性尚不足以满足现代部署的要求。XMSS 在 RFC 8391 中给出了规范。这是一份由 IRTF 发布、类别为 Informational(信息类)的 RFC,描述了 WOTS+、单树 XMSS,以及多树变体 X M S S M T \mathrm{XMSS}^{\mathrm{MT}} XMSSMT。在美国联邦指导规范方面,NIST SP 800-208 后来批准了部分 XMSS 和 LMS 有状态哈希签名参数集,同时对私钥状态管理施加了严格的操作约束。

2. Merkle 签名方案(MSS)

由 Ralph Merkle 提出的 Merkle 签名方案(MSS),将数千对相互独立的 OTS 密钥整合为一个稳健的结构。实现这一转变的核心数据结构是二叉哈希树,通常称为 Merkle 树。

2.1 树的构造与密钥生成

可以将树高 h h h 理解为 MSS 的容量参数。它精确决定了一个主公钥所能支持的签名数量,即 N = 2 h N=2^h N=2h。

2.1.1 MSS 密钥生成

  1. 生成 OTS 密钥: 签名者使用安全的 OTS 方案(如 W-OTS+),生成 N = 2 h N=2^h N=2h 对相互独立的 OTS 密钥,记为

    ( s k O T S , i , p k O T S , i ) , i ∈ { 0 , 1 , ... , 2 h − 1 } . (\mathsf{sk}{\mathrm{OTS},i},\mathsf{pk}{\mathrm{OTS},i}), \qquad i\in\{0,1,\ldots,2^h-1\}. (skOTS,i,pkOTS,i),i∈{0,1,...,2h−1}.

  2. 构造叶子: 这些 OTS 实例的公钥构成树的叶子。为了保证格式统一,对每个 OTS 公钥进行哈希,得到固定长度的叶子值 L i L_i Li:

    L i = H ( p k O T S , i ) . L_i=H(\mathsf{pk}_{\mathrm{OTS},i}). Li=H(pkOTS,i).

  3. 计算树节点的哈希: 从下往上构造整棵树。将两个子节点拼接后进行哈希,得到其父节点。用 N o d e j , k \mathsf{Node}_{j,k} Nodej,k 表示高度为 j j j、索引为 k k k 的节点,其中叶子的高度为 0 0 0。节点之间的关系定义为

    N o d e j , k = H ( N o d e j − 1 , 2 k ∥ N o d e j − 1 , 2 k + 1 ) . \mathsf{Node}{j,k} =H\bigl(\mathsf{Node}{j-1,2k}\mathbin{\|}\mathsf{Node}_{j-1,2k+1}\bigr). Nodej,k=H(Nodej−1,2k∥Nodej−1,2k+1).

  4. 计算树根: 重复上述过程,直到到达最顶层,也就是树唯一的根节点 N o d e h , 0 \mathsf{Node}{h,0} Nodeh,0。这个根就是 MSS 的主公钥 p k M S S \mathsf{pk}{\mathrm{MSS}} pkMSS。私钥 s k M S S \mathsf{sk}_{\mathrm{MSS}} skMSS 由 OTS 私钥序列,以及下一个可用密钥的索引 s s s 组成。

2.1.2 MSS认证路径

认证路径是 MSS 的一项关键创新。由于验证者只持有树根 p k M S S \mathsf{pk}_{\mathrm{MSS}} pkMSS,因此无法直接验证与某个叶子 L i L_i Li 对应的 OTS 签名。签名者必须证明 L i L_i Li 确实属于这棵特定的树。

对于给定的叶子索引 i i i,认证路径 A u t h i \mathsf{Auth}_i Authi 由重新计算树根所需的兄弟节点组成。具体而言,沿着叶子 i i i 到树根的路径,将路径上各个非根节点的兄弟节点纳入 A u t h i \mathsf{Auth}_i Authi。兄弟节点与该节点具有同一个父节点,但不在这条直接路径上。

认证路径的长度等于树高 h h h。相较于存储全部公钥时的线性增长,这种对数级增长,即 O ( log ⁡ N ) O(\log N) O(logN),使 MSS 具备了实用性。

2.1.3 MSS签名生成与验证

2.1.3.1 MSS签名生成

使用第 s s s 对 OTS 密钥对消息 M M M 签名:

  1. 签名者使用 s k O T S , s \mathsf{sk}{\mathrm{OTS},s} skOTS,s,计算消息 M M M 的 OTS 签名 σ O T S \sigma{\mathrm{OTS}} σOTS。

  2. 签名者计算或取出索引为 s s s 的叶子所对应的认证路径 A u t h s \mathsf{Auth}_s Auths。

  3. 最终的 MSS 签名是如下元组:

    σ = ( s , σ O T S , p k O T S , s , A u t h s ) . \sigma=(s,\sigma_{\mathrm{OTS}},\mathsf{pk}_{\mathrm{OTS},s},\mathsf{Auth}_s). σ=(s,σOTS,pkOTS,s,Auths).

  4. 至关重要的是,签名者要更新状态 s ← s + 1 s\leftarrow s+1 s←s+1,以防止密钥重复使用。

2.1.3.2 签名验证

给定消息 M M M、签名 σ \sigma σ 和公钥 p k M S S \mathsf{pk}_{\mathrm{MSS}} pkMSS:

  1. 验证 OTS 签名: 验证者首先使用底层 OTS 验证算法,根据 p k O T S , s \mathsf{pk}{\mathrm{OTS},s} pkOTS,s 检查 σ O T S \sigma{\mathrm{OTS}} σOTS 是否有效。如果此步骤失败,则签名无效。
  2. 重建叶子: 验证者计算候选叶子值 L s ′ = H ( p k O T S , s ) L_s'=H(\mathsf{pk}_{\mathrm{OTS},s}) Ls′=H(pkOTS,s)。
  3. 重建树根: 验证者根据索引 s s s、候选叶子 L s ′ L_s' Ls′ 和认证路径 A u t h s \mathsf{Auth}_s Auths,逐层向上计算,直到得到树根。在每个高度 j j j,索引 s s s 决定当前计算出的节点是左子节点还是右子节点。
  4. 最终检查: 当且仅当计算出的树根与可信公钥 p k M S S \mathsf{pk}_{\mathrm{MSS}} pkMSS 一致时,签名有效。

3. XMSS:扩展 Merkle 签名方案

MSS 提供了很好的设计框架,但对于安全要求严格的实际应用,其速度和可证明安全性仍不足以满足需求。RFC 8391 所规定的 XMSS(eXtended Merkle Signature Scheme,扩展 Merkle 签名方案) 使用经过优化的密码学原语,改进了这一设计。它保留了树结构,同时重新设计了底层机制。

3.1 XMSS中的随机化哈希与异或树

在标准 Merkle 树中,父节点的计算方式为 P = H ( L ∥ R ) P=H(L\mathbin{\|}R) P=H(L∥R)。这种确定性结构使得针对多目标攻击的形式化安全证明较为困难。在多目标攻击中,攻击者会尝试找到树中任意一个哈希值的原像。

XMSS 通过随机化树哈希来解决这一问题。其核心思想是:为树中的每一次哈希操作分配各自独有的"密钥"或"掩码",使某个位置(例如第 1 1 1 层的第 5 5 5 个节点)的哈希计算与其他位置的哈希计算有所区别。

这一机制通过异或树构造实现。在进行哈希之前,先将每个子节点与一个独有的比特掩码进行异或。对于密码学哈希函数 H H H、密钥 K K K 以及比特掩码 M L , M R M_L,M_R ML,MR,节点计算定义为

P a r e n t = H ( K , ( L e f t ⊕ M L ) ∥ ( R i g h t ⊕ M R ) ) . \mathsf{Parent} =H\bigl(K,(\mathsf{Left}\oplus M_L)\mathbin{\|}(\mathsf{Right}\oplus M_R)\bigr). Parent=H(K,(Left⊕ML)∥(Right⊕MR)).

这里, ⊕ \oplus ⊕ 表示按位异或运算。密钥 K K K 和比特掩码 M L , M R M_L,M_R ML,MR,由公开种子 P s e e d P_{\mathrm{seed}} Pseed 与当前待计算节点的唯一地址共同派生。

3.2 XMSS分层构造:L 树与主树

完整的 XMSS 结构分为不同阶段构建,在处理 W-OTS+ 密钥的各个步骤中都应用了异或树的计算逻辑。

3.2.1 XMSS叶子压缩:L 树

在基本的 MSS 中,叶子只是简单的哈希值。但在 XMSS 中,底层的一次性签名采用的是第一篇文章介绍的 W-OTS+ 。W-OTS+ 公钥并非单个值,而是一个由许多哈希值组成的长向量,例如包含 67 67 67 个值。将这样庞大的向量直接放入主树,效率并不高。

为了解决这一问题,XMSS 使用了一种称为 **L 树(L-tree)**的特殊结构:

  1. 输入: W-OTS+ 公钥向量 p k W O T S = ( x 0 , x 1 , ... , x l e n − 1 ) \mathsf{pk}{\mathrm{WOTS}}=(x_0,x_1,\ldots,x{\mathrm{len}-1}) pkWOTS=(x0,x1,...,xlen−1)。
  2. 处理: 将这些值视为一棵小型二叉树的叶子,递归应用异或树的哈希逻辑:将相邻节点配对,分别与特定的 L 树掩码 B L B_L BL 和 B R B_R BR 进行异或,然后计算哈希。
  3. 输出: 这棵 L 树唯一的根。这个压缩后的值成为 XMSS 主树中实际的叶子 L i L_i Li。

3.2.2 XMSS 主树

通过 L 树生成叶子 L 0 , ... , L 2 h − 1 L_0,\ldots,L_{2^h-1} L0,...,L2h−1 后,就可以在这些叶子之上构建主二叉树。

  • 对于每一次节点计算,RFC 8391 都从 P s e e d P_{\mathrm{seed}} Pseed 和 A D R S \mathsf{ADRS} ADRS 派生新的密钥和比特掩码,其中 A D R S \mathsf{ADRS} ADRS 标识某次特定的哈希调用。为便于阅读,图中省略了完整的地址结构。

  • 直观地说,父节点的计算可以理解为

    P a r e n t = H ( K , ( L e f t ⊕ B M 0 ) ∥ ( R i g h t ⊕ B M 1 ) ) , \mathsf{Parent} =H\bigl(K,(\mathsf{Left}\oplus\mathsf{BM}_0)\mathbin{\|}(\mathsf{Right}\oplus\mathsf{BM}_1)\bigr), Parent=H(K,(Left⊕BM0)∥(Right⊕BM1)),

    其中 K K K、 B M 0 \mathsf{BM}_0 BM0 和 B M 1 \mathsf{BM}1 BM1 由 P s e e d P{\mathrm{seed}} Pseed 与 A D R S \mathsf{ADRS} ADRS 共同派生,并非仅由树高决定。 A D R S \mathsf{ADRS} ADRS 编码了哈希调用的上下文,包括树的类型、高度和节点位置。

  • 最终,这一过程生成唯一的 XMSS 树根。

这是对 RFC 8391 中基于地址的哈希机制的简化描述。完整的 RFC 构造使用 A D R S \mathsf{ADRS} ADRS,区分 WOTS+、L 树和 XMSS 主树中的不同哈希调用。

3.3 XMSS 协议描述

明确各个结构组件后,我们就可以形式化地描述 XMSS 的工作过程。XMSS 的一项关键工程优化,是使用伪随机函数(Pseudorandom Function,PRF),以确定性的方式派生私钥。

3.3.1 XMSS密钥生成

  1. 初始化秘密值: 签名者随机选取一个用于派生 WOTS+ 密钥的秘密种子 S s e e d S_{\mathrm{seed}} Sseed、一个独立的秘密值 S K P R F \mathsf{SK}{\mathrm{PRF}} SKPRF,以及一个公开种子 P s e e d P{\mathrm{seed}} Pseed。 S s e e d S_{\mathrm{seed}} Sseed 用于派生 WOTS+ 私钥材料, S K P R F \mathsf{SK}{\mathrm{PRF}} SKPRF 用于派生每份签名的随机化值,而 P s e e d P{\mathrm{seed}} Pseed 与地址信息共同用于派生随机化树哈希所需的密钥和比特掩码。

  2. 生成 OTS 密钥: 对于每个叶子索引 i ∈ { 0 , ... , 2 h − 1 } i\in\{0,\ldots,2^h-1\} i∈{0,...,2h−1},可以从 S s e e d S_{\mathrm{seed}} Sseed 伪随机地派生 WOTS+ 的秘密材料,例如

    s e e d i = PRF ⁡ ( S s e e d , i ) . \mathsf{seed}i=\operatorname{PRF}(S{\mathrm{seed}},i). seedi=PRF(Sseed,i).

    随后生成相应的 W-OTS+ 公钥 p k O T S , i \mathsf{pk}_{\mathrm{OTS},i} pkOTS,i。

  3. 构造树: 使用 L 树将每个 p k O T S , i \mathsf{pk}{\mathrm{OTS},i} pkOTS,i 压缩为叶子 L i L_i Li。然后以 P s e e d P{\mathrm{seed}} Pseed 为参数,使用基于地址的随机化树哈希,在这些叶子之上构建主 Merkle 树。

  4. 输出: XMSS 公钥为

    p k X M S S = ( R o o t , P s e e d ) . \mathsf{pk}{\mathrm{XMSS}}=(\mathsf{Root},P{\mathrm{seed}}). pkXMSS=(Root,Pseed).

    私钥为

    s k X M S S = ( i d x , S s e e d , S K P R F , P s e e d , R o o t ) , \mathsf{sk}{\mathrm{XMSS}} =(\mathsf{idx},S{\mathrm{seed}},\mathsf{SK}{\mathrm{PRF}},P{\mathrm{seed}},\mathsf{Root}), skXMSS=(idx,Sseed,SKPRF,Pseed,Root),

    其中, i d x \mathsf{idx} idx 是下一个尚未使用的叶子索引, S s e e d S_{\mathrm{seed}} Sseed 用于派生 WOTS+ 私钥, S K P R F \mathsf{SK}_{\mathrm{PRF}} SKPRF 用于派生每份签名的随机化值。

3.3.2 XMSS签名生成

使用当前状态 i d x \mathsf{idx} idx 对消息 M M M 签名:

  1. 检查状态: 将当前签名索引保存为快照: i d x s i g ← i d x \mathsf{idx}{\mathrm{sig}}\leftarrow\mathsf{idx} idxsig←idx。确保 i d x s i g < 2 h \mathsf{idx}{\mathrm{sig}}<2^h idxsig<2h,然后立即持久化更新后的状态:

    i d x ← i d x s i g + 1. \mathsf{idx}\leftarrow\mathsf{idx}_{\mathrm{sig}}+1. idx←idxsig+1.

  2. 上下文随机化: 以确定性的方式派生本次签名的随机化值:

    r = PRF ⁡ ( S K P R F , i d x s i g ) . r=\operatorname{PRF}(\mathsf{SK}{\mathrm{PRF}},\mathsf{idx}{\mathrm{sig}}). r=PRF(SKPRF,idxsig).

  3. W-OTS+ 签名: 计算随机化消息摘要

    M ′ = H m s g ( r ∥ R o o t ∥ i d x s i g , M ) . M'=H_{\mathrm{msg}}\bigl(r\mathbin{\|}\mathsf{Root}\mathbin{\|}\mathsf{idx}_{\mathrm{sig}},M\bigr). M′=Hmsg(r∥Root∥idxsig,M).

    使用从 S s e e d S_{\mathrm{seed}} Sseed 派生出的、索引为 i d x s i g \mathsf{idx}{\mathrm{sig}} idxsig 的 W-OTS+ 密钥对 M ′ M' M′ 签名,得到 σ O T S \sigma{\mathrm{OTS}} σOTS。

  4. 认证路径: 计算索引为 i d x s i g \mathsf{idx}{\mathrm{sig}} idxsig 的叶子所对应的认证路径 A u t h i d x s i g \mathsf{Auth}{\mathsf{idx}_{\mathrm{sig}}} Authidxsig。

  5. 输出: 签名为

    σ = ( i d x s i g , r , σ O T S , A u t h i d x s i g ) . \sigma=(\mathsf{idx}{\mathrm{sig}},r,\sigma{\mathrm{OTS}},\mathsf{Auth}{\mathsf{idx}{\mathrm{sig}}}). σ=(idxsig,r,σOTS,Authidxsig).

3.3.3 XMSS验证

给定消息 M M M、签名 σ = ( i d x s i g , r , σ O T S , A u t h i d x s i g ) \sigma=(\mathsf{idx}{\mathrm{sig}},r,\sigma{\mathrm{OTS}},\mathsf{Auth}{\mathsf{idx}{\mathrm{sig}}}) σ=(idxsig,r,σOTS,Authidxsig),以及公钥 p k X M S S \mathsf{pk}_{\mathrm{XMSS}} pkXMSS:

  1. 验证 OTS 签名: 根据 σ O T S \sigma_{\mathrm{OTS}} σOTS 和消息摘要

    M ′ = H m s g ( r ∥ R o o t ∥ i d x s i g , M ) , M'=H_{\mathrm{msg}}\bigl(r\mathbin{\|}\mathsf{Root}\mathbin{\|}\mathsf{idx}_{\mathrm{sig}},M\bigr), M′=Hmsg(r∥Root∥idxsig,M),

    重建 W-OTS+ 公钥 p k O T S ′ \mathsf{pk}_{\mathrm{OTS}}' pkOTS′。

  2. 重建叶子: 将 p k O T S ′ \mathsf{pk}_{\mathrm{OTS}}' pkOTS′ 压缩为候选叶子值:

    L i d x s i g ′ = LTree ⁡ ( p k O T S ′ ) . L_{\mathsf{idx}{\mathrm{sig}}}'=\operatorname{LTree}(\mathsf{pk}{\mathrm{OTS}}'). Lidxsig′=LTree(pkOTS′).

  3. 重建树根: 利用 A u t h i d x s i g \mathsf{Auth}{\mathsf{idx}{\mathrm{sig}}} Authidxsig 和树中的索引 i d x s i g \mathsf{idx}_{\mathrm{sig}} idxsig,沿路径逐层向上重新计算,得到候选树根 R o o t ′ \mathsf{Root}' Root′。在每一层,都使用从地址派生的密钥和异或掩码。

  4. 最终检查: 当且仅当 R o o t ′ = R o o t \mathsf{Root}'=\mathsf{Root} Root′=Root 时,签名有效,其中 R o o t \mathsf{Root} Root 来自公钥 p k X M S S \mathsf{pk}_{\mathrm{XMSS}} pkXMSS。

4. 扩展规模: X M S S M T \mathrm{XMSS}^{\mathrm{MT}} XMSSMT 超树

标准 XMSS 在扩展规模时会遇到瓶颈,因为密钥生成时间随签名数量 N = 2 h N=2^h N=2h 线性增长。对于高度为 h = 20 h=20 h=20 的树(可支持约一百万次签名),生成密钥对可能需要数分钟。如果树高达到 h = 60 h=60 h=60(签名容量近乎无限),就会遇到巨大的延迟瓶颈。

为了解决这一问题,RFC 8391 引入了 X M S S M T \mathrm{XMSS}^{\mathrm{MT}} XMSSMT(Multi-Tree,多树)超树。它将多棵较小的树分层堆叠,从而避免构建一棵极其庞大的树。

4.1 X M S S M T \mathrm{XMSS}^{\mathrm{MT}} XMSSMT 中树的树:分层架构

可以将其想象为一个具有多个层级的结构。

  • 顶层: 一棵 XMSS 树,其根作为主公钥。
  • 中间层: 顶层树的叶子不直接对消息签名,而是对下一层树的根签名。
  • 底层: 只有最底层的树才用于对实际消息签名。

如,要达到总高度 h = 60 h=60 h=60,可以将高度均为 20 20 20 的树堆叠为 3 3 3 层,而不必构建一棵庞大的单树。

4.2 X M S S M T \mathrm{XMSS}^{\mathrm{MT}} XMSSMT 权衡:延迟与大小

代价是什么?本质上,是以稍大的签名换取更短的密钥生成时间。只需生成顶层树,就可以开始使用;相应地,最终签名会变成由多份较小签名组成的链。

对于区块链共识,这可能是一种有吸引力的权衡: X M S S M T \mathrm{XMSS}^{\mathrm{MT}} XMSSMT 将一棵大树拆分为多个较小的 XMSS 层,从而减少密钥生成时间和签名开销。它可以轻松支持近乎无限的容量,例如 2 60 2^{60} 260 次签名,但代价是签名更大:一份 X M S S M T \mathrm{XMSS}^{\mathrm{MT}} XMSSMT 签名会为每一层包含一份精简 XMSS 签名,而每份精简签名都包含一个 WOTS+ 签名和该层的认证路径。因此,签名大小大致随层数线性增长。这使其适用于能够接受千字节级签名的场景,但不能直接替代紧凑的 BLS 或 ECDSA 签名。

5. 状态管理的风险

本文一直强调,MSS 和 XMSS 都是有状态的。签名者必须持久化保存叶子索引,并且绝不能将其重置。

对于普通加密货币钱包,这就像一颗定时炸弹。如果从备份中恢复时意外重置了索引,就可能重复使用某个一次性密钥。正如前文所述,这会彻底破坏安全性。这种脆弱性使 XMSS 不太适合普通钱包的备份与恢复流程,除非签名系统能够保证状态始终单调递增。

6. 结语

本文连接了一次性签名的理论与实际应用。通过将 OTS 密钥组织成 Merkle 树(MSS),再利用 L 树和超树( X M S S M T \mathrm{XMSS}^{\mathrm{MT}} XMSSMT)进行优化,得到了一种证明紧凑、验证快速的签名方案。

XMSS 是有状态后量子签名的一次重大进步:与其他有状态方案相比,它提供了快速验证和可接受的签名大小,但要求严格保存并维护状态。对于受到严格控制的共识签名系统,它可能是一个候选方案,前提是实现能够确保 XMSS 索引单调递增,并且在系统崩溃后仍能保持安全。其他场景又该怎么办?如果我们希望签名像标准 ECDSA 一样"无需记忆"、易于使用,又该如何实现?

在本系列的下一篇文章中,将探讨 SPHINCS+ 及其标准化后继方案 SLH-DSA ,后者由 NIST FIPS 205 规定。将了解这种无状态哈希签名算法,如何巧妙地重新利用本文分析过的 W-OTS+、XMSS 和超树结构,同时用随机化机制取代严格维护的状态索引,从而实现无状态这一理想目标。

7. 常见问题

7.1 什么是 Merkle 签名方案(MSS),它为什么重要?

MSS 将数千对 OTS 密钥组织为二叉哈希树的叶子,把难以管理的公钥列表压缩为一个主公钥,也就是树根,从而解决一次性签名的核心限制。这意味着,验证者只需持有一个大小恒定的值,就能验证任意一份签名,而验证复杂度呈对数级增长,不再是线性增长。

7.2 XMSS 如何改进基本的 MSS?

XMSS 通过基于异或的构造引入随机化树哈希。每次哈希操作都使用从公开种子和节点地址派生的独有密钥与比特掩码。这使得针对多目标攻击的形式化安全证明更加紧致。此外,引入 L 树可以高效地将较长的 W-OTS+ 公钥向量压缩为单个叶子值。

7.3 什么是 X M S S M T \mathrm{XMSS}^{\mathrm{MT}} XMSSMT,应当在什么情况下使用?

X M S S M T \mathrm{XMSS}^{\mathrm{MT}} XMSSMT 是一种多树"超树"变体,通过将多棵较小的 XMSS 树分层堆叠,大幅缩短密钥生成时间,无需构建一棵巨大的树。代价是签名更大,因为每份签名都必须包含由各层认证路径组成的链。因此,它最适合能够接受千字节级签名的环境。

7.4 为什么说 XMSS 是"有状态"的,这为什么重要?

XMSS 要求签名者维护并持久化保存一个随每次签名而递增的叶子索引,因为底层的每一对 OTS 密钥都绝不能重复使用。如果这一状态被重置,例如从备份中恢复时发生回退,攻击者就可以通过观察同一密钥下的两份签名,彻底破坏该方案的安全性。

7.5 XMSS 适合区块链应用吗?

对于受到严格控制的共识签名系统,如果能够保证状态管理的单调性以及系统崩溃后的安全性,XMSS 是一个有竞争力的候选方案。但其有状态的特性使它不太适合普通钱包的使用流程,而且其签名尺寸较大,无法直接替代 BLS 或 ECDSA 等紧凑方案。

参考文献

1 Certik团队2026年6月博客 Post-Quantum Signatures, Part 2: From Trees to Forests

相关推荐
mutourend2 个月前
为后量子时代做准备:格密码学入门指南
后量子密码学
mutourend2 个月前
Google Cloud 后量子密码学路线图
后量子密码学
mutourend3 个月前
后量子密码学:为什么 2026 年将成为关键转折点
后量子密码学
mutourend4 个月前
Trezor Safe 7:具备量子就绪(Quantum-Ready)能力的硬件钱包
后量子密码学
mutourend5 个月前
以太坊中的量子攻击面
后量子密码学
mutourend5 个月前
CRYSTALS-Kyber(ML-KEM)简介
后量子密码学
mutourend5 个月前
以太坊中的后量子密码学
后量子密码学
mutourend5 个月前
Zcash 与量子计算机
区块链·量子计算·后量子密码学
mutourend5 个月前
量子计算与区块链:让紧迫性与真实威胁相匹配
区块链·量子计算·后量子密码学