“固定N=$2^h$与消息长度ℓ。诚实生成N对相互独立的Lamport一次性密钥 $(sk i,pk i)$,将每份公钥规范序列化为 $v i=\operatorname{u32}(\ell)…”
形式陈述
被认证的是位置和值
固定高度
令 H 是输出 n 字节的公开哈希。下面的教学编码使用不同首字节区分叶与内部节点,并使用规范字段编码:
u32、u8 是指定宽度的大端无符号整数,长度按字节计;教学实现限制
认证路径由 h 个兄弟摘要组成,顺序从叶向根:
验证先拒绝越界索引、错误摘要长度以及路径长度不等于 h 的输入。然后算 z=L(i,v),令 p=i。第 j 层按 p 的最低位决定左右:p偶数算
直觉
验证者不需要重新拿到整个列表。它已经有当前小树的一侧摘要,只缺同层另一侧,两个合起来就能向上走一层。一路带上这些“缺失的兄弟”,最后应到达事先信任的同一个根。
路径不是一袋可以任意排序的哈希。索引的二进制位告诉我们每一步站在左边还是右边;高度告诉我们还要走几步。两者与根共同定义本次要检查的声明。内部节点和叶采用不同前缀,则一段“值的字节”不会直接被当作“两棵子树的摘要对”。
例子与边界
八个字母的三项路径
令列表为 ASCII 字节 A、B、C、D、E、F、G、H,索引从0开始。验证 C 位于索引2,二进制为010。所需摘要依次是
用 SHA-256 执行上述完整编码,根为:
f024263693113d02f6123e0261af76188412417fc377c1360bfcac0413b59de7
这不是字符串 ABCDEFGH 的一次普通哈希。完整的三个兄弟摘要与逐项复算入口见HASH-6任务。本例验证用1次叶哈希加3次内部哈希,传输3个32字节摘要,共96字节;值、索引和外围编码另计。
把索引2改成3而保持值C和路径,叶编码及第一步方向都变了,验证失败。逆转路径顺序,或把高度改成2并截去最后一项,也失败。只比较某个中间摘要、不检查完整高度,会把子树根误当作整个列表的根。
根不自行证明来源或保密
攻击者完全可以自己编一棵树,生成正确路径,再把自己的根一起发来。路径验证只能说明它与那个根相容,不能说明根属于哪位发布者。根的身份认证与版本新鲜性必须由外部已明确的机制提供;本页没有给它们免费保证。
这个确定性摘要也不满足承诺方案的消息隐藏实验。若整个列表只可能是两个已知候选,观察者可分别算根来区分。常见说法“Merkle承诺”通常强调位置绑定;它不自动同时拥有隐藏性、零知识或不可延展性。
推论与应用
正确性与错误打开的碰撞见证
正确性对层数归纳。初始 z 等于真正的第 i 片叶摘要;若第 j 层 z 已是路径上真正节点,正确兄弟和索引方向便恢复它的父节点。h 次后 z 必为真实根。
可靠性依赖抗碰撞性。固定一棵正确构建的树,假设某个
归约者可保存真实树并复算伪路径,在线性于路径长度的额外工作中找到这对哈希输入,不需要猜哪一层。因而若一个高效对手经常提交错误打开,也就能经常找到底层哈希碰撞。这个论证证明计算绑定,未声称碰撞数学上不存在。
成本和迁移
建满树需 N 次叶哈希及 N−1 次内部哈希,保存全部摘要占
终点任务:不运行脚本,列出索引5的兄弟坐标与左右次序,答案应为
参考资料
- RFC 9162,§2.1.1、§2.1.3:叶/内部节点分域与包含路径。该规范支持非二幂大小的树;本文刻意固定满树,并额外编码索引与层数,二者字节格式不兼容。
- Dan Boneh、Victor Shoup,A Graduate Course in Applied Cryptography, v0.6,§8.9,树哈希与成员证明。本文字母例、标签、逐层碰撞提取及成本表按自己的接口独立展开。