4. WOTS+一次性签名机制深入

WOTS+(Winternitz One-Time Signature Plus)是SLH-DSA(原SPHINCS+) hypertree 中每一棵子树叶子节点所承载的底层签名原语。理解WOTS+,是理解整个SLH-DSA“用一次性签名拼出多次签名”这一设计哲学的关键。本节从链式哈希出发,逐步展开密钥生成、签名与验证的完整过程,并讨论其安全假设与效率权衡。

一、链式哈希:WOTS+的基本构件

WOTS+的核心是一个可参数化的哈希链。设安全参数为 n(如SLH-DSA-128s中 n=16 字节),Winternitz参数为 w(常用 w=4 或 w=16),则每条链的长度为 w-1。链的构造方式为:给定一个起始值 x,反复应用带密钥的哈希函数 F:

链值定义:
  c_0 = x
  c_i = F(pub_seed, ADRS, c_{i-1})   , i = 1..w-1

其中 F 是抗碰撞的密钥哈希(如基于SHA-256或SHAKE),
pub_seed 为公开种子,ADRS 为地址结构(区分链编号、哈希模式等)。

链的“方向”是单向的:从 c_0 出发可以算出任意 c_i(i 越大越靠后),但已知 c_i 无法反推 c_{i-1}。这一单向性正是WOTS+安全性的根基——签名者公开链的末端,而签名时只揭示链中某个中间值,验证者沿链继续向前推进即可核对,但无法从公开值倒推出签名者保留的秘密起点。

二、密钥生成:私钥、公钥与链端点

WOTS+的私钥是一组随机值,长度等于链的条数 len。当 w=4、n=16 时,消息摘要被编码为若干4比特的“数字”,每条链对应一个数字。len 由两部分组成:消息数字数 len_1 = ceil(8n / log2(w)),以及校验和数字数 len_2 = floor(log2(len_1*(w-1)) / log2(w)) + 1。以 n=16、w=4 为例,len_1 = 32,len_2 = 3,故 len = 35,即私钥含35个随机值,公钥含35个链端点。

密钥生成过程:对第 i 条链,取私钥 sk_i 作为链起点 c_0,迭代 w-1 次得到链端点 pk_i = c_{w-1}。全部 pk_i 经一次压缩哈希(如 H(pub_seed || pk_1 || ... || pk_len))得到WOTS+公钥,该公钥再作为Merkle树叶节点参与上层树结构。私钥必须一次性使用,重复使用会因不同消息揭示同一条链的不同位置而泄露链间差值,进而可伪造签名。

三、校验和:抵御“链位置操纵”

若只对消息数字签名,攻击者可选取全零数字的消息,使所有签名值都停留在链起点附近,从而轻易伪造。WOTS+引入校验和:把消息各数字之和 S = Σ m_i 取补,编码为 len_2 个额外数字,附加在消息数字之后一起签名。校验和数字的链位置随消息数字增大而减小,形成“此消彼长”的约束,使攻击者无法同时压低所有链位置。验证时,验证者重新计算校验和并检查其链推进结果是否与签名一致。

四、签名与验证的完整流程

签名阶段:对消息 M 计算摘要 D = H_msg(M),按 w 进制展开为 len_1 个数字,追加校验和的 len_2 个数字,得到长度 len 的数字序列 d_1..d_len。对第 i 条链,从私钥 sk_i 出发迭代 d_i 次,得到签名分量 σ_i。全部 σ_i 即WOTS+签名。

验证阶段:验证者拿到签名 σ_i 后,对第 i 条链从 σ_i 继续迭代 (w-1) - d_i 次,得到候选端点 pk'_i;将全部候选端点压缩为公钥,与已知WOTS+公钥比对,一致则接受。下图展示了单条链上“私钥起点—签名位置—公钥端点”三者的位置关系,以及签名与验证各自推进的方向。

WOTS+ 单条哈希链:位置与推进方向(示例 w=4,链长 3) c₀ 私钥起点 skᵢ c₁ 中间链值 c₂ 中间链值 c₃ 公钥端点 pkᵢ F F F 签名分量 σᵢ = c₁ (示例数字 dᵢ = 1) 签名:迭代 dᵢ 次 验证:从 σᵢ 继续迭代 (w−1)−dᵢ 次,得到候选端点 pk′ᵢ 单向性:c₀ → c₃ 可算 c₃ → c₀ 不可逆推 校验和约束:Σdᵢ 与补码数字联动 防止所有链位置被同时压低

五、安全假设与效率权衡

WOTS+的安全性建立在两个假设上:其一,底层哈希函数 F 具有单向性与抗碰撞性;其二,每条私钥只使用一次。SLH-DSA通过Merkle树与hypertree结构,把大量一次性密钥组织成可验证的多次签名体系,从而在“一次性”约束下实现实用签名。相比传统RSA/ECDSA,WOTS+不依赖数论难题,具备抗量子性,但代价是签名体积大、计算量高。

效率权衡体现在参数选择上:w 越大,链越长、签名分量越少(len 减小),签名更短但单次签名计算量增加;w 越小则相反。SLH-DSA提供“小签名/慢”与“快/大签名”两组参数集,正是这一权衡的体现。实现时需注意:链迭代必须严格按地址结构区分每条链,避免不同链共用同一哈希输入导致安全性下降;私钥生成后应立即使用并销毁,绝不可跨消息复用。

实现要点:链迭代中的 ADRS 必须包含链编号与哈希模式,确保不同链、不同层级的哈希输入互不冲突;校验和数字的编码顺序需与验证端严格一致,否则会出现“签名正确但验证失败”的隐蔽错误。

综上,WOTS+以“单向哈希链 + 校验和 + 一次性私钥”三要素,构建了一个结构简单、安全假设清晰的一次性签名原语。它不追求单次签名的极致紧凑,而是通过上层树结构把一次性能力放大为可用的多次签名方案,这正是SLH-DSA整体设计的基石。