“固定N=$2^h$与消息长度ℓ。诚实生成N对相互独立的Lamport一次性密钥 $(sk i,pk i)$,将每份公钥规范序列化为 $v i=\operatorname{u32}(\ell)…”
形式陈述
每一位有两份秘密
设
私钥是全部x,公钥是按固定(i,b)顺序排列的全部y。对
验证先检查消息位数、签名项数、各项合法长度与公钥形状,再逐项检查
安全目标是EUF-CMA的至多一次签名查询版本:对手拿到公钥,可以自适应选一条消息请求签名,最后必须给出一条未查询过的新消息及有效签名。该限制是实验的一部分,不能把结论改写成允许多次签名的普通EUF-CMA。
直觉
公钥像每个位置上两把锁的验证样本。消息位是0,就交出这一位0侧的钥匙;消息位是1,就交出1侧的钥匙。别人能核对交出的钥匙,却不应因此学会同一位置另一侧的钥匙。
一条新消息至少改变一个位置。在那个位置,攻击者要打开一把此前没有拿到原像的锁。安全证明要把这句话变成具体反演算法,而不能仅说“哈希很难逆”。特别是对手看完公钥才选消息,归约仍须处理这种自适应选择。
例子与边界
四位消息1010
把8份秘密写成下表,每列是同一消息位置:
| 选择位 | 位置0 | 位置1 | 位置2 | 位置3 |
|---|---|---|---|---|
| 0 | ||||
| 1 |
签1010时公开
HASH-6检查器令
签两条消息以后怎样伪造
故意用同一私钥签0000和1111,攻击者就得到全部8份秘密。无需反演任何函数,它从两份签名取出
更一般地,两条已签消息在d个位置不同,就暴露这d列的两侧,其他列只暴露一侧。仅靠选择这些已知原像,就能为
重复发送同一份已有签名不会额外暴露另一侧。对于本页确定性算法,再签同一条消息也返回同样内容;但一般有状态接口仍应把重新签名与重传已有签名区分开,避免上层把消息变化误判为同一次请求。
推论与应用
从伪造到反演的猜位归约
先考虑对手确实查询一次的情况。归约者拿到单向挑战
查询消息m到来时,若
在一次成功的真实伪造记录中,设新旧消息不同的位置数为d≥1。共
因此,对任意该类伪造者A,存在高效反演者B满足
函数族单向且ℓ为多项式时,右侧可忽略。这是普通新消息不可伪造结论;没有由此证明同消息上的强不可伪造。f可以有多个原像,不能额外假设每条消息恰有一份可接受签名。
大小、预哈希与下一步
若x、y均n字节,私钥与公钥各为2ℓn字节,签名ℓn字节。生成公钥需2ℓ次f,签名仅选择并复制ℓ项,验证需ℓ次f;签名的字节输出本身仍需时间。本例ℓ=4、n=32,公钥256字节、签名128字节。
签任意长文档时,常先用另一公开哈希G压成ℓ位。此时新文档可能产生同一摘要;必须把G的碰撞问题纳入证明,并固定文档编码、用途标签与消息域。本页主例直接签4位,不把“先哈希一下”隐藏在既有定理里。
终点任务:对0011与0101画出暴露的原像列,列出可拼出的四条消息0011、0001、0111、0101,指出新消息0001与0111。再解释为何把同一份公钥重新编号,或放进不同证书,并不会恢复已经泄漏的秘密。Merkle签名使用真正独立的一次性密钥,而不是给同一密钥换标签。
参考资料
- Leslie Lamport,Constructing Digital Signatures from a One Way Function,CSL-98,1979,§2的公开像/揭示原像机制。原报告使用等大小子集,本页采用现代教材的成对比特版本,不把二者公式混写。
- Dan Boneh、Victor Shoup,作者教材v0.6,§14.1、Theorem14.1与§14.2。本文独立写出2ℓ猜位归约和四位复用攻击;原像独立采样,不额外使用压缩种子的PRG假设。