基本概述
本文提出了一个通用的安全多方计算协议,可以抵抗主动敌手,敌手最多可以腐蚀 n n n方中的 n − 1 n-1 n−1方,因此该协议可以归为不诚实大多数下的一个通用协议。协议中进行的算术运算可以在任意的有限域。协议分为两个阶段,一个是预处理阶段,一个是在线阶段,预处理阶段与输入数据无关且预处理阶段采用同态加密技术。在线阶段的计算效率线性接近于 n , n n,n n,n表示有 n n n个参与方。本次分享主要针对在线阶段协议。原文链接:Multiparty Computation from Somewhat Homomorphic Encryption
数学表示
向量
x
=
(
x
1
,
x
2
,
⋯
,
x
n
)
∈
R
n
.
x=(x_1,x_2,\cdots,x_n)\in \mathbb{R}^n.
x=(x1,x2,⋯,xn)∈Rn.
∣
∣
x
∣
∣
∞
:
=
m
a
x
1
≤
i
≤
n
∣
x
i
∣
,
∣
∣
x
∣
∣
1
:
=
∑
1
≤
i
≤
n
∣
x
i
∣
,
∣
∣
x
∣
∣
2
:
=
(
∑
∣
x
i
∣
2
)
||x||_{\infty}:=max_{1 \le i \le n}|x_i|,\qquad ||x||_1:=\sum_{1 \le i \le n}|x_i|,\qquad ||x||_2:=\sqrt(\sum|x_i|^2)
∣∣x∣∣∞:=max1≤i≤n∣xi∣,∣∣x∣∣1:=∑1≤i≤n∣xi∣,∣∣x∣∣2:=(∑∣xi∣2)
F
c
o
m
:
F_{com}:
Fcom:表示承诺函数。
在线阶段协议
在我们的在线协议中,为了简单起见,我们假设一个广播信道可用,每一方只有一个输入,并且只计算一个公共输出值。在完整的版本中,我们解释了如何从点对点的信道实现我们所需要的广播信道,并解除了对输入和输出数量的限制,而不影响整体的复杂性。我们的思想是使用无条件的安全MAC来保护我们的秘密值不被主动恶意敌手操作,我们从有限域 F p k \mathbb{F}_{p^k} Fpk随机选取一个全局值 α \alpha α,对于一个秘密值 a a a,将它在 n n n方中进行加性共享,MAC值 α ⋅ a \alpha \cdot a α⋅a也以秘密分享的形式在 n n n方中存在。因为是线性的加性秘密分享因此可以在做乘法的时候使用 B e a v e r Beaver Beaver三元组。一个直接的问题是,可靠地打开一个值似乎需要我们检查MAC,而这需要参与方知道 α \alpha α。然而,一旦知道了 α \alpha α,其他值上的MAC就可以被伪造出来。我们通过将对MAC的检查推迟到输出阶段来解决这个问题。在输出阶段,参与方生成要公开的值及其与相应的MAC的份额的随机线性组合;参与方对结果进行一个承诺,然后只公开 α \alpha α,当 α \alpha α被揭露时,被腐蚀的参与方利用密钥已经太晚了。因此,如果MAC检查出来所有打开的值都是正确的并且概率很高,所以我们可以相信我们计算的输出值是正确的,并且可以安全地打开它们。
秘密分享方式
对于一个秘密值
a
∈
F
p
k
a\in \mathbb{F}_{p^k}
a∈Fpk
⟨
a
⟩
:
=
(
δ
,
(
a
1
,
⋯
,
a
n
)
,
(
γ
(
a
)
1
,
⋯
,
γ
(
a
)
n
)
)
,
α
(
a
+
δ
)
=
γ
(
a
1
)
+
⋯
+
γ
(
a
n
)
,
a
=
a
1
+
⋯
+
a
n
,
δ
\langle a \rangle :=(\delta,(a_1,\cdots,a_n),(\gamma(a)_1,\cdots,\gamma(a)_n)),\alpha(a+\delta)=\gamma(a_1)+\cdots+\gamma(a_n),a=a_1+\cdots+a_n,\delta
⟨a⟩:=(δ,(a1,⋯,an),(γ(a)1,⋯,γ(a)n)),α(a+δ)=γ(a1)+⋯+γ(an),a=a1+⋯+an,δ 是公共的共享值,
P
i
P_i
Pi拥有
a
i
,
γ
(
a
)
i
,
γ
(
a
)
←
γ
(
a
1
)
+
⋯
+
γ
(
a
n
)
,
γ
(
a
)
a_i,\gamma(a)_i,\gamma(a) \leftarrow \gamma(a_1)+\cdots+\gamma(a_n),\gamma(a)
ai,γ(a)i,γ(a)←γ(a1)+⋯+γ(an),γ(a)是在全局密钥
α
\alpha
α下
a
a
a的MAC。
数值计算
设有秘密值 a , b , a,b, a,b,常量 e . e. e.
线性计算
⟨
a
⟩
+
⟨
b
⟩
=
⟨
a
+
b
⟩
e
⋅
⟨
a
⟩
=
⟨
e
a
⟩
e
+
⟨
a
⟩
=
⟨
e
+
a
⟩
\langle a\rangle +\langle b\rangle=\langle a+b\rangle \qquad e\cdot \langle a\rangle=\langle ea\rangle \qquad e+\langle a\rangle=\langle e+a\rangle
⟨a⟩+⟨b⟩=⟨a+b⟩e⋅⟨a⟩=⟨ea⟩e+⟨a⟩=⟨e+a⟩
⟨
e
+
a
⟩
:
=
(
δ
−
e
,
(
a
1
+
e
,
a
2
,
⋯
,
a
n
)
,
(
γ
(
a
)
1
,
⋯
,
γ
(
a
)
n
)
)
\langle e+a\rangle:=(\delta-e,(a_1+e,a_2,\cdots,a_n),(\gamma(a)_1,\cdots,\gamma(a)_n))
⟨e+a⟩:=(δ−e,(a1+e,a2,⋯,an),(γ(a)1,⋯,γ(a)n))。
乘法计算
对于乘法需要预处理阶段的参与,这里我们假设预处理阶段输出随机三元组
⟨
a
⟩
,
⟨
b
⟩
,
⟨
c
⟩
,
c
=
a
b
\langle a\rangle,\langle b\rangle,\langle c\rangle,c=ab
⟨a⟩,⟨b⟩,⟨c⟩,c=ab。然而因为存在恶意敌手,预处理阶段可能会出现错误
Δ
,
\Delta,
Δ,即
c
=
a
b
+
Δ
c=ab+\Delta
c=ab+Δ,因此在运用输出的三元组之前需要对三元组进行验证。这里的验证三元组需要通过牺牲另外一个三元组
⟨
f
⟩
,
⟨
g
⟩
,
⟨
h
⟩
\langle f\rangle,\langle g\rangle,\langle h\rangle
⟨f⟩,⟨g⟩,⟨h⟩来进行(具体看后面的协议)。给定这么一个有效的三元组
c
=
a
b
c=ab
c=ab后,要计算
⟨
x
y
⟩
,
\langle xy\rangle,
⟨xy⟩,首先计算
⟨
x
⟩
−
⟨
a
⟩
=
ϵ
,
⟨
y
⟩
−
⟨
b
⟩
=
δ
,
x
y
=
(
a
+
ϵ
)
(
b
+
δ
)
=
c
+
ϵ
b
+
a
δ
+
δ
ϵ
,
⟨
x
⟩
⋅
⟨
y
⟩
=
⟨
c
⟩
+
ϵ
⟨
b
⟩
+
⟨
a
⟩
δ
+
δ
ϵ
\langle x\rangle-\langle a\rangle=\epsilon,\langle y\rangle-\langle b\rangle=\delta,\\ xy=(a+\epsilon)(b+\delta)=c+\epsilon b+a\delta+\delta\epsilon,\langle x \rangle \cdot\langle y \rangle=\langle c \rangle+\epsilon\langle b \rangle+\langle a \rangle\delta+\delta\epsilon
⟨x⟩−⟨a⟩=ϵ,⟨y⟩−⟨b⟩=δ,xy=(a+ϵ)(b+δ)=c+ϵb+aδ+δϵ,⟨x⟩⋅⟨y⟩=⟨c⟩+ϵ⟨b⟩+⟨a⟩δ+δϵ。
重要的是在我们的协议中,我们实际上不能保证我们有正确的结果,因为我们不立即检查打开的值的MAC。
部分打开
在协议的第一部分,每个参与方只做部分打开。
部分打开:所有参与方
P
i
P_i
Pi将
a
i
a_i
ai发送给
P
1
P_1
P1,然后
P
1
P_1
P1计算
a
=
a
1
+
⋯
+
a
n
a=a_1+\cdots+a_n
a=a1+⋯+an并且广播
a
a
a给所有参与方。这里我们简单处理都是发送个给
P
1
P_1
P1,实际上我们要考虑平衡工作负载不一定总是要
P
1
P_1
P1来计算最终的值,也可以要其他参与方来计算。
全局 [ [ α ] ] [[\alpha]] [[α]]
正如前面所说我们将验证推迟到协议最后的输出阶段,为了验证MAC我们需要一个全局的
α
,
\alpha,
α,我们在预处理阶段获得
α
\alpha
α,并且表示方式也有所不同。
[
[
α
]
]
:
=
(
(
α
1
,
⋯
,
α
n
)
,
(
β
i
,
γ
(
α
)
1
i
,
⋯
,
γ
(
α
)
n
i
)
i
=
1
,
⋯
,
n
)
α
=
∑
i
α
i
∑
j
γ
(
α
)
i
j
=
α
β
i
[[\alpha]]:=((\alpha_1,\cdots,\alpha_n),(\beta_i,\gamma(\alpha)_1^i,\cdots,\gamma(\alpha)^i_n)_{i=1,\cdots,n})\qquad\alpha=\sum_i\alpha_i\qquad \sum_j\gamma(\alpha)_i^j=\alpha\beta_i
[[α]]:=((α1,⋯,αn),(βi,γ(α)1i,⋯,γ(α)ni)i=1,⋯,n)α=∑iαi∑jγ(α)ij=αβi
P
i
P_i
Pi拥有
α
i
,
β
i
,
γ
(
α
)
1
i
,
⋯
,
γ
(
α
)
n
i
,
γ
(
α
)
i
=
∑
j
γ
(
α
)
i
j
\alpha_i,\beta_i,\gamma(\alpha)_1^i,\cdots,\gamma(\alpha)_n^i,\gamma(\alpha)_i=\sum_j\gamma(\alpha)_i^j
αi,βi,γ(α)1i,⋯,γ(α)ni,γ(α)i=∑jγ(α)ij。
γ
(
α
)
i
\gamma(\alpha)_i
γ(α)i是
α
\alpha
α在
P
i
P_i
Pi拥有秘密密钥
β
i
\beta_i
βi的MAC。为了公开
[
[
α
]
]
,
[[\alpha]],
[[α]],每一方
P
j
P_j
Pj发送
α
j
,
γ
(
α
)
i
j
\alpha_j,\gamma(\alpha)_i^j
αj,γ(α)ij给
P
i
,
P_i,
Pi,然后
P
i
P_i
Pi检查
∑
j
γ
(
α
)
i
j
=
α
β
i
\sum_j\gamma(\alpha)_i^j=\alpha\beta_i
∑jγ(α)ij=αβi。
最后,预处理还要输出
n
n
n对随机值
⟨
r
⟩
,
[
[
r
]
]
,
\langle r \rangle,[[r]],
⟨r⟩,[[r]],这些对被用于协议的输入阶段。
整个在线阶段如下图所示:
上图说明
初始化:
通过预处理阶段各参与方获得 [ [ α ] ] , [[\alpha]], [[α]],乘法元组 ( ⟨ a ⟩ , ⟨ b ⟩ , ⟨ c ⟩ ) , ⟨ r ⟩ , [ [ r ] ] , [ [ t ] ] , [ [ e ] ] (\langle a \rangle,\langle b \rangle,\langle c \rangle),\langle r \rangle,[[r]],[[t]],[[e]] (⟨a⟩,⟨b⟩,⟨c⟩),⟨r⟩,[[r]],[[t]],[[e]]。
输入:
P
i
P_i
Pi要在所有参与方中完成它的输入
x
i
x_i
xi的秘密分享
⟨
x
i
⟩
,
P
i
\langle x_i \rangle,P_i
⟨xi⟩,Pi通过预处理阶段或者
[
[
r
]
]
[[r]]
[[r]]获得
r
r
r.
P
i
P_i
Pi广播
ϵ
=
x
i
−
r
\epsilon=x_i-r
ϵ=xi−r
其他所有方计算
⟨
x
i
⟩
=
⟨
r
⟩
+
ϵ
\langle x_i \rangle=\langle r \rangle+\epsilon
⟨xi⟩=⟨r⟩+ϵ
根据线性计算可得
⟨
x
i
⟩
=
⟨
r
⟩
+
ϵ
=
⟨
r
⟩
+
x
i
−
r
=
<
x
i
−
r
+
r
>
:
=
(
δ
−
(
x
i
−
r
)
,
(
r
1
+
(
x
i
−
r
)
,
⋯
,
r
n
)
,
(
γ
(
r
)
i
,
⋯
,
γ
(
r
)
n
)
)
\langle x_i \rangle=\langle r \rangle+\epsilon=\langle r \rangle+x_i-r=<x_i-r+r>:=(\delta-(x_i-r),(r_1+(x_i-r),\cdots,r_n),(\gamma(r)_i,\cdots,\gamma(r)_n))
⟨xi⟩=⟨r⟩+ϵ=⟨r⟩+xi−r=<xi−r+r>:=(δ−(xi−r),(r1+(xi−r),⋯,rn),(γ(r)i,⋯,γ(r)n))
加法
线性操作 ⟨ x ⟩ + ⟨ y ⟩ = ⟨ x + y ⟩ , \langle x \rangle +\langle y \rangle =\langle x+y \rangle, ⟨x⟩+⟨y⟩=⟨x+y⟩,直接本地计算。
乘法
计算乘法
⟨
x
⟩
,
⟨
y
⟩
,
\langle x \rangle ,\langle y \rangle,
⟨x⟩,⟨y⟩,使用两个元组
(
⟨
a
⟩
,
⟨
b
⟩
,
⟨
c
⟩
)
,
(
⟨
f
⟩
,
⟨
g
⟩
,
⟨
h
⟩
)
,
其中
c
=
a
b
(\langle a \rangle,\langle b \rangle,\langle c \rangle),(\langle f \rangle,\langle g \rangle,\langle h \rangle),其中c=ab
(⟨a⟩,⟨b⟩,⟨c⟩),(⟨f⟩,⟨g⟩,⟨h⟩),其中c=ab经过了验证,验证如下:
部分打开一个随机值
[
[
t
]
]
[[t]]
[[t]],计算
ρ
=
t
⋅
⟨
a
⟩
−
⟨
f
⟩
,
σ
=
⟨
b
⟩
−
⟨
g
⟩
\rho=t\cdot \langle a \rangle -\langle f \rangle, \sigma=\langle b \rangle -\langle g \rangle
ρ=t⋅⟨a⟩−⟨f⟩,σ=⟨b⟩−⟨g⟩
评估
t
⋅
⟨
c
⟩
−
⟨
h
⟩
−
σ
⋅
⟨
f
⟩
−
ρ
⋅
⟨
g
⟩
−
σ
⋅
ρ
,
t\cdot \langle c \rangle-\langle h \rangle-\sigma\cdot \langle f \rangle-\rho\cdot \langle g \rangle-\sigma\cdot\rho,
t⋅⟨c⟩−⟨h⟩−σ⋅⟨f⟩−ρ⋅⟨g⟩−σ⋅ρ,然后部分打开结果。如果结果不为0则abort,否则验证通过。
注意:验证过程可以放到预处理阶段且这里只需要一个随机值
t
t
t。
验证通过之后就可以使用
(
⟨
a
⟩
,
⟨
b
⟩
,
⟨
c
⟩
)
(\langle a \rangle,\langle b \rangle,\langle c \rangle)
(⟨a⟩,⟨b⟩,⟨c⟩)进行后面的乘法运算,部分公开
⟨
x
⟩
−
⟨
a
⟩
=
ϵ
,
⟨
y
⟩
−
⟨
b
⟩
=
δ
,
\langle x \rangle-\langle a \rangle=\epsilon,\langle y \rangle-\langle b \rangle=\delta,
⟨x⟩−⟨a⟩=ϵ,⟨y⟩−⟨b⟩=δ,最后计算
⟨
z
⟩
=
⟨
c
⟩
+
⟨
b
⟩
ϵ
+
⟨
a
⟩
δ
+
δ
ϵ
。
\langle z \rangle=\langle c \rangle+\langle b \rangle\epsilon+\langle a \rangle\delta+\delta\epsilon。
⟨z⟩=⟨c⟩+⟨b⟩ϵ+⟨a⟩δ+δϵ。
输出
现在所有参与方拥有
⟨
y
⟩
,
\langle y \rangle,
⟨y⟩,我们要打开最终的结果
y
y
y,过程如下:
1.
1.
1.设
a
1
,
⋯
,
a
T
a_1,\cdots,a_T
a1,⋯,aT是目前为止所有已经打开的值,且
⟨
a
j
⟩
=
(
δ
j
,
(
a
j
,
1
,
⋯
,
a
j
,
n
)
,
(
γ
(
a
j
)
1
,
⋯
,
γ
(
a
j
)
n
)
)
,
\langle a_j\rangle=(\delta_j,(a_{j,1},\cdots,a_{j,n}),(\gamma(a_j)_1,\cdots,\gamma(a_j)_n)),
⟨aj⟩=(δj,(aj,1,⋯,aj,n),(γ(aj)1,⋯,γ(aj)n)),现在随机值
[
[
e
]
]
[[e]]
[[e]]被打开,并且所有参与方计算
e
i
=
e
i
,
i
=
(
1
,
⋯
,
T
)
,
a
=
∑
j
e
j
a
j
e_i=e^i,i=(1,\cdots,T),a=\sum_j e_ja_j
ei=ei,i=(1,⋯,T),a=∑jejaj。
2.
2.
2.每一个参与方
P
i
P_i
Pi对
γ
i
←
∑
j
e
j
γ
(
α
j
)
i
\gamma_i \leftarrow \sum_je_j\gamma(\alpha_j)_i
γi←∑jejγ(αj)i进行承若
F
c
o
m
,
F_{com},
Fcom,同时也要对
y
i
,
γ
(
y
)
i
y_i,\gamma(y)_i
yi,γ(y)i进行承诺
F
c
o
m
F_{com}
Fcom。
3.
3.
3.公开
[
[
α
]
]
[[\alpha]]
[[α]]。
4.
4.
4.每一方
P
i
P_i
Pi要求打开对
γ
i
\gamma_i
γi的承诺
F
c
o
m
,
F_{com},
Fcom,所有参与方都检查
α
(
a
+
∑
j
e
j
δ
j
)
=
∑
i
γ
i
\alpha(a+\sum_je_j\delta_j)=\sum_i\gamma_i
α(a+∑jejδj)=∑iγi,如果不相等协议直接abort。
这里有
α
(
a
+
∑
j
e
j
δ
j
)
=
α
(
∑
j
e
j
a
j
+
∑
j
e
j
δ
j
)
=
α
(
∑
j
e
j
(
a
j
+
δ
j
)
)
=
∑
i
γ
i
=
∑
i
∑
j
e
j
γ
(
a
j
)
i
\alpha(a+\sum_je_j\delta_j)=\alpha(\sum_je_ja_j+\sum_je_j\delta_j)=\alpha(\sum_je_j(a_j+\delta_j))=\sum_i\gamma_i=\sum_i\sum_je_j\gamma(a_j)_i
α(a+∑jejδj)=α(∑jejaj+∑jejδj)=α(∑jej(aj+δj))=∑iγi=∑i∑jejγ(aj)i。这一步相当于对上面所有的公开值
a
1
,
⋯
,
a
n
a_1,\cdots,a_n
a1,⋯,an进行了一次认证。
5.
5.
5.为了获得
y
,
y,
y,打开对
y
i
,
γ
(
y
i
)
y_i,\gamma(y_i)
yi,γ(yi)的承诺,我们知道
y
=
∑
i
y
i
y=\sum_iy_i
y=∑iyi,每一方检查
α
(
y
+
δ
)
=
∑
i
γ
(
y
i
)
,
\alpha(y+\delta)=\sum_i\gamma(y_i),
α(y+δ)=∑iγ(yi),相等则输出
y
y
y。
最后,本人水平有限理解有错误的地方还请谅解!