🏠 总目录📚 本教程 21 · 零知识证明 ← →
📑 本页目录(点开跳转)

21 · 零知识证明

⏱ 28 分钟 | ⭐ 密码学里最反直觉的结果


🎯 一句话

我能让你确信"我知道某个秘密",而你除了"他确实知道"之外,什么都学不到。 听起来自相矛盾 —— 但它不仅可能,而且任何 NP 问题都能做到。

证明者 P知道秘密 x验证者 V不知道 x① 承诺 t = g^r② 随机挑战 c③ 响应 s = r + c·x验证:g^s ≟ t · y^cV 确信 P 知道 x —— 但 V 学不到 x 的任何信息关键在②:挑战是 V 【事后】才给的,P 无法提前编好答案⭐ 三个性质缺一不可:完备性(真的能证)、可靠性(假的证不了)、零知识(学不到别的)
关键在第②步:挑战是验证者事后才给的,证明者无法提前编好答案。⭐ 重复多轮之后,蒙对的概率低到可以忽略 —— 而验证者始终没拿到 x 本身。

🎨 一、先建直觉:色盲朋友与两个球

流程图

你有两个球,除了颜色(一红一绿)完全相同。
你的朋友是色盲,他不信这两个球颜色不同。
⭐ 怎么让他相信,又不告诉他哪个是红的?
① 他两手各拿一个球,背到身后
② 他【自己决定】要不要交换,然后伸出来
③ 你说"换了"还是"没换"
如果球真的不同色→你每次都答对
如果球其实同色→你只能猜,答对概率 1/2
⭐ 重复 n 次,你还全对 ⟹ 蒙对概率 2⁻ⁿ
而他【始终不知道哪个是红的】 ✅

三条性质,正好对应零知识证明的定义:

性质 含义 在例子里
完备性 真的话,诚实证明者能说服验证者 球真不同色就每次都对
可靠性 假的话,骗子几乎不可能蒙混过关 同色时蒙对概率 2⁻ⁿ
零知识 ⭐ 验证者学不到秘密本身 他始终不知道哪个是红的

📐 二、零知识严格是什么意思

模拟器(Simulator)定义: 存在一个不知道秘密的模拟器,它能生成一份和真实交互 在统计上不可区分的"交互记录"。

💡 人话翻译:

验证者看到的一切,他自己在家就能编出来 —— 既然能自己编,那这段交互显然没有传递任何信息 ✅

对照

⚠️ 注意这个定义的巧妙之处:

它不是说"信息没被传出去"(那很难定义),

而是说"这段记录你不需要我也能造出来" ⭐


🔢 三、一个能算的例子:Schnorr 身份认证

目标:证明我知道 $x$,使 $y = g^x$(离散对数),但不泄露 $x$。

操作步骤

  1. 证明者:选随机 r,发承诺 t = g^r
  2. 验证者:发随机挑战 c
  3. 证明者:回 s = r + c·x
  4. 验证者:检查 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——两条底线,成本差好几个数量级

✅ 检查点

  1. 零知识证明的三条性质是什么?用色盲球的例子说明。
  2. "零知识"的严格定义为什么要用模拟器?它巧妙在哪?
  3. 写出 Schnorr 身份认证的四步和验证等式。
  4. 可靠性证明里的"知识提取"是什么?它和第 17 章哪个事故是同一个数学?
  5. 模拟器怎么在不知道 x 的情况下造出合法记录?
  6. zk-SNARK 四个字母各代表什么?它最震撼的能力是什么?
  7. "抽查一个随机点就够了"背后是什么引理?
  8. 什么是毒废料?多方仪式为什么能缓解?
  9. STARK 为什么天然抗量子?代价是什么?
  10. under-constrained circuit 为什么特别危险?
👀 答案
  1. 完备性(真的能说服)、可靠性(假的蒙不过,n 轮后 2⁻ⁿ)、零知识(学不到秘密)。色盲球:真不同色就每次答对;同色只能猜;他始终不知道哪个是红的。
  2. 因为"信息没被传出去"很难直接定义。模拟器定义说的是"这段交互记录,验证者自己在家就能编出来"——既然能自己编,就说明没传递任何信息。
  3. ①发承诺 t = g^r ②验证者发挑战 c ③回 s = r + c·x ④验证 g^s ≟ t·y^c。
  4. 若同一个 t 能对两个不同挑战给出合法响应,则 x = (s₁−s₂)/(c₁−c₂),即能从证明者身上把秘密提取出来。和第 17 章 ECDSA k 重复泄露私钥是同一个数学——证明安全时叫"知识提取",实现出错时叫"私钥泄露"。
  5. 倒着来:先随机选 c 和 s,再令 t = g^s·y^(−c)。这样天然满足验证等式,且分布与真实交互一致。
  6. Succinct(证明极短、验证极快)、Non-interactive、ARgument(计算受限下不可伪造)、Knowledge。能力:证明"我正确执行了一段任意程序",验证者不需重新执行也看不到输入。
  7. Schwartz–Zippel 引理——两个不同的多项式在随机点上相等的概率极小,所以抽查一个点就能高概率确认等式成立。
  8. 可信设置过程中产生的随机数,谁留着它谁就能伪造任意证明。多方仪式让几十上百人接力,只要有一个人销毁了自己那份,整体就安全(以太坊 KZG 仪式 14 万人参与)。
  9. 因为它只依赖哈希函数,不用椭圆曲线或配对,而哈希不受 Shor 算法威胁。代价:证明大 100 倍(50–200 KB vs 200 B),链上成本更高。
  10. 电路少写一条约束,攻击者就能构造出通过验证但语义错误的证明。危险在于无法通过测试发现——正常输入全都表现正常,只能靠形式化验证和审计。

🛑 可以停在这里

⚡ 走神救援

ZKP = 让你确信我知道秘密,而你除此之外什么都学不到,⭐ 而且任何 NP 问题都能做到。

⭐ 「零知识」是用模拟器定义的:存在一个不知道秘密的模拟器,能造出和真实交互统计上不可区分的记录——验证者看到的一切,他自己在家就能编出来,所以没传递任何信息。

⭐⭐ 可靠性靠知识提取:能对两个不同的挑战都作答,就能反解出秘密——而这和数字签名那章「随机数重复就泄露私钥」是同一个数学,一体两面。 零知识则靠倒着造:先选挑战和回答,再倒推出承诺。把挑战换成哈希就变成非交互的,⭐ 于是它就是 Schnorr 签名——签名和零知识证明本质是同一个东西。

zk-SNARK 的能力是:⭐ 证明「我正确执行了任意程序」,而验证者不必重跑、也看不到输入。 原理直觉是把「检查几百万条约束」变成在一个随机点上检查多项式等式(不同的多项式在随机点相等的概率极小)。

⚠️ 可信设置的「毒废料」:谁留着谁就能伪造任意证明——⭐ 所以要多方仪式,只要有一个人真的销毁了自己那份就安全。 方案上记结构就够:通用的、⭐ 不需要设置且只依赖哈希所以抗量子的(代价是证明大得多)、以及不需要设置但验证慢的。

⭐ zk-Rollup 是最能说明价值的用途:验证几百字节的证明,比重跑上千笔交易便宜几个数量级——「验证比计算便宜」就是它的全部价值。

⚠️ 两个误解要挡住:零知识不等于匿名(元数据照样泄露);💥⭐ 约束写少了是这里最危险的 bug——能造出通过验证但语义错误的证明,而且测试发现不了,只能靠形式化验证。

下一节 👉 22-云密码学.md

打卡记录保存在你的浏览器里,首页能看到总进度