零知识证明简介
零知识证明(Zero-Knowledge Proof)是现代密码学核心之一,由S.Goldwasser、S.Micali及C.Rackoff在20世纪80年代初提出,其中,S.Goldwasser和S.Micali在2012年荣获图灵奖。在零知识证明提出的初期,由于缺乏应用场景,仅仅停留在理论层面。近年来,随着区块链的蓬勃发展,零知识证明才在实践层面上有了用武之地。
零知识证明的本质就是在不透露一个论断的任何信息的情况下,向别人证明这个论断是正确的。零知识证明具有三条性质:
- 完备性。如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。
- 合理性。没有人能够假冒证明方,使这个证明成功。
- 零知识性。证明过程执行完之后,验证方只获得了“证明方拥有这个知识”这条信息,而没有获得关于这个知识本身的任何一点信息。
理论上的零知识证明协议具有不同的特点。有的零知识证明协议是专职的,只能证明某些特定的问题,比如,图同构问题。有些零知识证明协议是全能的,只要你能用代码定义的问题,它都能证明(只是理论可行,不意味着有运行效率)。有些协议是交互式的,需要证明者和验证者来回发很多轮消息;有些是非交互式的,证明者只需要根据协议向验证者发一次消息。有的协议证明大小与问题规模相关,问题越复杂,证明越长。而有些协议下,无论问题多复杂,证明大小都一样。
一个例子
三色图问题就是找到一种上色方案使得相邻两个节点的颜色不同(图2-(1)中以连线表示两个节点相邻)。三色图是一个NP问题,这意味着求解过程十分复杂。因此,当小明应小红的委托艰难地找出一个三色图问题的答案时,小明没拿到酬劳是绝不愿意向小红出示答案的。那小明(证明者)如何向小红(验证者)证明他知道答案呢?
步骤如下:
- 小明把问题图中已经正确上色的节点都遮起来,见图2-(2);
- 小红从中任意选相邻的两个节点,小明便向其展示这两个节点的颜色,见图2-(3)。如果这两个节点的颜色不同,那么小红便有50%的把握相信小明确实知道答案;
- 接着,小明随机选择一种颜色映射方案将目前图中的颜色变换成另一种颜色,例如“紫色->白色,橙色->黄色,绿色->黑色”,这样便生成了一张新的着色图。虽然颜色不同,但仍是原问题的有效解;
- 重复第1-3步N次,如果每次展示的两个节点颜色都不相同,那么小明知道答案的可靠性便是1-(0.5)^N。
零知识证明应用
零知识证明的应用非常广泛,下面是部分常见的应用场景。
- 区块链:在传统的区块链架构中,同样的计算被重复多次,比如签名的校验、交易合法性校验、智能合约的执行等等,这些计算过程都可以被零知识证明技术进行压缩。
- 隐私保护:我们经常会填一些涉及个人信息的表格,向别人暴露了隐私,给我们的生活造成了困扰。通过零知识证明,我们只需要向对方提供我们部分信息,最大程度保护个人隐私。比如在买保险的时候,向保险公司证明我没有心脏病,但是不需要向保险公司提供完整的病历。
- 端到端的通讯加密:用户之间可以互相发消息,但是不用担心服务器拿到所有的消息记录,同时消息也可以按照服务器的要求,出示相应的零知识证明,比如消息的来源、与发送的目的地。
- 身份认证:用户可以向网站证明,他拥有私钥,或者知道某个只有用户自己才知道的秘密答案,网站并不需要知道具体内容,但是网站可以通过零知识证明来验证这个私钥或者答案,从而确认用户的身份。
参考资料:
零知识证明学习资源汇总
读懂区块链之零知识证明(zk-SNARK)
零知识证明的江湖
一个数独引发的惨案:零知识证明(Zero-Knowledge Proof)