零知识证明定义
零知识证明:zkSNARK,zero-knowledge Succint Non-interactive ARguments of Knowledge 的简称:
零知识证明示例———以数独为例
证明
有一天,小明出了一道非常难的数独题,小红花了很长时间尝试去解开这个数独,但是怎么都解不出结果。小红觉得小明在耍她,“这题压根就无解!小明你耍我!”,她跑到小明那抱怨。“我能证明给你看这题是有解的,而且我知道这个解”,小明淡定的回答道。“好啊”,小红暗自想着,“哼哼,等你证明给我看之后,我就把解记下来然后去戏耍下小刚,给他也做一下这题。”小明接着说:“我会用零知识证明的方法给你证明我会这题的解。也就是说我不会把解给你看,却能让你信服我确实有这题的解。”小红并不相信他能这样做到,还在想象小刚被耍的样子。小明拿出81(9x9)张空白的卡片放在桌上,在每张纸上写上1-9中的一个数字,他让小红转过身闭上眼,然后把这81张卡片小心翼翼地按照解的排列放在桌上,代表谜底的卡片,数字面朝下放在桌上;代表谜面的卡片,则数字面朝上放在桌上。
随机试验
小明放好卡片后,让小红睁开眼转过身。小红很激动,她觉得谜底就要揭晓了,很是开心。她可花了好几天时间都没能解出这题。小明对小红说:“小红,你不能偷看这些面朝下的卡片。”,明显能看出小红很失望,她以为能看到完整的一个解。“但是我能让你检验这些解:你可以随意选择按照行(row),或者按照列(column),或者按照3x3的九宫格(box) 来检验我的解。你挑一种吧” 小红告诉小明她决定选择按照行的方法来验证。小明接着把每一行的9张卡片收起来单独放到一个麻布袋里。所有卡片都被收完放在了9个麻布袋里。小明接着摇了摇每个麻布袋,把里面的卡片顺序都打散。最后把这9个麻布袋交给小红。
验证
“好了,你可以打开这些布袋了。“小明对小红说,“每个布袋里应该都有正好9张,没有重复数字的,分别是数字1-9的卡片。” 小红打开每个布袋一看,还果真是这样。
“可这啥都证明不了啊!我也可以这样做给你看。我只要保证每一行都是1-9这9张卡片,不去管纵列和九宫格里的数字是不是也都是没有重复的不就行了。“小红说道。小明解释说:“可是我事先也不知道你会选按照行来收集卡片,还是按照列,还是按照九宫格啊。我是按照题解来放置卡片的,你选啥我都没在怕的”
重复验证
小红还是不服气。觉得小明仍然有可能在骗她,所以要求小明再把卡片复原,按照原来的方法,重新选。这样接连试了几次,小红每次都选一个不一样的试验方法。试了好多次都是一样的结果。小红这下不得不承认,小明要么运气非常非常好,每次都能押中小红会选择哪种试验方式,要么就是他确实知道题解,(或者小明会读心术能预先知道小红会选什么试验方式)。小红很失望,这么多次试验下来,她还是不知道真正的题解,她只知道每次小明放置卡片的排列里很大几率每行每列每个九宫格确实都是没有重复的1-9,这就说明很大几率这题是有解的,而且小明很大几率确实知道这题的解。
零知识证明的本质就是在不揭晓我所知道或拥有的某样东西的前提下,向别人证明我有很大几率(这点很重要,零知识证明说到底是一个概率上的证明)确实知道或拥有这个东西。
故事里要证明的东西就是一个数独题的解,小明让小红每次随机抽取行,列,九宫格的卡片,并收集在一起随机打乱,小红通过拆开袋子并不能知道题解,但是却能相信小明很大几率确实知道题解。
这个故事里的zk-SNIPM也是半开玩笑地暗指了零知识证明现在最普遍的zk-SNARKs(Zero-Knowledge Succinct Non-Interactive Argument of Knowledge)算法。故事中的zk-SNIPM虽然存在漏洞,但是他还有改进的余地,比如用一台扫描仪把第一次卡片的组合就全扫描下来,然后一次性同时验证所有的试验序列。这样就很难通过试错的方式来破解机器。
小明和小红之间最开始那种互动式的证明方法暗指的是交互式零知识证明(interactive zero-knowledge proof)。交互式零知识证明需要验证方(小红)在证明方(小明)放好答案(commitment)后,不断的发送随机试验。如果验证和证明双方事先串通好,那么他们就可以在不知道真实答案的情况下开挂(simulate/forge a proof)。