3.1 抛砖引玉:初识零知识证明
3.1.1 为什么会有零知识证明?
前面已经学习过,在使用私钥/公钥体系时,永远不应该暴露私钥,因为任何获得私钥的第三方都能够解密其获得的每一条加密消息。下面来考虑一种情况:
常规密码在大部分数据库中都存储为哈希(Hash),而不是明文。这里哈希指一个函数,会把一个输入转换成另一个唯一的字符串数据,从而掩饰或隐藏原始数据。
在哈希函数中,实际上几乎不可能从哈希函数创建的惟一字符串反推出原始数据。例如,系统可以使用keccak256哈希算法,将密码“HappyLearningZKP”哈希为0x8d73 022c3e12c1c41d5bdbeb0bac5574b814301c5353fc72b135a09ccc764f0f。
看看这种字母和数字的组合,即使知道哈希算法并使用强大的算力,也无法倒推出原始密码“HappyLearningZKP”。重要的是,哈希函数在定义上是决定性的,这意味着相同的输入总是会得到相同的输出。因此,如果一个网站将我们的密码存储为0x8d7 3022c3e12c1c41d5bdbeb0bac5574b814301c5353fc72b135a09ccc764f0f,那么当我们输入“HappyLearningZKP”时,该网站可以通过对其哈希,并与存储在数据库中的哈希值进行比较,来检查我们是否输入了正确的密码。
在上面的情景中,请注意:虽然网站不会存储我们的明文密码,但我们仍然需要通过一个安全通道与网站共享密码,这样才能证明你知道你的正确密码。
如果可以向网站证明我们知道正确的密码,而又不必向它共享或透露该密码,那不是更好吗?或者再进一步:证明以前的那个你就是现在你说的这个你?
总体来说,这种方法代表了当今大多数行业验证信息的方式——需要提供信息来验证它,需要重新执行计算来验证它是否完整地正确执行。比如,如果银行想批准一笔从我们的账户到另一账户的电子汇款,银行必须在转账前检查你的账户,来确认你的账户中有足够的钱,以此证明我们不是在花费你实际不拥有的钱。同样,如果你想证明自己的身份,你必须提供你的社会安全号码或政府签发的其他身份证明。
而在另一些情况下,不需要知道知识的细节就可以检查结果。例如,供应商甲的出价是否高于供应商乙?供应商乙不应该看到供应商甲的出价,同样,很可能双方都不想向客户以外的第三方披露自己的出价。这时,通过零知识证明的方式,监管或审计机构可以得知,供应商甲的出价低于供应商乙。
这就是零知识证明:一方(证明者)能够向另一方(验证者)证明,自己拥有某一条特定的信息,而又无须披露该信息是什么。