零知识证明

这节聊聊密码学和区块链领域非要有名的一个概念,零知识证明。

定义

先给定义。

零知识证明的英文全称是 Zero-knowledge Proofs,简写为 ZKP ,是一种非常有用的密码学方法。证明过程涉及到两个人,一个是宣称某一命题为真的示证者( prover ) ,另一个人是确认该命题确实为真的验证者( verifier )。所谓,零知识,意味着当证明完成之后,验证者除了获得对命题正确与否的答案之外,获得的对用户数据本身的“知识”为零。

例子

说起来有点抽象,实际看几个例子就明白了。

先举一个现实生活的例子。比如这里有一个房子,我要向你证明我有这个房子的钥匙,注意,这时候,我是示证者,而你是验证者,我需要证明的命题是“我有钥匙”,但是要保证验证成功后你对钥匙本身要“零知识”,一无所知。我有两种方式可以证明。第一种是我当着你的面把门打开,这样你可能就看见钥匙了,所以可以“证明”,但没有达成“零知识”。第二种方式,我在你看不见的情况下,把房间里面的一个椅子搬出来给你看,这样同样可以证明命题,同时最终验证者获得的关于钥匙的知识为零。

再来看第二个例子。我手中有很多张卡片,一部分上面印着0,其他的印着1,卡片看起来除了数字不同之外,其他没有区别,相同数字的卡片,看起来完全没有区别。好,这时我把这些卡片展示给你之后,请你转过身去,在从里面拿出一个0和一个1。然后,场景就有了,我是示证者,你是验证者,我想要证明的命题是“我选的这两张卡片数字是不同的”,当然,我需要保证你对卡片数字内容“零知识”的情况下证明这个命题。这时候,如果我单纯告诉你,我拿的这两张卡片的确是不同的,你未必会信,那到底要怎么用严谨的数学逻辑去证明呢?首先,我把两张卡片交给你,让你左手拿着0,右手拿着1(或者反之也可以),但是不允许你看数字。这时候需要你把卡片藏到背后,左右手交换(或者不交换)一下卡片,然后把卡片拿到胸前展示给我。这时候,我会告诉你,你有没有交换卡片,如果我能告诉你正确答案,那证明卡片的确是印着不同数字的,因为如果两张卡片一样,那么是否交换我是判断不出来的。这时你也会想,这个还是不保险,万一我是猜对的呢?所以同样的过程可以反复多次,如果每次我都能说对,你可以确信“我选的这两张卡片数字是不同的”。

这里补充一点,关于零知识证明有两个分类,一种叫做”交互式零知识证明“,英文叫做 Interactive ZKP ,第二个关于卡片的例子显然属于这一类,需要双方反复沟通多次,或者说在不断的交互中,才能达到证明的目的。另外一种就很容易猜到了,就叫”非交互式零知识证明“,Non-interactive ZKP ,第一个关于房间钥匙的例子就属于这一类,只要我出示一下椅子,就可以明我是拥有钥匙的,不需要反复沟通。”交互式零知识证明“的问题是比较明显的,不能拿出直接的证据来向任何人证明命题的成立,而是需要跟每一个验证者交互,所以应用场合就会受到限制,而”非交互式零知识证明“就没有这个问题了,区块链领域的用来保护隐私的 ZK-SNARKS 就是属于这种这种非交互式的思路。

最后看一个跟密码学相关的例子,如何证明我持有私钥。懂密码学的同学可能可以猜到,不懂的同学可以先补一下公钥密码学知识。如果我想要向你证明我是一个公钥对应的私钥的持有者,那就需要你用公钥加密任意一段只有你自己知道的信息,然后把密文发给我。如果我可以把解密后的信息发送给你,那么就可以证明我的确持有私钥。同时,整个证明过程并没有暴露私钥信息。

明白了这几个例子,对于什么是零知识证明就很清楚了。

意义

区块链兴起之后,密码学受到更大的重视,零知识证明作为一种密码学方法,热度也提高了很多。但是零知识证明到底有什么现实意义,可以用在哪些场合呢?

以前零知识证明还有一个名字叫“最小暴露证明”,意思是可以在证明一些命题的同时,对信息进行非常好的保密,这个特点显然对保护隐私是有帮助的。例如,我现在要贷款,贷款公司要求我的月收入是大于两千元的,但是我不想暴露具体我的工资是多少,这个时候就可以用零知识证明的方式来达成。

另外在区块链上,也可以用零知识证明来达成隐藏转账信息的作用。熟悉比特币的同学知道,比特币上每一笔交易都是透明的,谁给谁转了多少钱都是公开可查的。但是,通过零知识证明技术实现的隐私币,例如 Zcash 就可以达成隐藏交易信息,但是同时能让全网验证交易合法性的效果。

Web3.0 时代是个人持有数据的时代,是隐私需求非常高的时代,这个背景下,零知识证明在很多场景下都会非常有用。

结论

这就是对零知识证明的基本介绍了。我们要记住的是,零知识证明是一种密码学方法,示证者要在验证者对信息本身“零知识”的前提下去证明跟信息相关的某个命题是成立的。在 Web3.0 的数据经济时代,个人隐私问题尤其突出,零知识证明会大有用武之地。

参考: