零知识证明常被描述成“证明我知道一个秘密,但不告诉你秘密是什么”。这句话只说对了一半。真正让零知识证明成立的关键,是证明者、验证者和秘密三者之间有一套明确的协作规则:证明者不能只是口头声称,验证者也不能无条件相信,而秘密本身在整个过程中不能被传递出去。
三个角色和三个性质
在零知识证明协议中,证明者掌握某个秘密,并希望向验证者证明一个与该秘密有关的命题为真。验证者只负责检查证明是否成立,不需要、也不应该获得秘密本身。
这套协作要满足三个性质。完备性是指,如果命题为真且证明者诚实执行协议,验证者最终会被说服。健全性是指,如果命题为假,作弊的证明者只有极小概率能骗过验证者。零知识性是指,验证者在整个过程中除了“命题为真”之外,学不到任何关于秘密的额外信息。
这三个性质缺一不可。只有完备性,验证者可能被假证明骗过;只有健全性,证明过程可能泄露秘密;只有零知识性,证明本身可能无法被验证。
交互式证明:承诺、挑战、回应
最直观的零知识证明是交互式的。证明者和验证者来回多轮对话,每一轮大致包含三个动作:证明者先做出一个承诺,验证者随机提出一个挑战,证明者再给出回应。验证者检查回应是否符合承诺和挑战的约束。
一个常被引用的例子是“洞穴”故事。洞穴有两个出口,中间有一扇需要暗号才能打开的门。证明者声称知道暗号。验证者站在洞外,让证明者先随机从一个出口进入,然后验证者随机喊出另一个出口,要求证明者从那里出来。如果证明者知道暗号,他总能开门走到指定出口;如果不知道,他只有一半概率碰巧从正确出口出来。重复多轮后,作弊者连续蒙对的概率会变得极低。
这个例子里,验证者始终没有听到暗号,却逐渐相信证明者知道暗号。每一轮验证者看到的只是“证明者从某个出口出现”这一局部信息,单独看并不足以推出暗号。
为什么需要多轮重复
单轮交互的说服力有限。以洞穴例子来说,不知道暗号的人仍有一半概率蒙对。重复二十轮后,连续蒙对的概率约为二的二十次方分之一。重复次数越多,健全性越强,但交互成本也越高。
这也是交互式零知识证明的一个实际限制:证明者和验证者必须同时在线,并且进行多轮通信。对于需要把证明记录下来、事后交给其他人验证的场景,交互式协议并不方便。
非交互式证明:把对话变成一张可检查的凭证
非交互式零知识证明试图解决这个问题。证明者生成一份证明,验证者事后单独检查这份证明即可,不需要再与证明者来回对话。资料中提到,非交互式证明的成立通常依赖计算假设,典型假设是理想的密码杂凑函数。
这意味着,非交互式证明并不是“无条件正确”,它的安全性建立在某些数学难题或密码学假设之上。理解这一点很重要:零知识证明的“零知识”说的是不泄露秘密,不等于证明系统本身没有前提条件。
从秘密到电路:证明者到底在证明什么
实际应用中,零知识证明很少直接证明“我知道某个密码”。更常见的做法是把待验证的计算转换成一个算术电路,电路由加法门、乘法门等基本单元组成。证明者用自己的秘密输入运行这个电路,然后证明“我确实按规则运行了电路,并且输出符合预期”,但不暴露输入和中间值。
例如,证明者想向验证者证明自己的网银密码长度是二十位,但不想透露密码内容。验证者把“计算字符串长度”的逻辑转换成电路交给证明者。证明者用密码作为输入运行电路,生成一份零知识证明。验证者检查证明后,只能确认“密码长度确实是二十位”,无法从中还原密码。
这个思路把零知识证明的适用范围从“我知道某个数”扩展到了“我正确执行了一段计算”。电路越大,证明生成和验证的成本通常也越高,这是实际系统需要权衡的地方。
不同实现方案的取舍
资料中提到了几种常见的零知识证明实现。zk-SNARKs 的特点是证明小、验证快,但通常需要可信设置:系统初始化阶段生成公共参数,如果初始化过程中的秘密信息泄露,安全性会受影响。zk-STARKs 不需要可信设置,并被认为具有后量子安全性,但证明尺寸通常比 zk-SNARKs 大。PLONK 的特点是一套参数可以重复用于多个证明,减少了重复设置的工作,但它仍然需要某种形式的设置。Bulletproofs 不需要可信设置,常用于范围证明,即证明某个数值落在某个区间内而不暴露具体数值,但生成证明可能较慢。
这些方案没有绝对的优劣,选择取决于具体场景对证明大小、验证速度、是否需要可信设置以及是否考虑后量子安全的权衡。资料中的比较属于技术特性说明,不构成对任何项目的推荐。
零知识不等于“什么都能证明”
零知识证明能证明的,是那些可以转化为可验证计算的问题。如果命题本身无法用电路或形式化规则表达,零知识证明协议就无从下手。此外,零知识性保护的是秘密不被验证者获取,但证明系统本身的实现漏洞、可信设置的管理问题、以及证明生成环境的安全,仍然可能影响整体安全性。
把零知识证明理解成“证明者和验证者按照一套规则协作,让验证者只得到命题真假这一个信息”,比把它当成万能隐私工具更准确。它的价值在于把“信任”从对某个中间方的依赖,转移到对数学协议和计算假设的检查上。