百万富翁 & 混淆电路

文献:

  1. Yao A C. Protocols for secure computations[C]//23rd annual symposium on foundations of computer science (sfcs 1982). IEEE, 1982: 160-164.
  2. Yao A C C. How to generate and exchange secrets[C]//27th Annual Symposium on Foundations of Computer Science (sfcs 1986). IEEE, 1986: 162-167.
  3. Lindell Y, Pinkas B. A proof of security of Yao’s protocol for two-party computation[J]. Journal of cryptology, 2009, 22(2): 161-188.

Millionaires’ Problem

百万富翁问题由姚期智先生在1982年提出。

场景:两个百万富翁想要知道谁更富有,然而他们不想让对方知道自己的身家。更一般地,有 m m m个人 P 1 , ⋯   , P m P_1,\cdots,P_m P1,,Pm想要计算一个整数值函数 f ( x 1 , ⋯   , x m ) f(x_1,\cdots,x_m) f(x1,,xm),其中 x i x_i xi都是有界整数,且只有 P i P_i Pi知道 x i x_i xi的值,他们都不想泄露自己的秘密。

姚的百万富翁解决方案

  • 假定Alice财产为 i i i,Bob财产为 j j j,并且有界 1 ≤ i , j ≤ 10 1 \le i,j \le 10 1i,j10。令 E a E_a Ea是Alice的公钥加密算法, D a D_a Da是对应的公钥解密方案。
  • Alice和Bob执行如下方案:
    1. Bob生成 N − b i t N-bit Nbit随机数 x x x,计算 k = E a ( x ) k = E_a(x) k=Ea(x),发送 c = k − j + 1 c = k-j+1 c=kj+1 给Alice
    2. Alice计算一系列解密值: y u = D a ( c + ( u − 1 ) = k − j + u ) ,   u = 1 , ⋯   , 10 y_u = D_a(c+(u-1) = k-j+u),\, u=1,\cdots,10 yu=Da(c+(u1)=kj+u),u=1,,10,易知 y j = D a ( k ) = x y_j = D_a(k) = x yj=Da(k)=x
    3. 然后,Alice生成一个 N / 2 − b i t N/2-bit N/2bit随机素数 p p p,计算: z u = y u m o d    p z_u = y_u \mod p zu=yumodp,保证所有的 z u z_u zu至少有 2 2 2个不同(否则重新生成 p p p
    4. Alice将素数 p p p和序列 [ z 1 , z 2 , ⋯   , z i ] ∥ [ z i + 1 + 1 , z i + 2 + 1 , ⋯   , z 10 + 1 ] [z_1,z_2,\cdots,z_i] \| [z_{i+1}+1,z_{i+2}+1,\cdots,z_{10}+1] [z1,z2,,zi][zi+1+1,zi+2+1,,z10+1] 发送给Bob
    5. Bob检查序列的第 j j j个位置:如果它等于 x m o d    p x \mod p xmodp,那么 j ≤ i j \le i ji;如果它等于 x + 1 m o d    p x+1 \mod p x+1modp,那么 j ≥ i + 1 j \ge i+1 ji+1

安全性

除了知道最终的比较结果,

  1. Alice不知道Bob的秘密 j j j的任何信息:只知道 c = k − j + 1 c=k-j+1 c=kj+1,但 k = E a ( x ) k=E_a(x) k=Ea(x)是随机数(否则Alice就猜对了 x x x),因此 j = 1 , ⋯   , 10 j=1,\cdots,10 j=1,,10等可能出现
  2. Bob不知道Alice的秘密 i i i的任何信息:只知道 y j = x y_j=x yj=x,而其他的 y u = D a ( k − j + u ) y_u=D_a(k-j+u) yu=Da(kj+u)都是随机数(否则Bob就破解了 D a D_a Da),因此无法区分其他的数是 z u z_u zu还是 z u + 1 z_u+1 zu+1

一般的多方安全函数计算协议

m m m方参与者,函数 f ( x 1 , ⋯   , x m ) f(x_1,\cdots,x_m) f(x1,,xm),令 K ⊆ { 1 , ⋯   , m } K \subseteq \{1,\cdots,m\} K{1,,m}是诚实者,令 K ′ = { 1 , ⋯   , m } − K K' = \{1,\cdots,m\} - K K={1,,m}K是作弊者

姚证明了:对于任意的 ϵ , δ , γ > 0 \epsilon,\delta,\gamma > 0 ϵ,δ,γ>0,存在一个协议 A A A可以计算函数 f f f,满足 ( ϵ , δ ) − (\epsilon,\delta)- (ϵ,δ)隐私约束(private constraint),并且对于任意的 K ′ ≠ { 1 , ⋯   , m } K' \neq \{1,\cdots,m\} K={1,,m} K ′ K' K可以成功欺骗(successful cheating)的概率至多为 γ \gamma γ

也就是说,存在一个MPC协议,即使有 m − 1 m-1 m1个人串通,也不会成功诈欺那 1 1 1个诚实者。当然,实际应用中要平衡安全性和计算效率。

Garbled Circuit

姚期智在1986年将百万富翁问题的解决方案扩展到任意的电路,提出了混淆电路(garbled circuit)的概念。但直到2004年才被 Lindell 等人具体地完全描述出来。

设计思路

有一个迷宫包含很多房间,每个房间都有 2 2 2个进入的门和 1 1 1个离开的门,房间之间由走廊进行连接。每个房间中放着 4 4 4个盒子,每个盒子上都有 2 2 2个挂锁,对应着 4 4 4种钥匙,其中 2 2 2种可以来自一个进入的门,另外 2 2 2种钥匙可以来自另一扇进入的门。一个房间中有 2 2 2种不同的钥匙,每种钥匙复制 2 2 2把,在 4 4 4盒子内各存放着 1 1 1把钥匙。这些钥匙可以用于打开后续房间内的盒子上的挂锁。在迷宫终点的那个房间内存放着黄金。所有玩家需要合作开启各个房间中的盒子获得钥匙,以抵达迷宫终点。

开局每 2 2 2个玩家们进入一个房间,各自拥有 1 1 1把私有的钥匙,他们合作可以同时打开其中 1 1 1个盒子上的 2 2 2个挂锁,获得其中的钥匙。而其他的 3 3 3个盒子至多只能解开 1 1 1把挂锁,无法开启盒子。然后,他们经过走廊进入下一个房间,与另一伙人合作,打开此房间中的某一个盒子,获得里面的钥匙。然后继续前进,直到抵达终点房间,打开盒子获得黄金。

构造

考虑一种简单的两方协议。给定一个函数 f ( x , y ) = v ∈ { 0 , 1 } f(x,y)=v \in \{0,1\} f(x,y)=v{0,1},其中 x , y ∈ { 0 , 1 } x,y \in \{0,1\} x,y{0,1}分别是Alice和Bob的私有数据。

Alice根据 f f f构造布尔电路 C C C,然后构造对应的混淆电路 G C GC GC

  1. C C C由若干逻辑门和输入输出线组成。假设 C C C是无环图,将它的逻辑门进行拓扑排序,依次为逻辑门生成混淆电路。
  2. 电路输入线开始,假设逻辑门 g g g有两根门输入线 i , j i,j i,j和一根门输出线 l l l
  3. 输入线 i i i上分配两个随机的标签 k i 0 , k i 1 ∈ { 0 , 1 } n k_i^0,k_i^1 \in \{0,1\}^n ki0,ki1{0,1}n,对应着逻辑值 0 、 1 0、1 01;输入线 j j j和输出线 l l l同理。
  4. 逻辑门 g g g根据其真值表(含 4 4 4个条目),使用每个条目的逻辑输入值对应的标签(比如 k i 0 , k j 1 k_i^0,k_j^1 ki0,kj1),来加密两次其逻辑输出值所对应的标签(比如 k l 1 k_l^1 kl1,那么 E ( k i 0 , E ( k j 1 , k l 1 ) ) E(k_i^0,E(k_j^1,k_l^1)) E(ki0,E(kj1,kl1))),生成混淆真值表
  5. 将“线的标签”以及“门的混淆真值表”按照电路 C C C组合起来,得到混淆电路 G C GC GC,注意来自同一个门的多根线(扇出系数 > 1 >1 >1)的标签是相同的。
  6. 对于电路输出线 o o o,标签 k o 0 k_o^0 ko0对应逻辑值 0 0 0,标签 k o 1 k_o^1 ko1对应逻辑值 1 1 1,当Bob计算完混淆电路得到其中一个标签后,Alice公布这个对应关系。
  7. 注意,其他线的标签与逻辑值的对应关系不应当被公布。否则,Bob将会获得电路内部的中间结果,从而泄露Alice的秘密。

在这里插入图片描述

Alice将上述的 G C GC GC发送给Bob,Bob在混淆电路上做运算:

  1. Alice直接把自己的输入 x x x对应的标签 k i x k_i^x kix发送给Bob,而Bob无法区分这个标签对应的逻辑值是 0 0 0还是 1 1 1
  2. Bob通过不经意传输协议(OT)获得 y y y对应的标签 k j y k_j^y kjy,同时OT协议保证了Alice无法获得 y y y的信息,且Bob无法获得另一个标签 k j 1 − y k_j^{1-y} kj1y的信息。
  3. Bob获得全部的电路输入线的标签后,开始按照逻辑门的拓扑排序,依次尝试解密逻辑门 g g g上的 4 4 4个条目。由于Bob只拥有每根门输入线上的一个标签,因此他至多成功解密其中的一个条目,获得逻辑门输出值对应的标签。
  4. 然后Bob继续解密其他逻辑门的混淆真值表,直到获得电路输出线 o o o上的标签 k o v k_o^v kov,然后Bob公布计算结果。
  5. Alice公布对应关系 { k o 0 : 0 , k o 1 : 1 } \{k_o^0:0,k_o^1:1\} {ko0:0,ko1:1},他们完成了 v = f ( x , y ) v = f(x,y) v=f(x,y)的计算。

区分正确解密的条目

明显的,所有线标签都是随机数,Bob解密尝试逻辑门上的 4 4 4个条目时,难以确定到底哪个条目是被正确解密的。为了区分,Lindell 等人提出了一种特殊的对称加密系统。

( G , E , D ) (G,E,D) (G,E,D)是一个对称加密方案,定义关于密钥 k k k的密文范围
R a n g e n ( k ) : = { E k ( x ) } x ∈ { 0 , 1 } n Range_n(k) := \{E_k(x)\}_{x \in \{0,1\}^n} Rangen(k):={Ek(x)}x{0,1}n
那么,我们定义密码方案的两个特殊性质

  1. 不可捉摸密文范围(elusive range):对于任意的概率多项式时间的敌手 A A A,任意的多项式 p ( ⋅ ) p(\cdot) p(),以及足够大的 n n n,有
    P r k ← G ( 1 n ) [ A ( 1 n ) ∈ R a n g e n ( k ) ] < 1 p ( n ) Pr_{k \leftarrow G(1^n)}[A(1^n) \in Range_n(k)] < \dfrac{1}{p(n)} PrkG(1n)[A(1n)Rangen(k)]<p(n)1

  2. 可有效验证密文范围(efficiently verifiable range):存在一个概率多项式时间的算法 M M M,满足
    M ( 1 n , k , c ) = 1    ⟺    c ∈ R a n g e n ( k ) M(1^n,k,c) = 1 \iff c \in Range_n(k) M(1n,k,c)=1cRangen(k)

对于任意的 c ∉ R a n g e n ( k ) c \not \in Range_n(k) cRangen(k),我们令 D k ( c ) = ⊥ D_k(c) = \perp Dk(c)=⊥

下面,我们给出满足上述性质的对称加密方案:令 f k : { 0 , 1 } n → { 0 , 1 } 2 n f_k: \{0,1\}^n \to \{0,1\}^{2n} fk:{0,1}n{0,1}2n是一个带密钥 k ∈ { 0 , 1 } n k \in \{0,1\}^n k{0,1}n的伪随机函数(PRF),然后我们定义

  • 加密: E k ( x ) = { r , f k ( r ) ⊕ x ∥ 0 n } E_k(x) = \{r,f_k(r) \oplus x\|0^n\} Ek(x)={r,fk(r)x0n}
  • 解密: D k ( { r , s } ) = { f k ( r ) ⊕ s } [ 1 : n ] D_k(\{r,s\}) = \{f_k(r) \oplus s\}[1:n] Dk({r,s})={fk(r)s}[1:n]

容易看出,随机数 f k ( r ) f_k(r) fk(r)遮蔽了 x ∥ 0 n x\|0^n x0n,明文 x x x就隐藏在密文 s s s的前 n − b i t n-bit nbit内。解密函数是正确锝的。可以验证它满足 elusive range,如果存在敌手 A A A,那么就可以区分 f k f_k fk和真随机函数 f r a n d f_{rand} frand(如果 A A A对于使用 f k f_k fk E k E_k Ek给出的 c = { r , s } ∈ R a n g e n ( k ) c=\{r,s\} \in Range_n(k) c={r,s}Rangen(k),因为 f k ( r ) f_k(r) fk(r)的后 n − b i t n-bit nbit P r = 1 ≫ n e g l ( n ) Pr=1 \gg negl(n) Pr=1negl(n)的概率为 s [ n + 1 : 2 n ] s[n+1:2n] s[n+1:2n],那么就和使用 f r a n d f_{rand} frand E E E区分开了)。可以验证它满足 efficiently verifiable range,因为给定 { r , s } \{r,s\} {r,s}容易验证 f k ( r ) [ n + 1 : 2 n ] f_k(r)[n+1:2n] fk(r)[n+1:2n]是否等于 s [ n + 1 : 2 n ] s[n+1:2n] s[n+1:2n],从而确定是否有 c ∈ R a n g e n ( k ) c \in Range_n(k) cRangen(k)

利用上述的对称加密方案,可以容易的区分二重加密( double-encryption)下哪些密文被正确解密。

在这里插入图片描述

Lindell 等人证明:令 G , E , D G,E,D G,E,D是一个针对不均匀敌手的( in the presence of non-uniform adversaries)在选择明文攻击下不可区分密文的(indistinguishable encryptions under chosen plaintext attacks,IND-CPA)对称加密方案,那么它就是在二重加密下安全的(secure under chosen double encryption)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值