Fiat-Shamir 变换:把“你来问我答”的互动证明压成一条消息 图 1
Fiat-Shamir 变换:把“你来问我答”的互动证明压成一条消息 · 图 1

零知识证明的原始定义里有一个恼人的动作:证明者和验证者必须坐下来你来我往——验证者随机出题,证明者现场作答,几个回合之后验证者才点头。链上环境根本没有“坐下来”这回事:验证者可能是几十台同时跑同一段字节码的机器,没有机会现场掷骰子。把互动协议搬上链的那座桥是 1986 年 Fiat 和 Shamir 提出的变换:让证明者自己“掷骰子”——把骰子换成一个哈希函数。本文讲这座桥的结构、它欠下的账(随机预言假设),以及密码学文献给这笔账打过的折扣。

协议怎么被压扁

典型的互动身份证明(所谓 sigma 协议,Schnorr 协议是代表)走三步:证明者先交出一个随机承诺,验证者回一个随机挑战,证明者基于挑战给出应答。Fiat-Shamir 的改动只有一处:挑战不再由验证者现场掷出,而是由证明者对公共输入和承诺做哈希算出——挑战等于该哈希的产物。想伪造应答就得事先知道承诺将对应哪个挑战;而承诺一旦写进哈希,改承诺就换挑战,答不上来。于是整个三轮变成一条消息:承诺、由哈希算出的挑战、应答,验证者收到后重算一遍哈希就能独立核验。Schnorr 签名正是这个构造的产物:签名里的随机数承诺、以“消息加承诺”哈希出的挑战、应答标量,就是被压扁的 Schnorr 协议。比特币 BIP340 的 Schnorr 签名规范给出了完整的挑战计算规则,并用“标签哈希”(给每处哈希用途加上专属标签前缀)实现域分离,防止同一哈希函数在协议内外被误用成同一条输出。

Fiat-Shamir 变换:把“你来问我答”的互动证明压成一条消息 图 2
Fiat-Shamir 变换:把“你来问我答”的互动证明压成一条消息 · 图 2

随机预言:一个理想化的记账法

这套压法的正确性证明需要一个前提:哈希函数表现得像一个真随机的预言机——对任何输入返回均匀随机输出,且所有人只能看到它而不可能操纵它。这就是随机预言模型(ROM)。在这个模型里能证明 Fiat-Shamir 变换把“互动安全”平移成“非互动安全”;离开模型,证明就断了——目前没有任何标准模型构造能对所有协议通用地产出这种哈希。值得说清的是分寸:ROM 假设不是“假设哈希有魔法”,而是“目前没有已知的现实哈希被证实破坏这个证明”。二十多年的实践里,SHA 家族作为 Fiat-Shamir 的哈希实例没有出现过系统性崩塌。

已知的裂缝

文献对这笔账至少有三次认真的追讨。第一类是理论分离结果:存在这样的证明系统,它在 ROM 里可证安全、但把哈希换成任何具体函数后不再安全——这类构造是人工设计的反例,用来划清“ROM 安全不等于实现安全”的界限,目前尚无真实协议被此方式攻破的记录。第二类是工程侧的“哈希复用事故”:同一哈希函数在同一协议里被不同目的复用(比如挑战哈希恰好可以被用作消息哈希)、或攻击者能影响哈希输入的顺序,会让“承诺绑定挑战”的前提失效;对策是域分离——为每个用途给哈希喂上前缀标签或不同参数,把不同用途的哈希输出空间人为拉开。第三类出现在多实例与可延展场景:签名若不对“谁在签、签给哪条链”做绑定,验证规则稍宽的下游系统会让签名在不同场合被搬用,这是 Fiat-Shamir 消息构造里该不该把上下文哈希进去的设计问题而非变换本身的问题。

与 zk 电路的关系

现代 zk 证明系统(对多约束的 arithmetization 方案)几乎都靠 Fiat-Shamir 生成轮间挑战:证明者把当前所有承诺哈希一遍得到下一轮的随机挑战,整个证明变成一条可公开验证的消息。代价是哈希的输入空间必须完全可复现:协议顺序、域分离标签、电路标识任何一项在证明端与验证端不一致,验证就失败。工程上大量“证明生成端与链上验证器对不上”的疑难杂症,最后都落在这份输入清单上。另一个演进方向是让挑战生成尽量绑定代数承诺自身的结构,减少对理想化哈希的依赖——仍在发展中,主流生产系统仍以“哈希当随机预言”为主。

快速问答

问:Fiat-Shamir 让互动零知识变成非交互零知识,可靠性还在吗? 答:知识可靠性(特殊可靠性)由协议本身承担,Fiat-Shamir 主要负责把交互搬平;两者叠加后在 ROM 里给出完整保证,具体到某协议需读它自己的安全证明。

问:签名方案里的“nonce 复用即泄私钥”和 Fiat-Shamir 有关吗? 答:同一族后果:挑战绑死在承诺上,承诺一旦重复,两个不同挑战对应的应答就能解出私钥——Fiat-Shamir 的绑定性越强,重复承诺越是自杀行为,所以才有 RFC 6979 一类确定性生成承诺的方案。

问:怎么判断一个项目在这里踩没踩坑? 答:看它的规格书有没有给哈希用途列“输入清单”(域分离、顺序、上下文绑定),三样齐全的通常吃过教训。

风险提示

密码学变换的安全性依赖具体协议与哈希选择,把两个协议的安全证明混为一谈、或在自家协议里裸用通用哈希都是已知的事故模式。工程实现请以规范文本与经过审计的库为准。本文不构成任何投资或安全操作建议。