Skip to content

安全多方计算复 ​

1. 安全两方计算背景 ​

百万富翁问题 ​

问题描述:两个百万富翁Alice和Bob想知道谁更富有,但又不愿意让对方知道自己拥有的真正财富。如何在没有第三方的情况下,让对方知道谁更有钱?

解决方案:假设Alice有xa,Bob有xb,他们要共同计算函数f(xa,xb),在计算函数f后,他们能知道谁更富有。

函数定义:

f(xa,xb)={1if xa≥xb0if xa<xb

基本思想:安全两方计算(Secure two-party computation)是安全多方计算的一个子问题,目标是创建一个通用协议,该协议允许在保护双方输入值的前提下,两方共同计算一个任意函数。

历史背景:姚期智先生最早提出了基于混淆电路的两方安全计算通用协议,可以实现对任意类型布尔门电路的安全计算。

2. 姚氏混淆电路 ​

基本原理 ​

假设需要计算函数 g(x,y),其中 g代表布尔电路的单个门,且它的输入为x,y∈{0,1} 。

对每个输入x,y,可以分为两种情况,即:

  • x:(x1,x2),分别对应于值取0和1
  • y:(y1,y2),分别对应于值取0和1

在姚氏混淆电路中,参与双方需分别负责构造混淆电路和计算混淆电路。假设参与者分别是Alice和Bob,并且Alice负责构造混淆电路,Bob负责计算混淆电路。

混淆表构造 ​

Alice对 x,y产生两个对称密钥,即x1,x2,y1,y2 分别对应 kx1,kx2,ky1,ky2。然后Alice构造混淆表:

kxikyjEkxi(Ekyj(g(xi,yj)))
kx1ky1Ekx1(Eky1(g(x1,y1)))
kx1ky2Ekx1(Eky2(g(x1,y2)))
kx2ky1Ekx2(Eky1(g(x2,y1)))
kx2ky2Ekx2(Eky2(g(x2,y2)))
  • Alice有 x1,则她将打乱顺序的混淆表和 kx1 发给Bob。
  • 假设Bob有y2,Bob和Alice运行OT 21协议,可以得到y2 对应的 ky2,然后使用kx1 和 ky2 可以解密 Ekx1(Eky2(f(x1,y2))) 得到g(x1,y2)并将其发送给Alice。

与门电路示例 ​

问题:Alice和Bob分别有x和 y,两方想在不泄露自己的输入的情况下准确计算 x∧y。

密钥设置:

  • x 对应的密钥为 (kx0,kx1)-y 对应的密钥为 (ky0,ky1)- 输出线z 对应的密钥为 (kz0,kz1)

与门电路真值表:

xyx∧y
000
010
100
111

输出转换表:

kzez
kz00
kz11

混淆表:

kxikyjCd=Ekxi(Ekyj(kze))
kx0ky0C0=Ekx0(Eky0(kz0))
kx0ky1C1=Ekx0(Eky1(kz0))
kx1ky0C2=Ekx1(Eky0(kz0))
kx1ky1C3=Ekx1(Eky1(kz1))

执行过程:

  • 假如x=0,y=1,则Alice将kx0和混淆表发给Bob。
  • 双方运行OT协议,Bob得到ky1。
  • 然后使用 kx0 和 ky1 可以解密 C1 得到 kz0。
  • 根据输出转换表,得到 kz0 的真值0。

多个门组成的混淆电路 ​

  • alt text
  • alt text

混淆电路的优化 - Point and Permute ​

问题:在上述混淆电路中,当接收方收到四个混淆值时要尝试解密直到成功为止,存在一定的开销。

优化方法:Point-and-Permute方法,可以帮助接收者定位到要解密的密文,只需要解密一次。

优化步骤:

  1. 令每个门输入 x,y 和输出 z的两个密钥中都加1bit指针位p ,即:

    • 对于输入x:它原本对应的密钥是 kx0,kx1,引入一bit指针位 px,px∈{0,1},此时的密钥变为 (kx0‖px0) 和 (kx1‖px1),其中px0⊕px1=1。
    • 同上,对于输入y,两个密钥变为 (ky0‖py0) 和 (ky1‖py1),py0⊕py1=1。
    • 对于输出z,两个密钥变为(kz0‖pz0) 和 (kz1‖pz1),pz0⊕pz1=1。
  2. Alice构造混淆表时,表中的每一项按照两个密钥的最后一位(pxi,pyj)的值排列,然后发送给Bob。

  3. Bob收到混淆表和与Alice输入对应的kx后,与Alice运行OT协议得到ky。

  4. Bob分别将kx和 ky的最后1 bitpx和 py取出,以(px,py) 为坐标在混淆表中找到相应的密文进行解密,即可得到正确的kz。

与门示例:

  • alt text

3. GMW协议 ​

GMW协议简介 ​

GMW协议(Goldreich-Micali-Wigderson)是由Goldreich等人提出,是一种支持安全多方计算的协议。GMW协议通常采用秘密分享及OT等常见的密码学原语来实现多方的安全计算功能。

与Yao氏混淆电路协议略有不同,GMW协议不但支持布尔电路还支持算术电路。同时,电路评估时不再使用混淆表,而是在本地直接进行计算,这样大大节省对混淆真值表带来的解密操作,可以减少计算量,节省计算成本。

异或门 ​

秘密分享:

  • Alice和Bob的输入分别为xa、xb。
  • Alice产生随机数ra,Bob产生随机数rb,则xa的两个子份额分别为{xa⊕ra,ra},其中Alice持有xa⊕ra,Bob持有ra,两个子份额异或可得xa。
  • 同理将Bob的子份额进行分享,Alice会得到rb,Bob持有xb⊕rb。

计算过程:

  • 双方分别在本地将 xa 、xb 的子份额异或:
    • Alice: xa⊕ra⊕rb
    • Bob:xb⊕rb⊕ra
  • 而(xa⊕ra⊕rb)⊕(xb⊕rb⊕ra)=xa⊕xb,因此最终双方会各持有一份xa⊕xb的子份额。

与非门(不需要交互) ​

秘密分享:

  • 分享Alice的输入x,Alice选取随机数r,并将r发送给Bob,则x的两个子份额分别为{x⊕r,r},其中Alice持有x⊕r,Bob持有r。

计算过程:

  • Alice在本地将持有的子份额取反,即Alice: x⊕r。
  • 因为(x⊕r)⊕r=x¯,所以最终Alice和Bob各有一份x¯的子份额。

与门 ​

秘密分享:

  • Alice持有子份额(x1,y1),Bob持有子份额(x2,y2)。
  • Alice会针对Bob的子份额的可能取值(0或1),构造一个表T1,即f=(x1⊕x2)∧(y1⊕y2)。

表T1:

x2y2Sx2,y2=f(x1,x2,y1,y2)
00S00: f(x1,0,y1,0)
01S01: f(x1,0,y1,1)
10S10: f(x1,1,y1,0)
11S11: f(x1,1,y1,1)

表T2:

  • Alice随机选择一个r∈{0,1},并将T1表中每一项均与r异或得到表T2。
  • T2: S00:r⊕f(x1,0,y1,0), S01:r⊕f(x1,0,y1,1), S10:r⊕f(x1,1,y1,0), S11:r⊕f(x1,1,y1,1)

执行过程:

  • Alice和Bob运行OT41协议,其中Alice充当发送方,Bob充当接收方。
  • Alice准备的四个消息为(S00,S01,S10,S11),Bob以(x2,y2)作为选择位。
  • 最终Bob会得到x∧y的子份额r⊕x∧y,Alice有子份额r,而r⊕r⊕x∧y=x∧y,所以Alice和Bob各得到x∧y的一个子份额。

从两方扩展到多方 ​

秘密分享:

  • 假设有n个用户P1,P2,...,Pn,每个用户Pi的隐私输入为xi。
  • 用户Pi分享xi的过程如下:
    • Pi随机选取n−1个随机数ri1,ri2,...,ri(n−1)作为xi的前n−1子份额{xi1,xi2,...,xi(n−1)}。
    • 第n个子份额xin=ri1⊕ri2⊕...⊕ri(n−1)⊕xi。
    • 对这n个子份额进行异或操作可恢复得到xi。
    • Pi 把 ri1,ri2,...,ri(n−1) 分别发给 n−1 个用户,自己保留第n 个子份额 xin 。

异或门计算:

  • 用户Pi本地计算zi=xi⊕yi。
  • 则z=x⊕y=(x1⊕...⊕xn)⊕(y1⊕...⊕yn)=⊕i=1nzi。
  • 即参与者Pi在本地计算所得到的zi就是Pi在该异或门输出信号线z上的秘密份额。

与门计算:

  • x∧y=(x1⊕...⊕xn)∧(y1⊕...⊕yn)=⊕i=1n(xi∧yi)⊕(⊕i≠jxi∧yj)。
  • 用户Pi本地计算xi∧yi,则可获得⊕i=1nxi∧yi的一个子份额。
  • 用户Pi持有xi,用户Pj持有yj,$ P_i $ 和 Pj 分别输入 xi 和 yj 运行GMW的两方安全的与门协议,则每一方可以得到 xi∧yj 的子份额,表示为 [xi∧yj]。
  • 各个参与方在本地将两个部分的子份额 xi∧yi 和 [xi∧yj] 异或得到 x∧y 的子份额,即:(xi∧yi)⊕(⊕i≠j[xi∧yj])

4. BGW协议 ​

BGW协议简介 ​

BGW协议利用Shamir提出的(t,n)门限秘密共享方法实现安全多方计算。假设存在n个用户P1,P2,...,Pn,其中用户Pi持有秘密ai。

秘密分享:

  • 用户Pi选取一个t−1阶的多项式fi,且fi(0)=ai。
  • 则用户Pi持有n个秘密的共享份额[aj]i=fj(i),1≤j≤n。
  • 最终各个参与方的子份额如下表所示:
P1a1f1(1)f2(1)...fn(1)
P2a2f1(2)f2(2)...fn(2)
..................
Pnanf1(n)f2(n)...fn(n)

加法运算 ​

计算 a=[a1+a2+⋯+an]:

  • Pi本地计算f(i)=f1(i)+f2(i)+...+fn(i),则[a]i=f(i)。

乘法运算 ​

计算 a=[a1⋅a2]:

  • Pi本地计算f(i)=f1(i)⋅f2(i)。

  • 注意:多项式f(x)的阶为2(t−1),故需要2t−1个份额才能恢复多项式,因此需要降阶到t−1阶,方法如下:

    f0=∑i=12t−1λif(i)

    其中λi是拉格朗日系数。

  • Pi选取一个新的t−1阶的多项式fi′(x),且fi′(0)=f(i)。

  • Pi有 n 个份额 λif1′(i),λif2′(i),...,λifn′(i),然后本地计算:

    λif1′(i)+λif2′(i)+...+λifn′(i)=λifi
  • 则[a]i=λifi。

乘法三元组 ​

乘法三元组(Multiplication Triples)又被称为Beaver triple,其主要思想是利用预先在离线阶段生成的三元组实现在线时的乘法运算。

假设:参与者 P0 和 P1 已经共享随机数 u,v 和 z=uv,即Pi持有ui,vi,zi,i∈{0,1}。

计算 c=ab,其中Pi持有ai,bi,i∈{0,1}:

  1. Pi 本地计算 [e]i=ai−ui 和 [f]i=bi−vi,并发送 [e]i 和$ [f]i 给P$。
  2. Pi重构e=[e]0+[e]1和 f=[f]0+[f]1。
  3. Pi计算[c]i=e⋅f+f⋅ai+e⋅bi+zi,则参与者P0和 P1 可以分别获得结果ab的子份额 [c]0 和 [c]1。