Malicious Secure MPC: C&C、Lego、ZKP

参考文献:

  1. Chaum, D. 1983. “Blind Signature System”. In: Advances in Cryptology – CRYPTO’83. Ed. by D. Chaum. Plenum Press, New York, USA. 153.
  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. Nielsen, J. B. and C. Orlandi. 2009. “LEGO for Two-Party Secure Computation”. In: TCC 2009: 6th Theory of Cryptography Conference. Ed. by O. Reingold. Vol. 5444. Lecture Notes in Computer Science. Springer, Heidelberg. 368–386.

文章目录

  • C&C
    • cut-and-choose technique
    • Input consistency
    • Output
  • Batched C&C
  • LEGO Paradigm
    • Gate-level C&C
    • Soldering
  • GMW Compiler

C&C

这个 idea 来自于 Chaum 描述盲签名的论文。假设Alice和Bob想要公平地分割蛋糕,但是他们都不信任对方,认为对方会给自己割一块大的。为了公平地等分蛋糕,他们执行如下协议:

  1. Alice将蛋糕切成两半
  2. Bob选择自己的一半蛋糕
  3. Alice拿走剩下的一半蛋糕

这样,Alice不得不关注 step 1,尽可能第等分蛋糕。否则,Bob会在 step 2 中拿走更大的一半,那Alice就要哭了!

cut-and-choose technique

  1. P 1 P_1 P1针对给定电路 C C C,随机生成一系列混淆电路 { G C i } i ∈ I \{GC_i\}_{i \in I} {GCi}iI重复因子(replication factor)为 ∣ I ∣ = ρ |I|=\rho I=ρ
  2. P 2 P_2 P2随机选择其中的一部分电路 J ⊂ I J \subset I JI,让 P 1 P_1 P1打开(open)它们。就是发送所有的线标签、门标签;或者说,发送生成此电路的随机性(randomness)。
  3. P 2 P2 P2检查这些电路,确认它们都是电路 C C C的正确混淆版本。
  4. P 2 P2 P2相信剩余的电路 I − J I - J IJ很可能是正确的,计算剩余的混淆电路

Input consistency

在计算多个电路时,一个恶意敌手可能会对于不同的电路输入不同的值。因此协议还需要额外约束双方的输入。

P 1 P_1 P1的输入一致性

  1. P 1 P_1 P1构建电路 C ( x , y ) C(x,y) C(x,y)的一系列混淆电路,对于自己的每个混淆输入(就是每个电路的一个线标签)做承诺,发送给 P 2 P_2 P2
  2. 接收到承诺后, P 2 P_2 P2随机挑选一个 2 − 2- 2universal hash function H H H ∀ z ≠ z ′ ,   P r [ H ( z ) = H ( z ′ ) ] = 1 / 2 l \forall z \neq z',\, Pr[H(z)=H(z')]=1/2^l z=z,Pr[H(z)=H(z)]=1/2l),发送给 P 1 P_1 P1(在得到 H H H之前, P 1 P_1 P1的输入就已经被固定了)
  3. P 1 P_1 P1根据电路 H ( x , r ) H(x,r) H(x,r),构建一系列的混淆电路(这里的 r r r P 1 P_1 P1随机选择的,用于隐藏 H ( x , r ) H(x,r) H(x,r)中包含的 x x x的信息)
  4. P 2 P_2 P2拿到电路 ( C ( x , y ) , H ( x , r ) ) (C(x,y),H(x,r)) (C(x,y),H(x,r))的若干混淆版本,利用 C&C 技术确定混淆电路的正确性。
  5. P 1 P_1 P1发送他的混淆输入, P 2 P_2 P2检查是否符合承诺。然后 P 2 P_2 P2计算剩余电路,检查它们的 H ( x , r ) H(x,r) H(x,r)是否一致。由于 H H H是随机选的,因此 P 1 P_1 P1难以找到一个 r r r,使得对于不同电路的不同输入 x x x出现碰撞。

P 2 P_2 P2的输入一致性:这个很简单就可以实现,因为 P 2 P_2 P2是利用OT协议获得对应标签的。对于电路 C C C的每一个输入比特,仅通过单个恶意敌手安全的OT协议,传输全部混淆电路 G C i GC_i GCi的对应标签 k 1 , i v i ∥ k 2 , i v i ∥ ⋯ ∥ k ρ , i v i k_{1,i}^{v_i} \| k_{2,i}^{v_i} \| \cdots \| k_{\rho,i}^{v_i} k1,ivik2,ivikρ,ivi

上述方案中的 H H H可以被设计为只需要 XOR Gate,那么利用 Free XOR 技术,仅仅是增加了少量的计算开销。

Output

如果 P 2 P_2 P2计算发现对于不同的混淆电路,输出结果不一致,此时应该 abort 么?不可以!考虑 P 1 P_1 P1设计的错误混淆电路当仅当 P 2 P_2 P2输入为 1 1 1是才会表现出错误;那么一旦 P 2 P_2 P2 abort,那么 P 1 P_1 P1就知道了 P 2 P_2 P2的输入是 1 1 1,这就是Selective abort attack

  1. majority

    P 2 P_2 P2计算所有的剩余电路后,使用少数服从多数的方案作为电路的最终输出。敌手的成功概率为
    P r [ m a j o r i t y    o f    e v a l u a t e d    c i r c u i t s    i n c o r r e c t    ∧    a l l    c h e c k    c i r c u i t s    c o r r e c t ] Pr[majority\,\,of\,\,evaluated\,\,circuits\,\,incorrect\,\,\wedge\,\,all\,\,check\,\,circuits\,\,correct] Pr[majorityofevaluatedcircuitsincorrectallcheckcircuitscorrect]

    Malicious Secure MPC: C&C、Lego、ZKP_第1张图片

    假设 check 和 eval 的开销相等,那么经过最优化可以计算出,为了使得敌手的成功概率不高于 2 − λ 2^{-\lambda} 2λ最佳重复因子为 ρ ≈ 3.12 λ \rho \approx 3.12 \lambda ρ3.12λ最佳检验数量为 c = 0.6 ρ c = 0.6 \rho c=0.6ρ。统计安全参数选取为 λ = 40 \lambda=40 λ=40,那么就需要重复构建上百个混淆电路。

    不过一般而言,eval 的计算开销一般是 check 的计算开销的 25 % − 50 % 25\%-50\% 25%50%。但同时,利用 seed 和 hash 可以让 check 的通信开销几乎为 0 0 0。怎么权衡是个开放问题。

  2. Input Recovery Technique

    P 2 P_2 P2计算所有的剩余电路后,如果发现了不一致的输出比特(在 P 1 P1 P1诚实时,这不会发生),那么就把对应的这些输出线标签作为“proof of cheating”。然而, P 2 P_2 P2不应当披露他是否捕获了这种证明,否则依然是 Selective abort。

    双方应当继续执行一个恶意敌手安全的 input recovery function:如果 P 2 P_2 P2提供了“proof of cheating”,那么这个函数“惩罚” P 1 P_1 P1,将明文 x x x发送给 P 2 P_2 P2,这样 P 2 P_2 P2就可以自行计算 C ( x , y ) C(x,y) C(x,y)了;否则, P 2 P_2 P2不应当学习到任何有关 x x x的信息。

    Emmmm,怎么感觉 input recovery function 本就是个 malicious-secure MPC( ̄へ ̄)

    此时,敌手成功的唯一可能就是: P 2 P_2 P2检查的 c c c个电路都是好的,同时 P 2 P_2 P2计算的 ρ − c \rho-c ρc个电路都是坏的。因此,只需要选取 ρ = λ \rho = \lambda ρ=λ,重复因子大幅降低。

Batched C&C

假设 P 1 , P 2 P_1,P_2 P1,P2双方想要 N N N次计算同一个函数 F F F,他们每次对于不同的输入,计算的电路 C C C是保持不变的。那么他们可以成批地生成混淆电路,然后执行 C&C 技术检查电路的正确性。

Malicious Secure MPC: C&C、Lego、ZKP_第2张图片

也就是说, P 1 P_1 P1针对电路 C C C生成 N ρ + c N \rho + c +c个混淆版本, P 2 P_2 P2随机校验 c c c个混淆电路,然后对剩下的 N ρ N \rho 个电路随机分入 N N N个桶。每个桶有 ρ \rho ρ个电路,它们被用来计算同一组输入下的函数值。

经计算,为了达到 2 − λ 2^{-\lambda} 2λ的安全性,只需选取 ρ = 2 + Θ ( λ / log ⁡ N ) \rho = 2 + \Theta(\lambda/\log N) ρ=2+Θ(λ/logN),随着 N N N的增大 ρ \rho ρ会逐渐降低(远低于 λ = 40 \lambda=40 λ=40,比如 N = 1024 , ρ = 5 N=1024,\rho=5 N=1024,ρ=5)。抵抗恶意敌手的均摊成本变低了!

LEGO Paradigm

Nielsen 和 Orlandi 提出了"门级"的 C&C 方案。仿照乐高积木,为了构建一个坚固的玩具,只需要确保每个积木都是牢固的。

与非门 NAND 单独构成完备集。令 ⊙ \odot 表示与非运算:

  1. p ∧ q = ( p ⊙ q ) ⊙ ( p ⊙ q ) p \wedge q = (p \odot q) \odot (p \odot q) pq=(pq)(pq)
  2. p ∨ q = ( p ⊙ p ) ⊙ ( q ⊙ q ) p \vee q = (p \odot p) \odot (q \odot q) pq=(pp)(qq)
  3. ¬ p = p ⊙ 1 \neg p = p \odot 1 ¬p=p1

因此,我们只需构建出与非门即可。

Gate-level C&C

  1. P 1 P_1 P1构建 NAND Gate 大量的独立随机混淆门,共 N ρ + c N \rho + c +c。然后 P 2 P_2 P2利用 batch C&C 技术,随机检查 c c c个 NAND Gate,将剩余的与非门分桶, N N N个桶,每个桶 ρ \rho ρ个。
  2. P 1 , P 2 P_1,P_2 P1,P2执行焊接(soldering)过程,构造混淆电路:
    1. 双方协作,将单个桶里的 ρ \rho ρ个 NAND Gate 并联(每 2 2 2个门的对应输入引脚的 2 2 2个标签要对齐),组成一个容错与非门(fault-tolerant garbled NAND gate)。少数服从多数,只要大多数与非门的输出正确,那么容错与非门的输出正确。
    2. 根据电路 C C C把各个容错与非门连接成单个混淆电路,要将输出线上的混淆值传递到下一个门的输入线上。
  3. P 2 P_2 P2计算这个混淆电路,它的表现与行为以压倒性概率(with overwhelming probability)和正确电路一致。

Soldering

在本范式中,需要一种同态承诺协议(homomorphic commitment):

  1. commit: P 1 P_1 P1对数值 A A A做承诺 c A c_A cA,对数值 B B B做承诺 c B c_B cB,发送 c A , c B c_A,c_B cA,cB P 2 P_2 P2
  2. decommit: P 1 P_1 P1发送 A A A P 2 P_2 P2 P 2 P_2 P2检查 c A c_A cA是否是关于 A A A的承诺
  3. homomorphic decommit: P 1 P_1 P1发送 A ⊕ B A \oplus B AB P 2 P_2 P2 P 2 P_2 P2检查 ( c A , c B ) (c_A,c_B) (cA,cB)是否是关于 A ⊕ B A \oplus B AB的承诺

利用 Free XOR 技术, P 1 P_1 P1随机选取全局偏移值(offset value) R R R,然后对于各个 NAND Gate 的每根线 i i i,随机生成线标签 k i 0 k_i^0 ki0(不必考虑 C C C的连接关系,后边有焊接),再令 k i 1 = k i 0 ⊕ R k_i^1 = k_i^0 \oplus R ki1=ki0R

P 1 P_1 P1发送这些混淆门,同时要对 ∀ i , k i 0 \forall i,k_i^0 i,ki0 R R R承诺。根据同态性, P 1 P_1 P1可以对另一个标签 k i 1 = k i 0 ⊕ R k_i^1 = k_i^0 \oplus R ki1=ki0R 解承诺。注意,永远不要对 R R R解承诺,否则将泄漏 R R R并威胁所有的混淆门!

P 2 P_2 P2要求检查某个混淆门 g g g P 1 P_1 P1不应该同时打开线 i i i上的两个标签,这样也会泄露 R R R。可以让 P 2 P_2 P2随机选择逻辑门的四个状态的其中一个 P 1 P_1 P1只打开这个条目对应的 2 2 2个输入比特和 1 1 1个输出比特的那 3 3 3个标签。 P 2 P_2 P2检查这个条目的正确性,对于错误的门有 1 / 4 1/4 1/4的概率发现它。

焊接过程如下:

  1. P 2 P_2 P2要求连接一个桶里的两个混淆门 g 1 , g 2 g_1,g_2 g1,g2,记它们的左(右)引脚分别为 u , v u,v u,v,那么 k u 0 , k v 0 k_u^0,k_v^0 ku0,kv0应当被连接,且 k u 1 , k v 1 k_u^1,k_v^1 ku1,kv1应当被连接。 P 1 P_1 P1计算焊接值(solder value):
    σ u , v = k u 0 ⊕ k v 0 \sigma_{u,v} = k_u^0 \oplus k_v^0 σu,v=ku0kv0
    容易验证,
    k u b ⊕ σ u , v = ( k u 0 ⊕ b ⋅ R ) ⊕ ( k u 0 ⊕ k v 0 ) = k v 0 ⊕ b ⋅ R = k v b k_u^b \oplus \sigma_{u,v} = (k_u^0 \oplus b \cdot R) \oplus (k_u^0 \oplus k_v^0) = k_v^0 \oplus b \cdot R = k_v^b kubσu,v=(ku0bR)(ku0kv0)=kv0bR=kvb
    于是 P 2 P_2 P2可以在不知道 b b b的情况下,将逻辑值 b b b u u u转移 v v v上!

    P 2 P_2 P2选择桶里的某个门 g 1 g_1 g1作为锚点(anchor),它有三根线 i , j , l i,j,l i,j,l。对于其他的 ρ − 1 \rho-1 ρ1个门,有对应的左右输入线和输出线,向 P 1 P_1 P1索要它们与 g 1 g_1 g1的焊接值,将 ρ \rho ρ根左输入线、 ρ \rho ρ根右输入线、 ρ \rho ρ根输出线分别连接在一起。叠罗汉 ρ \rho ρ个与非门组成了一个容错与非门 G G G

    每当有逻辑值 b b b进入锚点 g 1 g_1 g1的输入线,那么就把它转移到所有的 ρ \rho ρ个门的对应输入线上。并行计算后, ρ \rho ρ个门的输出逻辑值 v v v都传递到锚点 g 1 g_1 g1的输出标签 k l v k_l^v klv上。如果出现不一致(既有 k l 0 k_l^0 kl0又有 k l 1 k_l^1 kl1),那么就按照少数服从多数原则,输出唯一的标签 k l v k_l^v klv

  2. P 2 P_2 P2要求连接两个容错混淆门 G 1 , G 2 G_1,G_2 G1,G2,比如 G 1 G_1 G1的输出线到 G 2 G_2 G2的左(右)输入线。令 G 1 G_1 G1的锚点的输出线为 u u u,令 G 2 G_2 G2的锚点的输入线为 v v v,那么 P 1 P_1 P1只需计算锚点之间的焊接值 σ u , v \sigma_{u,v} σu,v,而其他混淆门 g g g之间不必再焊接(它们已经都焊接到了锚点上)。

    每当 G 1 G_1 G1输出一个混淆值 k u b k_u^b kub,那么就计算 k v b = k u b ⊕ σ u , v k_v^b = k_u^b \oplus \sigma_{u,v} kvb=kubσu,v,这就把逻辑值 b b b传递到了 G 2 G_2 G2上。然后就可以执行 G 2 G_2 G2内部的逻辑运算了。

在 LEGO 范式中,假设电路 C C C包含 N N N个逻辑门,那么重复因子为
ρ = O ( 1 ) + O ( λ / log ⁡ N ) \rho = O(1) + O(\lambda/\log N) ρ=O(1)+O(λ/logN)
相较于电路级的 C&C ρ = λ \rho = \lambda ρ=λ(Input Recovery Technique),门级的 C&C 有了重大改进。虽然焊接过程有一些额外花费,但对于大型电路 LEGO 拥有巨大优势。

GMW Compiler

上述的 C&C 技术只能对 2MP 的 Yao’s GC 起作用。那么其他的MPC呢?

对于任意的半诚实敌手下安全(secure against semi-honest adversaries)的MPC协议,利用零知识证明(Zero-Knowledge Proofs),都可以转化为恶意敌手下安全的MPC协议。

π \pi π是半诚实安全的MPC协议,有 N N N个参与者。每当参与者 P i P_i Pi给出一个计算结果,那么就要利用 ZKP 给出一个proof,证明计算结果是诚实地遵循协议 π \pi π的。

  1. 如果每个 P i P_i Pi在每次计算时都给出了合法的proof,那么协议 π \pi π就是在半诚实环境下执行的,自然就是安全的。
  2. 如果任意的 P i P_i Pi在某次计算后无法给出合法的proof,那么诚实参与者们就 abort。在 P i P_i Pi这次计算之前都是半诚实环境,只有敌手 P i P_i Pi的这次本地计算是恶意的,而诚实参与者及时终止了计算,因此也不会泄露自己的秘密。

Malicious Secure MPC: C&C、Lego、ZKP_第3张图片

你可能感兴趣的:(#,安全多方计算,信息安全,数学,计算机,人工智能)