概述
BGW协议可以用于对域上包含加法、乘法、常数乘法门的算术电路求值,此协议强依赖Shamir秘密分享方案,利用其同态特性对各个秘密份额进行适当的处理,就可以在秘密值上进行安全计算。
加法门
算数加法共享(两方)
一方持有密文一方持有密钥。
显然算数加法门完成计算结果是无需交互的,在本地即可完成计算。(GMW协议相当于mod 2 计算。)
基于Shamir方案的加法共享(多方)
考虑两个输入门 x , y x,y x,y,一个输出门 z z z的加法门,计算 z = y + x z=y+x z=y+x。同样,为了达到共享,需要将两个输入门的输入导线值秘密拆分给多个参与方。首先对每个输入导线针对要输入的值 x o r y x \quad or \quad y xory,选择一个 t t t阶的多项式,然后进行Shamir的 ( t , n ) (t,n) (t,n)分享,将秘密份额分发给其他的参与方,这样假设有 n n n个参与方,那么就会得到 n n n份来自不同输入导线的秘密份额。本地求和累加,即可得到输出门 z z z值的一个 ( t , n ) (t,n) (t,n)分享。只需 t + 1 t+1 t+1个及以上联合重构秘密即可还原出最终的加法结果。
乘法门
算数乘法共享(两方)
如图显然,和GMW协议一样,除了自己能够计算出来的一部分外,还会多出一部分必须要交互才能计算出来的结果。如果采用和布尔共享一样的OT协议的话,那么每个未知数据的可能情况非常多,多个组合起来就更加多。为了保障隐私,掩盖子电路的输出,所以需要添加掩码了,这里采用了乘法三元组。
Beaver三元组(乘法三元组)
一种MPC协议的构造范式:分为参与方输入未知时的预处理阶段和参与方选择好输入时的在线阶段。预处理阶段会为参与方生成一些相互之间具有一定关联性的随机量。参与方于在线阶段的时候则可以消耗这些随机量。
在前面的方法中,我们可以看到,协议中唯一的实际开销是为每个乘法门求值时的通信开销,由此这里采用三元组将大部分通信量转移到预处理阶段。
所谓乘法三元组,即
a
b
=
c
ab=c
ab=c,
a
a
a和
b
b
b是从域中随机选择的一个随机数,每一个乘法门求值都需要消耗掉一个三元组
步骤
依旧考虑两个输入门
x
,
y
x,y
x,y,一个输出门
z
z
z的乘法门,计算
x
∗
y
=
z
x * y = z
x∗y=z,首先给两个输入值添加掩码,也就是把三元组的元素进行两方拆分。也就是
a
=
a
0
+
a
1
,
b
=
b
0
+
b
1
a = a_0 + a_1,b=b_0+b_1
a=a0+a1,b=b0+b1,让两方分别持有一部分,注意到
a
b
=
(
a
0
+
a
1
)
(
b
0
+
b
1
)
=
a
0
b
0
+
a
0
b
1
+
a
1
b
0
+
a
1
b
1
ab=(a_0+a_1)(b_0+b_1)=a_0b_0+a_0b_1+a_1b_0+a_1b_1
ab=(a0+a1)(b0+b1)=a0b0+a0b1+a1b0+a1b1,将其拆分为两部分
(
a
b
)
0
(ab)_0
(ab)0和
(
a
b
)
1
(ab)_1
(ab)1
具体操作可以调用同态加密的方法,假设选定一个同态加密算法(如Paillier)
- P 1 P_1 P1计算 E ( a 1 ) , E ( b 1 ) E(a_1),E(b_1) E(a1),E(b1)然后发送给 P 0 P_0 P0
- P 0 P_0 P0计算 E ( b 1 ) a 0 E ( a 1 ) b 0 E ( a 0 b 0 − a 1 b 1 ) = E ( a 0 b 0 + a 0 b 1 + a 1 b 0 − a 1 b 1 ) E(b_1)^{a_0}E(a_1)^{b_0}E(a_0b_0-a_1b_1)=E(a_0b_0+a_0b_1+a_1b_0-a_1b_1) E(b1)a0E(a1)b0E(a0b0−a1b1)=E(a0b0+a0b1+a1b0−a1b1)发送给 P 1 P_1 P1
- P 1 P_1 P1解密即可
- 此时 ( a b ) 0 = a 1 b 1 (ab)_0=a_1b_1 (ab)0=a1b1,而 ( a b ) 1 = a 0 b 0 + a 0 b 1 + a 1 b 0 (ab)_1=a_0b_0+a_0b_1+a_1b_0 (ab)1=a0b0+a0b1+a1b0
现在两方分别持有 x i , y i , a i , b i x_i,y_i,a_i,b_i xi,yi,ai,bi。
- 让 x , y x,y x,y以掩码方式 e = x + a e=x+a e=x+a和 f = y + b f= y+b f=y+b输出,即公开 x i + a i , y i + b i x_i+a_i,y_i+b_i xi+ai,yi+bi,这样双方就能本地计算出 e , f e,f e,f
- 计算得到 x y = ( e − a ) ( f − b ) = e f − f a − e b + a b \begin{aligned} xy&=(e-a)(f-b)\\ &= ef-fa-eb+ab \end{aligned} xy=(e−a)(f−b)=ef−fa−eb+ab,那么将其拆分一下,得到 ( x y ) 0 = − f a 0 − e b 0 + ( a b ) 0 ( x y ) 1 = e f − f a 1 − e b 1 + ( a b ) 1 \begin{array}{lcl} (xy)_0=-fa_0-eb_0+(ab)_0 \\ (xy)_1=ef-fa_1-eb_1+(ab)_1 \end{array} (xy)0=−fa0−eb0+(ab)0(xy)1=ef−fa1−eb1+(ab)1
- 配合上前面计算出来的 ( a b ) 0 (ab)_0 (ab)0和 ( a b ) 1 (ab)_1 (ab)1即可在本地得到结果。
多方的乘法共享
基于Shamir秘密分发方案
=还是考虑两个输入门
x
,
y
x,y
x,y,一个输出门
z
z
z的乘法门,计算
x
∗
y
=
z
x * y = z
x∗y=z,直观上来看,实质是两个输入门的
t
t
t阶多项式相乘,这将得到一个阶数为
2
t
2t
2t的多项式,假定为
q
(
x
)
q(x)
q(x),每个参与方的秘密份额就是这个多项式上的一个点
q
(
i
)
=
[
v
x
]
[
v
y
]
q(i)=[v_x][v_y]
q(i)=[vx][vy](注意:
[
]
[]
[]代表
(
t
,
n
)
(t,n)
(t,n)的Shamir秘密分享的秘密份额),显然恢复出正确的结果是需要至少
2
t
+
1
2t+1
2t+1个秘密份额,这已经超过了Shamir秘密分享方案的阈值
t
t
t,那么如何解决阈值溢出问题呢?毫无疑问需要对乘积多项式进行降阶。
注意: 这里需要满足要求
2
t
+
1
<
n
2t+1<n
2t+1<n,即安全性基于多数诚实假设。
目标:获取
q
(
0
)
q(0)
q(0)的有效秘密份额,且多项式阶不超过阈值
t
t
t,从而能够让
t
+
1
t+1
t+1个人能够恢复出秘密
q
(
0
)
q(0)
q(0)。
核心思路:使用参与方的秘密份额的线性函数表示
q
(
0
)
=
∑
i
=
1
2
t
+
1
λ
i
q
(
i
)
q(0)=\sum^{2t+1}_{i=1} \lambda_i q(i)
q(0)=∑i=12t+1λiq(i),这是一个
(
t
,
n
)
(t,n)
(t,n)共享转加法
t
t
t的一个形式,也就是将
q
(
0
)
q(0)
q(0)转换为了
2
t
+
1
2t+1
2t+1份秘密份额的和。然后参与方的编号如果自始至终都默认为
[
1
,
2..2
t
]
[1,2..2t]
[1,2..2t]这样的增长方式的话,加上
λ
i
\lambda_i
λi是一个知道编号就能计算出的一个值,那么就可以在本地模拟
2
t
+
1
2t+1
2t+1个秘密份额进行求和。
具体降阶步骤如下,
- 首先每个参与方基于自己的 q ( i ) q(i) q(i)进行一次Shamir的 ( t , n ) (t,n) (t,n)秘密共享,并将对应的秘密份额 [ q ( i ) ] [q(i)] [q(i)]发送给其他参与方,也就是每个参与方将 q ( i ) q(i) q(i)作为秘密和常数项,选择一个 t t t阶多项式,分发对应子秘密份额给其他参与方。
- 各个参与方在本地计算 [ q ( 0 ) ] = ∑ i = 1 2 t + 1 λ i [ q ( i ) ] [q(0)]=\sum^{2t+1}_{i=1} \lambda_i [q(i)] [q(0)]=∑i=12t+1λi[q(i)], [ q ( 0 ) ] [q(0)] [q(0)]表示乘积秘密值 q ( 0 ) q(0) q(0)的有效份额, λ i \lambda_i λi是对应的拉格朗日系数。
此时因为 [ q ( i ) ] [q(i)] [q(i)]是一个 ( t , n ) (t,n) (t,n)共享,那么此时每个人计算出的 [ q ( 0 ) ] [q(0)] [q(0)]也就是一个 ( t , n ) (t,n) (t,n)共享。这就完成了降阶的操作。
基于随机输入以及三元组方案 (加法秘密分享)
每个参与方为每个乘法门构造三元组
[
a
]
[
b
]
=
[
c
]
[a][b]=[c]
[a][b]=[c](自己持有,其他参与方不知道,已知ab,c就定了),各个参与方持有秘密份额
[
v
x
]
,
[
v
y
]
[v_x],[v_y]
[vx],[vy](对于每个参与方的输入导线都会随机分配一个秘密份额,只有对应参与方知道其值,同样满足
v
=
∑
i
=
1
n
[
v
]
v=\sum^n_{i=1}[v]
v=∑i=1n[v])想要计算
[
v
x
v
y
]
[v_x v_y]
[vxvy]
(注意:
[
]
[]
[]为加法分享的子秘密份额,即
a
=
∑
i
=
1
n
[
a
]
,
b
=
∑
i
=
1
n
[
b
]
a=\sum^n_{i=1}[a],b=\sum^n_{i=1}[b]
a=∑i=1n[a],b=∑i=1n[b]),计算步骤如下
- 各个参与方在本地计算 [ d ] = [ v x − a ] [d] =[v_x - a] [d]=[vx−a]并公开
- 各个参与方在本地计算 [ e ] = [ v y − b ] [e] =[v_y - b] [e]=[vy−b]并公开
- 则有下列等式
v
x
v
y
=
(
v
x
−
a
+
a
)
(
v
y
−
b
+
b
)
=
(
d
+
a
)
(
e
+
b
)
=
d
e
+
d
b
+
a
e
+
a
b
=
d
e
+
d
b
+
a
e
+
c
\begin{aligned} v_x v_y &=(v_x -a +a)(v_y-b+b) \\ &= (d+a)(e+b) \\ &= de+db+ae+ab \\ &= de+db+ae+c \end{aligned}
vxvy=(vx−a+a)(vy−b+b)=(d+a)(e+b)=de+db+ae+ab=de+db+ae+c
d
,
e
d,e
d,e是被公开了的,而
[
a
]
,
[
b
]
,
[
c
]
[a],[b],[c]
[a],[b],[c]各个参与方均持有,因此各个参与方均可计算秘密份额
[
v
x
v
y
]
=
d
e
+
d
[
b
]
+
e
[
a
]
+
[
c
]
[v_x v_y]=de+d[b]+e[a]+[c]
[vxvy]=de+d[b]+e[a]+[c]
参考
实用安全多方计算导论
Arithmetic Sharing(算术共享)