参考文献:
这个 idea 来自于 Chaum 描述盲签名的论文。假设Alice和Bob想要公平地分割蛋糕,但是他们都不信任对方,认为对方会给自己割一块大的。为了公平地等分蛋糕,他们执行如下协议:
这样,Alice不得不关注 step 1,尽可能第等分蛋糕。否则,Bob会在 step 2 中拿走更大的一半,那Alice就要哭了!
在计算多个电路时,一个恶意敌手可能会对于不同的电路输入不同的值。因此协议还需要额外约束双方的输入。
P 1 P_1 P1的输入一致性:
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,ivi∥k2,ivi∥⋯∥kρ,ivi
上述方案中的 H H H可以被设计为只需要 XOR Gate,那么利用 Free XOR 技术,仅仅是增加了少量的计算开销。
如果 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。
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[majorityofevaluatedcircuitsincorrect∧allcheckcircuitscorrect]
假设 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。怎么权衡是个开放问题。
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 ρ=λ,重复因子大幅降低。
假设 P 1 , P 2 P_1,P_2 P1,P2双方想要 N N N次计算同一个函数 F F F,他们每次对于不同的输入,计算的电路 C C C是保持不变的。那么他们可以成批地生成混淆电路,然后执行 C&C 技术检查电路的正确性。
也就是说, P 1 P_1 P1针对电路 C C C生成 N ρ + c N \rho + c Nρ+c个混淆版本, P 2 P_2 P2随机校验 c c c个混淆电路,然后对剩下的 N ρ N \rho Nρ个电路随机分入 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)。抵抗恶意敌手的均摊成本变低了!
Nielsen 和 Orlandi 提出了"门级"的 C&C 方案。仿照乐高积木,为了构建一个坚固的玩具,只需要确保每个积木都是牢固的。
与非门 NAND 单独构成完备集。令 ⊙ \odot ⊙表示与非运算:
因此,我们只需构建出与非门即可。
在本范式中,需要一种同态承诺协议(homomorphic commitment):
利用 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=ki0⊕R
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=ki0⊕R 解承诺。注意,永远不要对 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的概率发现它。
焊接过程如下:
当 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=ku0⊕kv0
容易验证,
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=(ku0⊕b⋅R)⊕(ku0⊕kv0)=kv0⊕b⋅R=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
当 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 拥有巨大优势。
上述的 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 π的。