ZK
在信息时代,如何在不泄露敏感数据的前提下验证信息的真实性,成为了一个至关重要的问题。零知识证明 (Zero-Knowledge Proofs, zk) 正是解决这一难题的密码学工具。它允许一方(证明者)向另一方(验证者)证明某个陈述是真实的,而无需泄露除该陈述为真以外的任何信息。
核心概念:在不透露秘密的情况下证明你知道秘密
零知识证明的核心思想可以用一个经典的例子来理解:
假设 Peggy (证明者) 声称她知道一个只有她才能打开的秘密门的密码。Victor (验证者) 希望确认 Peggy 是否真的知道密码,但他不希望 Peggy 向他透露密码本身。
使用零知识证明,Peggy 可以通过一系列交互,让 Victor 确信她知道密码,而 Victor 在整个过程中不会获得任何关于密码的信息。例如,他们可以设计一个协议,让 Peggy 在不让 Victor 看到她走哪条路的情况下,能够随意地从门的左右两侧进出。多次重复这个过程后,如果 Peggy 每次都能成功做到,Victor 就会高度确信她知道密码,因为随机猜测成功的概率极低。
零知识证明的关键属性
一个严谨的零知识证明系统必须满足以下三个核心属性:
-
完备性 (Completeness): 如果陈述是真实的,并且证明者和验证者都遵循协议,那么验证者总是会被说服。在上述例子中,如果 Peggy 真的知道密码,她总是能够成功地通过秘密门。
-
可靠性 (Soundness): 如果陈述是虚假的,那么即使一个恶意的证明者试图欺骗,验证者也只会以极小的概率被说服。在密码门的例子中,如果 Peggy 实际上不知道密码,她不可能每次都成功地通过秘密门而不被 Victor 发现。这个极小的欺骗概率通常可以通过增加交互轮数来降低。
-
零知识性 (Zero-Knowledge): 在验证过程中,验证者除了知道陈述是真实的之外,不会获得任何额外的信息。这意味着验证过程不泄露任何关于证明本身的信息,例如密码的具体内容或解开谜题的具体步骤。
不同类型的零知识证明
随着密码学研究的深入,涌现出多种具体的零知识证明方案,它们在效率、交互性和底层数学原理上有所不同。一些重要的类型包括:
-
交互式零知识证明 (Interactive Zero-Knowledge Proofs): 在这类证明中,证明者和验证者需要进行多轮交互,验证者会发送挑战,证明者需要做出相应的回应。上述的密码门例子就是一个交互式零知识证明的简化说明。
-
非交互式零知识证明 (Non-Interactive Zero-Knowledge Proofs, NIZK): 在这类证明中,证明者可以生成一个独立的证明,验证者只需要验证这个证明即可,无需与证明者进行交互。这在实际应用中更加便捷。
-
zk-SNARKs (Zero-Knowledge Succinct Non-Interactive ARguments of Knowledge): 这类非交互式证明具有“简洁性”(证明体积小)和“快速验证”的特点,并且通常依赖于复杂的密码学假设,例如配对曲线。zk-SNARKs 在区块链领域得到了广泛应用。
-
zk-STARKs (Zero-Knowledge Scalable Transparent ARguments of Knowledge): 这类非交互式证明也具有零知识性和可靠性,并且在某些方面具有更高的可扩展性。与 zk-SNARKs 不同的是,zk-STARKs 通常依赖于更透明的密码学假设(例如抗碰撞哈希函数),并且不需要可信设置。
用一个更容易理解零知识证明的例子来举例:
一位富豪父亲在临死前为了找寻他的亲生儿子发起了一场寻亲活动,许多的"儿子"踊跃报名来参加这个活动,并且儿子的数量高达上亿个。那么富豪怎么在分辨不出儿子面部特征且不逐一比对 dna 的方法下筛选出他的真儿子呢(当然,零知识证明的重点是在不暴露其他有价值信息的情况下提出的方法,富豪自然不想暴露自己的 dna 以及公布家人的照片来确认)?这里儿子数量合不合逻辑不多做探讨
注意:这里提出的每个交互信息必须确保真儿子能答对,而假儿子不一定答对,否则属于无效交互。
-
交互式零知识证明:
父亲向各个儿子进行多轮交互,从儿子们的回答来区分真假:
-
小时候最喜欢的玩具是恐龙还是奥特曼?
-
陪你睡觉的是妈妈还是王阿姨 ?
-
吃饭的时候是左手拿筷子还是右手拿?
-
家门口有没有超市?
-
...共 n 个问题多轮问询后
真儿子知道所有的答案,每道题答对的概率为 100%,结果正确性为 1 ** n
假儿子答对所有题需要靠猜测,因为他并不是真儿子。假设他在猜题目,每道题猜对概率为 50% ,那么结果正确性为 0.5 **n
-
最简单的数学知识可以得知,当问的问题足够多时,真假儿子的区分就越加明显,零知识证明的效果也就越明显。这个过程中没有涉及双方隐私和明确的指向性,当然王阿姨姓王这个事情可以忽略一下,仅为举例。
-
非交互式零知识证明:
父亲公布一个证明儿子是儿子的公开问题,而这个问题只要能答对就被认可为儿子
-
写出你小学六年级期末考试的语文作文
-
写出爸爸小时候创作的钢琴曲曲谱
当然,作为真人可能觉得这太离谱了,这是不可能完成的任务。(但是计算机程序中,这样的证明是合理的。因为处理的是密码学证明问题,如特定的私钥能解开特定公钥的加密文件。只要正确的身份结合问题就能证明出来)
-
-
如 zk-SNARKs 和 zk-STARKs 等均为密码学方面的进一步加强。其创新的本质是针对算法的更迭及证明逻辑的抽象化,目的是扩大证明者,也就是真假儿子接触题目顺利解出的概率区别(非密码学专业人士,仅为个人看法,请自行搜索对应信息了解),后续再更新。
风险(潜在的出错概率)
- 如同以太坊:以太坊的公钥(地址)和私钥是开放式的,遵循 bip39 标准的助记词按照规律生成的一串代码。任何人可以遵循这一规律,随机生成一个钱包。可以体验我的仓库中的区块链交互工具,多生成几个钱包体验一下。这个地址范围的数量过于庞大,以至于目前的所有计算机无法穷尽(这也是每个人钱包相对安全的基本保障)。那么别人有没有可能生成你钱包的私钥呢?答案是肯定的,只是这个概率非常的低,低到从概率上可以忽略不计。
- 当然,有没有人这么干呢?确实有,挺奇怪的事情是,这也从另一种角度证明了,事实上以太坊以及其链上的任何财产,都是向所有人开放的。你能不能找到拉夫德鲁,能不能当上海贼王全凭你生成的地址多不多,如果你拥有了整个以太坊的私钥对,那么以太坊就是你的。
零知识证明(zk)事实上也是一个以概率作出筛选的证明机制,那么它是否真正向富豪证明了全部答对的那个人是他的真儿子呢?当然,从概率上来说,这个问题全部答对的儿子,就是他的儿子了!这个概率假定为 99.999999999999999999% ,如果富豪认为这个概率可以作为他儿子的证明,那么证明就完全了。 至于还有这么一个问题,一个假儿子闭着眼睛回答对了这近乎无穷个问题,那么同样也按照规则以近乎不可能的概率最终继承了富豪的遗产,这也就是零知识证明目前难以避开的问题,始终有那么一个概率存在!
零知识证明的应用场景
零知识证明作为一种强大的密码学工具,在多个领域展现出巨大的潜力:
- 区块链和加密货币: 用于提高交易隐私(例如,在不暴露交易金额和参与者的情况下验证交易的有效性)、扩展性(通过验证链下计算结果)和互操作性。
- 身份验证和隐私保护: 用户可以在不泄露个人敏感信息的情况下证明自己的身份或满足某些条件(例如,证明自己年满 18 岁)。
- 安全计算: 允许多方在不暴露各自输入数据的情况下进行联合计算,并验证计算结果的正确性。
- 合规性: 企业可以在不泄露商业机密的情况下向监管机构证明其符合特定的法规要求。
- 投票系统: 可以构建既能保证投票隐私又能验证投票有效性的电子投票系统。