基于 MPC 的零知识证明协议

Posted 山登绝顶我为峰 3(^v^)3

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于 MPC 的零知识证明协议相关的知识,希望对你有一定的参考价值。

参考文献:

  1. Jawurek, M., F. Kerschbaum, and C. Orlandi. 2013. “Zero-knowledge using garbled circuits: how to prove non-algebraic statements efficiently”. In: ACM CCS 13: 20th Conference on Computer and Communications Security. Ed. by A.-R. Sadeghi, V. D. Gligor, and M. Yung. ACM Press. 955–966.
  2. Evans D, Kolesnikov V, Rosulek M. A pragmatic introduction to secure multi-party computation[J]. Foundations and Trends® in Privacy and Security, 2018, 2(2-3): 70-246.
  3. 应用密码学:协议、算法与C源程序(机工社大黑皮)

ZKP

零知识证明协议的基本定义在这篇文章

交互式

最近看到了另一种描述 ZKP 的表述:

  1. Verifier拥有一个困难问题实例 H 1 H_1 H1,Prover声明自己拥有 H 1 H_1 H1的解法 S 1 S_1 S1
  2. Prover利用 1 1 1个随机数 r r r,将这个难题实例 H 1 H_1 H1,转变为另一个同构的难题实例 H 2 H_2 H2。同时,依据 S 1 S_1 S1 r r r,得到对应的解法 S 2 S_2 S2
  3. Prover对解法 S 2 S_2 S2做承诺,然后将难题 H 2 H_2 H2和承诺值 c c c都发送给Verifier
  4. Verifier随机要求Prover给出如下两个声明之一的Proof:
    1. 要求Prover证明两个难题同构, H 1 ≅ H 2 H_1 \\cong H_2 H1H2
    2. 要求Prover公开 S 2 S_2 S2,并证明 S 2 S_2 S2 H 2 H_2 H2的正确解法
  5. Prover给出所要求的Proof,Verifier验证它
  6. 两者反复执行 n n n次 step 1 ~ step 5,直到Verifier相信Prover确实拥有 S 1 S_1 S1(一般而言, n = 10 n=10 n=10就很好了)

完备性:诚实的Prover拥有 S 1 S_1 S1,他总是可以给出 step 4 中所要求的两种Proof,因此Verifier最终会相信他。

可靠性:一个恶意的Prover,他没有 S 1 S_1 S1,为了通过 step 4 的验证,他不得不猜测Verifier的选择。如果猜测Verifier会执行 step 4.1,那么敌手就在 step 2 中选择一个 H 2 ≅ H 1 H_2 \\cong H_1 H2H1,同时他不拥有对应的 S 2 S_2 S2。如果猜测Verifier会执行 step 4.2,那么敌手就在 step 2 中随机生成一个难题 H 2 ′ H_2' H2以及对应的解法 S 2 ′ S_2' S2,但同时他无法证明 H 1 ≅ H 2 ′ H_1 \\cong H_2' H1H2

零知识性:一个恶意的Verifier,他无法让第三方Alice相信上述 Proof 的有效性。假设敌手用一个摄像机记录协议的每一步,即使视频中显示Prover总是给出了正确的 Proof,Alice也总是可以质疑:每当Prover猜对了,Verifier就保留视频;每当Prover猜错了,Verifier就删除视频。人们无法区分真实记录(in the real world)和伪造记录(in the ideal world)!

人们已经证明:

  1. 任何 NP 命题都包含一个 ZKP
  2. 任何数学证明都能转化为一个 ZKP
  3. 能使用交互式证明完成的任何事,也能用交互式 ZKP 完成

非交互式

上述的Alice不相信的原因是,她没有介入 ZKP 的交互。为了Prover为了让任何人相信他的Proof,他需要一个非交互式的ZKP。每当Prover发布Proof后,任何人都可以验证这个Proof是否有效(身份认证协议、签名协议)。

利用 Hash 函数 H H H代替了 Verifier:

  1. Prover声明自己拥有一个困难问题实例 H H H的解法 S S S
  2. Prover利用 n n n个随机数 r i \\r_i\\ ri,将这个难题实例 H H H,转变为随机的 n n n个同构的难题实例 H i \\H_i\\ Hi。同时,依据 S S S r i \\r_i\\ ri,得到对应的解法 S i \\S_i\\ Si
  3. Prover对解法 S i \\S_i\\ Si做承诺,然后将难题 H i \\H_i\\ Hi和承诺值 c i \\c_i\\ ci都公开
  4. Prover计算 b = H ( c i ) b = H(\\c_i\\) b=H(ci),截取前 n n n比特 b = b [ 1 : n ] b=b[1:n] b=b[1:n],然后依据 b [ i ] ∈ 0 , 1 b[i] \\in \\0,1\\ b[i]0,1给出如下两个声明之一的Proof:
    1. b [ i ] = 0 b[i]=0 b[i]=0,Prover证明两个难题同构, H ≅ H i H \\cong H_i HHi
    2. b [ i ] = 1 b[i]=1 b[i]=1,Prover公开 S i S_i Si,并证明 S i S_i Si H i H_i Hi的正确解法
  5. Prover公布 step 4 中的 n n n个Proof,任何人都可以验证它:先根据 c i \\c_i\\ ci计算出 b b b,然后依次检查第 i i i个Proof是否是关于 b [ i ] b[i] b[i]声明的合法证明。

这儿的 H H H扮演了无偏随机比特发生器的角色。如果恶意Prover不拥有 S S S,那么他最多只能给出 step 4 中的某一个Proof,而不能同时都给出Proof,因此为了欺骗,他必须能够预测 H H H的输出。

当然,是Prover(而非Verifier)来挑选的 b b b,因此敌手完全可以随机猜测 b b b的前 n n n位,然后尝试不同的 S i \\S_i\\ Si组合,直到全部猜对 n n n个比特。此时,敌手就可以给出一个合法的 Proof 了。为了抵挡敌手的穷举攻击,我们需要将 n n n设置的比较大,例如 64 , 128 64,128 64,128

JKO(2013)

ZKP 可以作为一种特殊的 malicious secure computation,根据声明 y y y构造电路 C ( ⋅ , y ) C(\\cdot,y) C(,y) C ( x , y ) = 1    ⟺    ( x , y ) ∈ R C(x,y)=1 \\iff (x,y) \\in R C(x,y)=1(x,y)R),其中作为Prover的一方输入证据 x x x,作为Verifier的一方什么也不输入,最后电路结果 C ( x , y ) C(x,y) C(x,y)输出给Prover。

很明显,利用任意的 cut-and-choose-based 2PC protocol,总是可以实现上述的恶意敌手安全的两方计算。但是,直接使用 C&C 技术的 2PC 协议,对应的混淆电路过于巨大。

Jawurek, Kerschbaum 和 Orlandi 观察到:由于 Verifier 没有输入,因此如果让他来生成 GC,那么这个 GC 可以同时用来 checking 和 evaluation:翻转角色,我们让 Verifier 生成一个1. 简介

  • 2. 零知识证明的例子
  • 3. ElGamal加密的零知识证明
  • 4. 身份的零知识证明
  • 1. 简介

    零知识证明(Zero Knowledge Proof)由S.Goldwasser、S.Micali 及 C.Rackoff于1985年在论文《The Knowledge Complexity of Interactive Proof Systems》(交互式证明系统中的知识复杂性)首次提出,是一种用于证明者在不泄露任何其他信息的情况下证明其掌握知识正确性的密码学协议。

    该协议的一方称为证明者(Prover),用 P P P表示;另一方称为验证者(Verifier),用 V V V表示。零知识证明指 P P P试图使 V V V相信某个论断是正确的,但却不向 V V V泄露任何有用的信息,即 P P P在论证的过程中 V V V得不到任何有用的信息。零知识证明除了证明证明者论断的正确性外不泄露任何其他信息或知识。

    零知识证明一般包含以下阶段:

    • 承诺(Commit):证明者针对命题做出承诺,该承诺等待验证者提出挑战并进行验证。

    • 挑战(Challenge):验证者选择随机数(即上述例子中的行、列或格)对提出的承诺进行挑战。

    • 回应挑战(Response):证明者将收到的随机数结合给出的承诺(承诺不可修改),返回挑战的回应。

    • 验证(Verify):验证者验证挑战的回应是否正确,如果错误,则证明失败。

    证明者与验证者重复执行以上步骤,直到可以相信的概率达到验证者接受的条件,证明成功。

    零知识证明具有以下特点:

    • 完备性(Completeness):如果证明者和验证者都是诚实的,并遵守证明过程的每一步进行正确的计算,则该证明一定会成功,验证者也一定能够接受证明者;
    • 合理性(Soundness):没有人能够假冒证明者,从而使这个证明成功;
    • 零知识性(Zero-Knowledge):证明过程执行完后,验证者只会得悉"证明者拥有这项知识",而没有获得关于这项知识本身的任何信息。

    零知识证明与比特承诺都要求协议参与者对某种知识或某个声明做出证明或承诺,但不泄露该知识或承诺的任何信息。不同的是比特承诺需要在打开阶段揭示承诺,但零知识证明在证明过程结束后仍不会泄露掌握的知识。比特承诺一般用于在电子拍卖或电子投票中参与者对自己的投票或选票做出承诺;而在协议执行过程中,为了抵抗恶意参与者或主动攻击者,需要协议参与者通过零知识证明来证明自己所作操作都是按照协议正确执行的。

    2. 零知识证明的例子

    2.1 向红绿色盲证明红球、绿球

    有两颗形状、大小完全一样的球:一颗红球、一颗绿球, X X X是红绿色盲, Y Y Y能够向 X X X证明这两颗球是一红一绿吗?

    • X X X左手拿着红球,右手拿着绿球,并在背后不让 Y Y Y看到,进行交换(或者不交换)两只球
    • Y Y Y能够根据颜色精准判断 X X X是否进行了交换
    • 执行上述操作 N N N次后,即能在 X X X是色盲的情况下, Y Y Y仍能够向 X X X证明能这两颗球是一红一绿

    2.2 数独的零知识证明

    数独(Sudoku)规则如下:

    9 × 9 9\\times 9 9×9方格,其中已经填入部分数字,要求玩家在空白方格中填入数字 1 − 9 1-9 19,使得完成后的每行、每列及 9 9 9 3 × 3 3\\times3 3×3方格都包含数字 1 − 9 1-9 19且每个数字只出现一次


    假设 P P P给出一道数独题目,由 V V V来完成,但 V V V过了很久都未能解出,他怀疑该数独题目没有解,要求 P P P证明该题目有解。因此 P P P希望在不告诉 V V V答案相关的任何信息的情况下证明这道题有解且自己知道这个解。

    P P P V V V执行以下操作:

    (1)承诺

    P P P将答案的每个数字写在纸片上,并按照答案摆放(正面朝下),题目中已有的数字正面朝上,这81个纸片的放置为 P P P的“承诺”。

    (2)挑战

    V V V不能直接将纸片翻转查看数字,但是 V V V可以在行、列、格中任意指定一种验证方式。如图所示, V V V选择按照行的方式进行挑战。

    (3)挑战回应

    P P P按照 V V V选择行验证方式将桌面上每行的 9 9 9张卡片装入一个袋子里,并且将纸片进行混淆后,把袋子交给 V V V,作为挑战的回应。

    (4)验证

    V V V打开纸袋可验证每个纸袋里的 9 9 9张纸片刚好为 1 − 9 1-9 19,即 P P P在承诺阶段做出的承诺满足“每行 1 − 9 1-9 19都出现且只出现一次”的要求,同时在一定程度上说明 P P P做出的承诺很可能是一个合法的解(因为随意给出的数字不会满足这一要求,并且在承诺的时候并不知道 V V V会选择行、列、格哪种验证方式)。

    由于存在 1 / 3 1/3 1/3的概率 P P P事先猜对 V V V选择行验证,然后给出的承诺仅满足行要求,不满足列要求和格要求。或者 P P P拥有满足两项要求,但是不满足第三项要求的错误答案,此时猜对的概率为 2 / 3 2/3 2/3

    P P P为了向 V V V证明自己知道该数独的解,会和 V V V重复该方案的承诺、挑战、回应挑战和验证,允许 V V V在挑战阶段任意选择验证方式,如果出现任何一次验证错误则表示证明失败。

    假设进行的 n n n次过程都验证成功,那么 P P P在不知道数独答案的条件下单次验证成功的概率最大为 2 / 3 2/3 2/3(考虑 P P P 满足两项要求,但是不满足第三项要求的错误答案),所有验证都成功的概率为 ( 2 3 ) n (\\frac23)^n (32)n随着 n n n的增大,这一概率趋近于 0 0 0,而 P P P拥有正确答案的概率趋近于 1 1 1,表明 V V V 可以以大概率相信 P P P 拥有正确答案。

    2.3 三染色问题的零知识证明

    地图三染色问题:如何用三种颜色染色一个地图,保证任意两个相邻的地区都是不同的颜色。

    该问题可转变成连通图的顶点三染色问题,即不同城市(节点)之间修建了一些道路(边),是否存在一种染色方式,使得每个城市都用特定的三种颜色之一表示,并且任意有道路相连的两个城市都不是相同颜色。

    如图所示,证明者Alice拥有一个特地地图三染色的方案,希望在不泄漏任何信息的条件下向Bob证明自己拥有该方案。


    (1)承诺

    Alice将染色方案进行置换(蓝色->绿色,绿色->橙色,橙色->蓝色),然后将每个节点装入一个信封里,放在桌子上出示给Bob。


    (2)挑战

    Bob可以选择任意一条连边,要求Alice打开相邻两个节点的信封进行验证。


    (3)回应挑战

    Alice打开Bob指定的两个节点,作为对挑战的回应。

    (4)验证

    Bob验证结果:两节点颜色不同

    重复以上过程

    当重复交互很多次之后,Bob 得到了大量的信息,但没有得到关于染色方案的任何知识,却能够相信Alice拥有该方案。

    2.4 Quisquater-Guillou 零知识协议

    1990年,LouisC.Guillou 和 Jean-Jacques Quisquater 提出一种形象的基本零知证明协议的例子,该图表示一个迷宫, C C C D D D之间有一道门,需知道秘密咒语才能打开。现在,证明者 P P P希望向验证者 V V V证明他拥有这道门的秘密语,但是 P P P不愿意向 V V V泄露该咒语。 P P P采用“分割与选择”(Cut-and-Choose)技术实现这一零知识协议。

    • (1)验证者 V V V开始停留在位置 A A A
    • (2)证明者 P P P一直走到迷宫的深处,随机选择到位置 C C C或位置 D D D
    • (3) V V V看不到 P P P后,走到位置 B B B,然后命令 P P P从某个出口返回 B B B;
    • (4) P P P服从 V V V的命令,要么原路返回至位置 B B B,要么使用秘密咒语打开门后到达位置 B B B

    上述协议中,若 P P P不知道秘密咒语,就只能原路返回,而 P P P第一次猜对 V V V要求他一条路径的概率为 0.5 0.5 0.5,第一轮协议 P P P能够欺骗 V V V的概率为 0.5 0.5 0.5

    P P P V V V重复上述步骤 n n n次, P P P成功欺骗 V V V的概率为 1 / 2 n 1/2^n 1/2n。假定 n = 20 n=20 n=20,则 P P P成功欺骗 V V V的概率为 1 / 104857 1/104857 1/104857,如果 P P P能够 20 20 20 次按 V V V的要求返回, V V V即证明 P P P确实知道秘密咒语。同时, V V V无法从上证明过程中获取任何关于 P P P的秘密咒语的信息。

    3. ElGamal加密的零知识证明

    3.1 ElGamal加密的已知明文证明

    对于 ElGamal加密方案的密文 E ( M ) = ( α , β ) = ( g r , y r M ) E(M)=(\\alpha, \\beta)=\\left(g^r, y^r M\\right) E(M)=(α,β)=(gr,yrM) , 如果一个参与者知道了 r r r, 则可非常方便地利用零知识证明来证明自己知道密文 ( α , β ) (\\alpha, \\beta) (α,β) 所对应的明文 M , 这就是已知明文证明。

    Schonorr提出参与者能够使用零知识证明的方法俩证明他知道一个 r r r 使得 α = g r \\alpha=g^r α=gr 成立, 方法如下: