📑 本页目录(点开跳转)
21 · 零知识证明
⏱ 28 分钟 | ⭐⭐ 密码学里最反直觉的结果
🎯 一句话
我能让你确信"我知道某个秘密",而你除了"他确实知道"之外,什么都学不到。 听起来自相矛盾 —— 但它不仅可能,而且任何 NP 问题都能做到。
🎨 一、先建直觉:色盲朋友与两个球
你有两个球,除了颜色(一红一绿)完全相同。
你的朋友是色盲,他不信这两个球颜色不同。
⭐ 怎么让他相信,又不告诉他哪个是红的?
① 他两手各拿一个球,背到身后
② 他【自己决定】要不要交换,然后伸出来
③ 你说"换了"还是"没换"
如果球真的不同色 → 你每次都答对
如果球其实同色 → 你只能猜,答对概率 1/2
⭐ 重复 n 次,你还全对 ⟹ 蒙对概率 2⁻ⁿ
而他【始终不知道哪个是红的】 ✅
三条性质,正好对应零知识证明的定义:
| 性质 | 含义 | 在例子里 |
|---|---|---|
| 完备性 | 真的话,诚实证明者能说服验证者 | 球真不同色就每次都对 |
| 可靠性 | 假的话,骗子几乎不可能蒙混过关 | 同色时蒙对概率 2⁻ⁿ |
| 零知识 ⭐ | 验证者学不到秘密本身 | 他始终不知道哪个是红的 |
📐 二、零知识严格是什么意思
模拟器(Simulator)定义: 存在一个不知道秘密的模拟器,它能生成一份和真实交互 在统计上不可区分的"交互记录"。
💡 人话翻译:
验证者看到的一切,他自己在家就能编出来 —— 既然能自己编,那这段交互显然没有传递任何信息 ✅
⚠️ 注意这个定义的巧妙之处:
它不是说"信息没被传出去"(那很难定义),
而是说"这段记录你不需要我也能造出来" ⭐
🔢 三、一个能算的例子:Schnorr 身份认证
目标:证明我知道 $x$,使 $y = g^x$(离散对数),但不泄露 $x$。
① 证明者:选随机 r,发承诺 t = g^r
② 验证者:发随机挑战 c
③ 证明者:回 s = r + c·x
④ 验证者:检查 g^s ≟ t · y^c
📐 三条性质怎么成立(想看再点)
完备性:$g^s = g^{r+cx} = g^r(g^x)^c = t\cdot y^c$ ✅
可靠性(特殊可靠性):若同一个 $t$ 能对两个不同挑战 $c_1\ne c_2$ 给出合法 $s_1, s_2$:
$$s_1 - s_2 = (c_1-c_2)x \;\Longrightarrow\; x = \frac{s_1-s_2}{c_1-c_2}$$
⭐ 说明能回答两个挑战的人,一定真的知道 x —— 这叫知识提取(extraction)。
零知识(诚实验证者下):模拟器不知道 $x$,但可以倒着来: 先随机选 $c$ 和 $s$,再令 $t = g^s \cdot y^{-c}$。 这样 $(t,c,s)$ 天然满足验证等式,且分布和真实交互一致 ✅
🔑 注意可靠性证明的形状: 它说的是"如果你能回答两个不同挑战,我就能从你身上把 x 提取出来"。 这正是第 17 章 ECDSA/Schnorr 中 k 重复会泄露私钥的同一个数学 —— 一体两面:证明安全时它叫"知识提取",实现出错时它叫"私钥泄露"。 ⭐
⚡ 变成非交互:Fiat–Shamir
把验证者的随机挑战 c 换成 c = H(y ‖ t ‖ 消息)
→ 不需要交互了 → 这就是 Schnorr 签名 ⭐
🔗 第 17 章已经见过这个转换。 签名和零知识证明,本质上是同一个东西的两种用法。
🚀 四、zk-SNARK:从"证明我知道 x"到"证明任意计算"
S uccinct ⭐ 证明【极短】(几百字节),且【验证极快】(毫秒)
N on-interactive 不需要来回交互
AR gument 计算受限的攻击者无法伪造
K nowledge 证明者确实"知道"那个输入
能做什么(这才是它震撼的地方):
⭐ 证明"我正确执行了一段任意程序",
而验证者【不需要重新执行】,也【看不到输入】
例:
· 我知道一个 SHA-256 的原像 → 不告诉你原像
· 这 1000 笔交易我都验过了 → 你只验一个 300 字节的证明
· 我的年龄 > 18 → 不告诉你生日
大致怎么做到的(不需要记)
程序 → 算术电路 → R1CS 约束组 → QAP 多项式
→ 用【多项式承诺】把"我满足所有约束"压成几个群元素
💡 一个关键直觉:
把"检查几百万个约束"变成"在一个随机点上检查几个多项式等式"。 因为两个不同的多项式在随机点上相等的概率极小(Schwartz–Zippel 引理)—— 所以抽查一个点就够了。
⚠️ 可信设置(Trusted Setup):最大的实践包袱
很多 SNARK 需要一次性生成公共参数,
过程中产生的随机数被称为【毒废料 toxic waste】
💀 谁留着它,谁就能【伪造任意证明】
✅ 缓解:多方仪式(MPC ceremony)
—— 几十上百人接力,只要【有一个人】销毁了自己那份,整体就安全 ⭐
(以太坊 KZG 仪式有 14 万人参与)
| 方案 | 可信设置 | 证明大小 | 特点 |
|---|---|---|---|
| Groth16 | ⚠️ 每个电路都要 | ~200 B | 最小最快 |
| PLONK | 通用(一次可复用) | ~500 B | 灵活 |
| STARK | ✅ 不需要 | ~50–200 KB | 抗量子(只依赖哈希)⭐ |
| Bulletproofs | ✅ 不需要 | ~1–2 KB | 验证较慢,适合范围证明 |
💡 STARK 只依赖哈希函数(不用椭圆曲线/配对), 所以它天然抗量子(第 23 章)—— 代价是证明大得多。
🌍 五、真实用途
| 场景 | 做什么 |
|---|---|
| 隐私币(Zcash) | 隐藏收付款方和金额,仍能证明"没有凭空造币" |
| zk-Rollup ⭐ | 把上千笔交易压成一个证明发上主链 → 扩容 |
| 身份证明 | 证明"我是某国公民/已成年",不出示证件 |
| 可验证计算 | 把计算外包给云,用证明确认它没算错(第 22 章) |
| 合规审计 | 证明"我的储备金 ≥ 负债",不公开具体账目 |
💡 zk-Rollup 的经济学很清楚: 主链验证一个 300 字节的证明,比重新执行 1000 笔交易便宜几个数量级。 "验证比计算便宜"这个不对称性,就是它全部的价值。
⚠️ 六、常见误解
| ❌ 误解 | ✅ 真相 |
|---|---|
| 「零知识 = 匿名」 | 是两回事。ZKP 保护证明内容,匿名要靠网络层 |
| 「有 ZKP 就绝对隐私」 | 元数据(时间、金额模式、IP)照样泄露 |
| 「STARK 一定比 SNARK 好」 | 证明大 100 倍,链上成本更高 |
| 「可信设置做完就没事了」 | 电路本身有 bug 一样完蛋 —— 约束写少了 = 能造假证明 ⭐ |
💥 "约束写少了"是 zk 领域最危险的 bug 类型(under-constrained circuit): 电路少写一条约束 → 攻击者能构造出通过验证但语义错误的证明。 这类 bug 无法通过测试发现(正常输入全都正常),只能靠形式化验证和审计。
🔗 和站内其他章的关系
| 相关的地方 | 和这一章的关系 |
|---|---|
| 第 17 章 Fiat–Shamir | 把交互式 ZKP 变成非交互式 |
| 第 17 章 k 重复泄露私钥 | ⭐ 和"知识提取"是同一个数学 |
| 第 16 章配对 | SNARK 的底层 |
| 第 9 章哈希 | STARK 的唯一假设 |
| 第 12 章 Merkle 树 | STARK 的承诺方案 |
| 第 3 章完美保密 | 零知识是它的"证明版":都是"看到的东西不含信息" ⭐ |
| 模型上线之后 · 合规审计与模型卡 | 审计要回答「上线的到底是不是审过的那个模型」——zkML 是唯一不用把模型交出去也能回答的方案,也是 ZKP 现在最认真的落地方向 ⭐ |
| 大模型 · 合规与伦理 | 那边隐私清单里的差分隐私是最好的对照组:DP 允许泄露 ε 并把它量化,ZK 要求泄露恰好为 0——两条底线,成本差好几个数量级 |
✅ 检查点
- 零知识证明的三条性质是什么?用色盲球的例子说明。
- "零知识"的严格定义为什么要用模拟器?它巧妙在哪?
- 写出 Schnorr 身份认证的四步和验证等式。
- 可靠性证明里的"知识提取"是什么?它和第 17 章哪个事故是同一个数学?
- 模拟器怎么在不知道 x 的情况下造出合法记录?
- zk-SNARK 四个字母各代表什么?它最震撼的能力是什么?
- "抽查一个随机点就够了"背后是什么引理?
- 什么是毒废料?多方仪式为什么能缓解?
- STARK 为什么天然抗量子?代价是什么?
- under-constrained circuit 为什么特别危险?
👀 答案
- 完备性(真的能说服)、可靠性(假的蒙不过,n 轮后 2⁻ⁿ)、零知识(学不到秘密)。色盲球:真不同色就每次答对;同色只能猜;他始终不知道哪个是红的。
- 因为"信息没被传出去"很难直接定义。模拟器定义说的是"这段交互记录,验证者自己在家就能编出来"——既然能自己编,就说明没传递任何信息。
- ①发承诺 t = g^r ②验证者发挑战 c ③回 s = r + c·x ④验证 g^s ≟ t·y^c。
- 若同一个 t 能对两个不同挑战给出合法响应,则 x = (s₁−s₂)/(c₁−c₂),即能从证明者身上把秘密提取出来。和第 17 章 ECDSA k 重复泄露私钥是同一个数学——证明安全时叫"知识提取",实现出错时叫"私钥泄露"。
- 倒着来:先随机选 c 和 s,再令 t = g^s·y^(−c)。这样天然满足验证等式,且分布与真实交互一致。
- Succinct(证明极短、验证极快)、Non-interactive、ARgument(计算受限下不可伪造)、Knowledge。能力:证明"我正确执行了一段任意程序",验证者不需重新执行也看不到输入。
- Schwartz–Zippel 引理——两个不同的多项式在随机点上相等的概率极小,所以抽查一个点就能高概率确认等式成立。
- 可信设置过程中产生的随机数,谁留着它谁就能伪造任意证明。多方仪式让几十上百人接力,只要有一个人销毁了自己那份,整体就安全(以太坊 KZG 仪式 14 万人参与)。
- 因为它只依赖哈希函数,不用椭圆曲线或配对,而哈希不受 Shor 算法威胁。代价:证明大 100 倍(50–200 KB vs 200 B),链上成本更高。
- 电路少写一条约束,攻击者就能构造出通过验证但语义错误的证明。危险在于无法通过测试发现——正常输入全都表现正常,只能靠形式化验证和审计。
🛑 可以停在这里
⚡ 走神救援
ZKP = 让你确信我知道秘密,而你除此之外什么都学不到,且任何 NP 问题都能做到。三性质:完备性/可靠性/零知识(色盲球例子:真不同色每次答对,同色只能猜,n 轮后蒙对概率 2⁻ⁿ,而他始终不知道哪个红)。⭐"零知识"用模拟器定义:存在不知道秘密的模拟器能造出统计不可区分的交互记录 —— 验证者看到的一切他自己在家就能编出来,所以没传递信息。Schnorr 身份认证:t=g^r → 挑战 c → s=r+cx → 验 g^s ≟ t·y^c。⭐可靠性靠知识提取:能对两个不同挑战作答 ⟹ x=(s₁−s₂)/(c₁−c₂) —— 这和第 17 章 ECDSA k 重复泄露私钥是同一个数学,一体两面。零知识靠倒着造:先选 c 和 s,再令 t=g^s·y^(−c)。Fiat–Shamir 把挑战换成哈希 → 非交互 → 就是 Schnorr 签名(签名和 ZKP 本质同一个东西)。⭐zk-SNARK = Succinct(证明几百字节、验证毫秒)+Non-interactive+ARgument+Knowledge,能力是证明"我正确执行了任意程序"而验证者不必重跑也看不到输入。原理直觉:把检查几百万约束变成在一个随机点上检查多项式等式(Schwartz–Zippel:不同多项式在随机点相等的概率极小)。⚠️可信设置的毒废料:谁留着谁能伪造任意证明 → 多方仪式,只要一个人销毁自己那份就安全(以太坊 KZG 14 万人)。方案:Groth16(~200B 每电路要设置)、PLONK(通用)、⭐STARK(不需设置、只依赖哈希所以抗量子,但证明大 100 倍)、Bulletproofs。用途:隐私币、⭐zk-Rollup(验证 300 字节证明比重跑 1000 笔交易便宜几个数量级,"验证比计算便宜"就是全部价值)、身份证明、可验证计算。⚠️误解:零知识≠匿名(元数据照样泄露);💥⭐under-constrained circuit(约束写少了)是最危险的 bug——能造出通过验证但语义错误的证明,且测试发现不了,只能靠形式化验证。
下一节 👉 22-云密码学.md