参考文献:
- Bendlin R, Damgård I, Orlandi C, Zakarias S. Semi-homomorphic encryption and multiparty computation[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Springer, Berlin, Heidelberg, 2011: 169-188.
- Damgård I, Pastro V, Smart N, Zakarias S. Multiparty computation from somewhat homomorphic encryption[C]//Annual Cryptology Conference. Springer, Berlin, Heidelberg, 2012: 643-662.
- Evans D, Kolesnikov V, Rosulek M. A pragmatic introduction to secure multi-party computation[J]. Foundations and Trends® in Privacy and Security, 2018, 2(2-3): 70-246.
文章目录
- Abstract Sharing Mechanism
- Authenticated Secret Sharing
- BDOZ 协议
- MAC
- MACs 的运算
- Share
- Shares 的运算
- Generate Beaver Triple
- Compute Phase
- SPDZ 协议
- MACs
- Shares
- Preprocessing Phase
- Compute Phase
Abstract Sharing Mechanism
Beaver Triple 是为了加速 BGW 而设计的,但它可以任意的满足如下性质的抽象共享机制 [ v ] [v] [v] 上 work:
- Additive homomorphism:各方持有 shares [ x ] , [ y ] [x],[y] [x],[y] 以及公开常数 z z z,它们可以无交互地计算任意的 [ x + y ] = [ x ] + [ y ] [x+y] = [x] + [y] [x+y]=[x]+[y], [ x + z ] = z + [ x ] [x+z] = z + [x] [x+z]=z+[x], [ z ⋅ x ] = z ⋅ [ x ] [z \cdot x] = z \cdot [x] [z⋅x]=z⋅[x](三种加性操作,左边的 + , ⋅ +,\cdot +,⋅ 是 F \mathbb F F 上的运算,右边的 + , ⋅ +,\cdot +,⋅ 是 shares 的运算)
- Opening:各方持有 shares [ x ] [x] [x],它们可以将 x x x 可靠地(reliably)揭露给任意一方
- Privacy:任意的敌手都无法从 [ x ] [x] [x] 中获取 x x x 的任何信息
- Beaver triples:对于任意乘法门,各方都持有随机三元组的 shares [ a ] , [ b ] , [ c ] [a],\, [b],\, [c] [a],[b],[c],满足 c = a b c=ab c=ab
- Random input gadgets:各方持有随机的 [ r ] [r] [r],其中 r r r 仅被其中一方 P i P_i Pi 知晓。 P i P_i Pi 的输入值为 x x x,广播 δ = x − r \delta = x-r δ=x−r 给其他各方(并不泄露 x x x 的信息),所有参与者计算得到 [ x ] = [ r ] + δ [x] = [r] + \delta [x]=[r]+δ
只要 SS 的 Opening, Privacy 性质抵御 malicious adversaries,那么 Beaver Triple Paradigm 就是 malicious-secure.
Authenticated Secret Sharing
BDOZ 协议
MAC
2011年,BDOZ 协议中使用了 information-theoretic one-time MAC,形如
M A C K ( x ) : = α x + β , K = ( α , β ) ← R F 2 MAC_{K}(x):=\alpha x+\beta,\, K=(\alpha,\beta) \leftarrow_R \mathbb F^2 MACK(x):=αx+β,K=(α,β)←RF2
其中域的大小满足 ∣ F ∣ ≥ 2 κ |\mathbb F| \ge 2^\kappa ∣F∣≥2κ, κ \kappa κ是安全参数。
易知,这是 “one-time” MAC,一旦敌手获取到 t = M A C K ( x ) , t ′ = M A C K ( x ′ ) , x ≠ x ′ t=MAC_K(x),t'=MAC_K(x'),x\neq x' t=MACK(x),t′=MACK(x′),x=x′,那么就可以计算 α = ( t − t ′ ) ⋅ ( x − x ′ ) − 1 \alpha = (t-t') \cdot (x-x')^{-1} α=(t−t′)⋅(x−x′)−1与 β = t − α x \beta = t-\alpha x β=t−αx。但如果敌手仅仅知道一个消息 x x x 的MAC,那么敌手伪造另一个消息 x ′ ≠ x x'\neq x x′=x 的合法MAC,其成功概率为 1 / ∣ F ∣ = n e g l ( κ ) 1/|F| = negl(\kappa) 1/∣F∣=negl(κ)
密钥不可重用,对于不同的消息需要使用不同的密钥。如果我们固定 α \alpha α为全局密钥,对每个消息随机选择 β \beta β分量,那么已知两个消息 x , x ′ x,x' x,x′ 的MAC,
t = M A C α , β ( x ) = α x + β t ′ = M A C α , β ′ ( x ) = α x + β ′ \begin{aligned} t &=MAC_{\alpha,\beta}(x) = \alpha x + \beta\\ t' &=MAC_{\alpha,\beta'}(x) = \alpha x + \beta'\\ \end{aligned} tt′=MACα,β(x)=αx+β=MACα,β′(x)=αx+β′
可以计算消息加和 x + x ′ x+x' x+x′ 的MAC,
t + t ′ = α ( x + x ′ ) + ( β + β ′ ) = M A C α , β + β ′ ( x + x ′ ) t+t' = \alpha (x+x') + (\beta+\beta') = MAC_{\alpha,\beta+\beta'}(x+x') t+t′=α(x+x′)+(β+β′)=MACα,β+β′(x+x′)
我们说两个密钥 K , K ′ K,K' K,K′是一致的(consistent),如果 α = α ′ \alpha=\alpha' α=α′。这是保证计算 M A C ( x + x ′ ) MAC(x+x') MAC(x+x′) 的可行性。
MACs 的运算
我们定义,MAC 密钥的运算(博主自己定义的,为了方便表示 MAC 运算),
- Addition, K + K ′ = ( α , β + β ′ ) K+K' = (\alpha,\, \beta+\beta') K+K′=(α,β+β′)
- Multiplication by constants, c ⋅ K = ( α , c ⋅ β ) c \cdot K = (\alpha,\, c\cdot \beta) c⋅K=(α,c⋅β)
- Addition of constants, c + K = ( α , β − c ⋅ α ) c+K = (\alpha,\beta - c \cdot \alpha) c+K=(α,β−c⋅α)
那么 MAC 的运算为:
- Addition, M A C K ( x ) + M A C K ′ ( x ′ ) = M A C K + K ′ ( x + x ′ ) MAC_{K}(x) + MAC_{K'}(x') = MAC_{K+K'}(x+x') MACK(x)+MACK′(x′)=MACK+K′(x+x′),左边是 F \mathbb F F 上运算
- Multiplication by constants, c ⋅ M A C K ( x ) = M A C c ⋅ K ( c ⋅ x ) c \cdot MAC_{K}(x) = MAC_{c \cdot K}(c \cdot x) c⋅MACK(x)=MACc⋅K(c⋅x),左边是 F \mathbb F F 上运算
- Addition of constants, 0 + M A C K ( x ) = M A C c + K ( c + x ) 0 + MAC_{K}(x) = MAC_{c + K}(c + x) 0+MACK(x)=MACc+K(c+x),左边是 F \mathbb F F 上运算
Share
对于值 a ∈ F a \in \mathbb F a∈F, a = ∑ i = 1 n a i a=\sum_{i=1}^n a_i a=∑i=1nai,令 a i a_i ai是 P i P_i Pi持有的 share,额外地让 P i P_i Pi持有 MAC keys K a j i , j = 1 , ⋯ , n K_{a_j}^i,j=1,\cdots,n Kaji,j=1,⋯,n,用于校验其他的 P j P_j Pj的 shares a j a_j aj 的正确性。
简写 m j ( a i ) : = M A C K a i j ( a i ) m_j(a_i) := MAC_{K_{a_i}^j}(a_i) mj(ai):=MACKaij(ai) 代表 P j P_j Pj对 a i a_i ai 的校验,那么带有 MAC 的 shares 形如:
[ a ] = [ { a i , { K a j i , m j ( a i ) } j = 1 n } i = 1 n ] [a] = [\{a_i,\{K_{a_j}^i,\, m_j(a_i)\}_{j=1}^n\}_{i=1}^n] [a]=[{ai,{Kaji,mj(ai)}j=1n}i=1n]
其中, K a j i K_{a_j}^i Kaji 是 P i P_i Pi 用于校验其他人的 a j a_j aj的正确性,而 m j ( a i ) m_j(a_i) mj(ai) 是 P i P_i Pi让其他人相信自己的 a i a_i ai的正确性。
注意,与一般的MAC的场景不同,BDOZ 的MAC密钥不是双方都持有的,仅由检验方 P i P_i Pi自己持有自己的密钥 K a j i K_{a_j}^i Kaji。为了计算 m j ( a i ) m_j(a_i) mj(ai),需要利用 Semi-homomorphic Encryption(同态加密方案的弱化,当明文和随机性都足够小,确保解密错误的概率指数小),使用复杂的协议来计算它。
在 shares 的运算过程中,MAC也随之一同运算,以保持MAC的校验关系。每当需要重构秘密 a a a时,各方就可以用自己的MAC密钥 check 从其他参与者那儿获得的 shares 是否合法。
我们说 [ a ] [a] [a] 是一致的(consistent),如果 a = ∑ i a i a=\sum_i a_i a=∑iai,且对于任意的 i , j i,j i,j, m j ( a i ) = M A C K a i j ( a i ) m_j(a_i) = MAC_{K_{a_i}^j}(a_i) mj(ai)=MACKaij(ai)。这是保证 a a a 的安全性。
我们说两个 shares [ a ] , [ a ′ ] [a],[a'] [a],[a′] 是密钥一致的(key-consistent),如果它们都是一致的,且对于任意的 i , j i,j i,j, K a j i , K a j ′ i K_{a_j}^i,K_{a_j'}^i Kaji,Kaj′i是一致的。这是保证计算 [ a + a ′ ] [a+a'] [a+a′] 的可行性。
Shares 的运算
这儿的 [ a ] [a] [a] 是满足 Beaver Triple 的要求的 SS,其运算为:
-
Addition,对于 a = ∑ i a i , a ′ = ∑ i a i ′ a=\sum_i a_i,\, a'=\sum_i a_i' a=∑iai,a′=∑iai′,令 ( a + a ′ ) i = a i + a i ′ (a+a')_i = a_i+a_i' (a+a′)i=ai+ai′,那么
[ a + a ′ ] = [ a ] + [ a ′ ] : = [ { a i + a i ′ , { K a j i + K a j ′ i , m j ( a i ) + m j ( a i ′ ) } j = 1 n } i = 1 n ] \begin{aligned} [a+a'] &= [a]+[a'] \\ &:= \left[ \{a_i+a_i',\, \{K_{a_j}^i+K_{a_j'}^i,\, m_j(a_i)+m_j(a_i')\}_{j=1}^n\}_{i=1}^n \right] \end{aligned} [a+a′]=[a]+[a′]:=[{ai+ai′,{Kaji+Kaj′i,mj(ai)+mj(ai′)}j=1n}i=1n]每一对 shares 的MAC相加,对应的要修改密钥。
-
Multiplication by constants,对于 a = ∑ i a i a=\sum_i a_i a=∑iai,令 ( c ⋅ a ) i = c ⋅ a i (c \cdot a)_i = c \cdot a_i (c⋅a)i=c⋅ai,那么
[ c ⋅ a ] = c ⋅ [ a ] : = [ { c ⋅ a i , { c ⋅ K a j i , c ⋅ m j ( a i ) } j = 1 n } i = 1 n ] \begin{aligned} [c \cdot a] &= c \cdot [a] \\ &:= \left[ \{c \cdot a_i,\, \{c \cdot K_{a_j}^i,\, c \cdot m_j(a_i)\}_{j=1}^n\}_{i=1}^n \right] \end{aligned} [c⋅a]=c⋅[a]:=[{c⋅ai,{c⋅Kaji,c⋅mj(ai)}j=1n}i=1n]每一个 shares 的MAC乘以常数,对应的要修改密钥。
-
Addition of constants,对于 a = ∑ i a i a=\sum_i a_i a=∑iai,令 ( c + a ) 1 = c + a 1 , ( c + a ) i = a i , i = 2 , ⋯ , n (c + a)_1 = c + a_1,\, (c+a)_i=a_i,i=2,\cdots,n (c+a)1=c+a1,(c+a)i=ai,i=2,⋯,n,那么
[ c + a ] = c + [ a ] : = [ { a i + c , { c + K a 1 i , m 1 ( a i ) } , { K a j i , m j ( a i ) } j = 2 n } i = 1 1 , { a i , { c + K a 1 i , m 1 ( a i ) } , { K a j i , m j ( a i ) } j = 2 n } i = 2 n ] \begin{aligned} [c+a] &= c + [a] \\ &:= \left[\begin{aligned} &\{a_i+c,\, \{c+K_{a_1}^i,\, m_1(a_i)\},\, \{K_{a_j}^i,\, m_j(a_i)\}_{j=2}^n\}_{i=1}^1,\, \\ &\{a_i,\, \{c+K_{a_1}^i,\, m_1(a_i)\},\, \{K_{a_j}^i,\, m_j(a_i)\}_{j=2}^n\}_{i=2}^n\\ \end{aligned}\right] \end{aligned} [c+a]=c+[a]:=[{ai+c,{c+Ka1i,m1(ai)},{Kaji,mj(ai)}j=2n}i=11,{ai,{c+Ka1i,m1(ai)},{Kaji,mj(ai)}j=2n}i=2n]因为 a 1 a_1 a1变为了 a 1 + c a_1+c a1+c,因此与 a 1 a_1 a1有关的MAC密钥 K K K都替换为了 c + K c+K c+K,并保持MAC值 m j ( a 1 ) m_j(a_1) mj(a1)不变,从而满足MAC关系。而其他的 a i a_i ai以及对应的 K K K和 m j ( a i ) m_j(a_i) mj(ai)都不动。
注意,每个参与者 P i P_i Pi的各个密钥 K a j i K_{a_j}^i Kaji的 α \alpha α分量部分是自己的全局秘密,对每个参与者各确定一个 α j i \alpha_j^i αji,不得与其他参与者共享。 P j P_j Pj签的各个消息 a i , a i ′ a_i,a_i' ai,ai′的MAC值 m j ( a i ) , m j ( a i ′ ) m_{j}(a_i),m_{j}(a_i') mj(ai),mj(ai′),都仅与自己签的MAC之间做运算。
Generate Beaver Triple
在预处理阶段,BDOZ 使用 Semi-Homomorphic Encryption 来生成 Beaver Triple。令 E i E_i Ei 是使用 P i P_i Pi 的公钥 p k i pk_i pki的半同态加密函数,对于值 x ∈ F x \in \mathbb F x∈F,它的另一种 shares 写作:
< x > = { E 1 ( x 1 ) , ⋯ , E n ( x n ) } <x> = \{E_1(x_1),\, \cdots,\, E_n(x_n)\} <x>={E1(x1),⋯,En(xn)}
其中 x = ∑ i x i x = \sum_i x_i x=∑ixi,每个 E i ( x i ) E_i(x_i) Ei(xi) 都是 ( τ , ρ ) − (\tau,\rho)- (τ,ρ)−密文(即 ∣ x ∣ ≤ τ , ∥ r ∥ ∞ ≤ ρ |x| \le \tau,\, \|\bf r\|_\infty \le \rho ∣x∣≤τ,∥r∥∞≤ρ,这种密文可以正确解密)
另外,BDOZ 还需要两个 ZKPP:
- Π P o P K \Pi_{PoPK} ΠPoPK:零知识的明文的知识证明;证明给定密文,加密方确实拥有合适的明文和随机性。
- Π P o C M \Pi_{PoCM} ΠPoCM:零知识的密文乘法的知识证明;证明给定密文,确实是两个密文的对应明文乘积(加上一个小随机数)的密文。
预处理阶段简略描述如下:
-
构造 Π s h a r e \Pi_{share} Πshare:
- 每个 P i P_i Pi选择 x i x_i xi,广播 E i ( x i ) E_i(x_i) Ei(xi)
- 利用 Π P o P K \Pi_{PoPK} ΠPoPK验证,然后获得随机数 x = ∑ i x i x=\sum_i x_i x=∑ixi的 shares < x > <x> <x>
-
构造 Π 2 − m u l t \Pi_{2-mult} Π2−mult:
- 诚实的两方 P i , P j P_i,P_j Pi,Pj,都持有 E i ( x ) , E j ( y ) E_i(x),E_j(y) Ei(x),Ej(y)
- P i P_i Pi计算并发送 C = x ⋅ E j ( y ) + E j ( r ) C = x \cdot E_j(y) + E_j(r) C=x⋅Ej(y)+Ej(r),其中 r r r是小随机数。
- 利用 Π P o M C \Pi_{PoMC} ΠPoMC验证, P j P_j Pj解密 C C C得到 z j z_j zj, P i P_i Pi设置 z i = r z_i=r zi=r,它们满足 z i + z j = x y z_i+z_j=xy zi+zj=xy
-
构造 Π n − m u l t \Pi_{n-mult} Πn−mult:
- 利用 Π s h a r e \Pi_{share} Πshare生成 < a > , < b > <a>,\, <b> <a>,<b>,各方 P i P_i Pi设置初值 c i = a i b i c_i=a_i b_i ci=aibi
- 每一对 P i , P j P_i,P_j Pi,Pj分别执行 π 2 − m u l t \pi_{2-mult} π2−mult,输入 E i ( a i ) , E j ( b j ) E_i(a_i),E_j(b_j) Ei(ai),Ej(bj),输出 z i , z j z_i,z_j zi,zj,叠加到 c i = c i + z i , c j = c j + z j c_i=c_i+z_i,c_j=c_j+z_j ci=ci+zi,cj=cj+zj,因为 c = ( a 1 + ⋯ + a n ) ( b 1 + ⋯ + b n ) c=(a_1+\cdots+a_n)(b_1+\cdots+b_n) c=(a1+⋯+an)(b1+⋯+bn)
- 各方执行 Π s h a r e \Pi_{share} Πshare,将 c i c_i ci作为输入加密并广播验证,得到 < c > <c> <c>
-
构造 Π a d d − m a c s \Pi_{add-macs} Πadd−macs:
- 初始化步骤:每一对 P i , P j P_i,P_j Pi,Pj,让 P i P_i Pi随机选择 α j i \alpha_j^i αji,发送 E i ( α j i ) E_i(\alpha_j^i) Ei(αji)给 P j P_j Pj,利用 Π P o P K \Pi_{PoPK} ΠPoPK验证。
- 追加 MAC 步骤:
- 输入 < a > <a> <a>,各方持有的 a i a_i ai作为 [ a ] [a] [a]的一部分
- 每一对 P i , P j P_i,P_j Pi,Pj执行 Π 2 − m u l t \Pi_{2-mult} Π2−mult,输入 E i ( α j i ) E_i(\alpha_j^i) Ei(αji)和 α j ( a j ) \alpha_j(a_j) αj(aj),输出 z i , z j z_i,z_j zi,zj满足 z i + z j = α j i a j z_i+z_j=\alpha_j^ia_j zi+zj=αjiaj
- P i P_i Pi设置 β a j i = − z i \beta_{a_j}^i=-z_i βaji=−zi,存储 ( α j i , β a j i ) (\alpha_j^i,\, \beta_{a_j}^i) (αji,βaji)作为 MAC 密钥
- P j P_j Pj设置 m i ( a j ) = z j m_i(a_j)=z_j mi(aj)=zj,存储作为 [ a ] [a] [a]的一部分
-
构造 Π t r i p \Pi_{trip} Πtrip:
-
Initialize 步骤:执行半同态方案的 KeyGen 算法,执行 Π a d d − m a c s \Pi_{add-macs} Πadd−macs的初始化步骤
-
Triples 步骤:
-
执行 4 4 4次 Π s h a r e \Pi_{share} Πshare,获得 < a > , < b > , < f > , < g > <a>,<b>,<f>,<g> <a>,<b>,<f>,<g>
-
执行 2 2 2次 Π n − m u l t \Pi_{n-mult} Πn−mult,获得 < c > , < h > <c>,<h> <c>,<h>,其中 c = a b , h = f g c=ab,h=fg c=ab,h=fg
-
多次执行 Π a d d − m a c s \Pi_{add-macs} Πadd−macs,获得 [ a ] , [ b ] , [ c ] , [ f ] , [ g ] , [ h ] [a],[b],[c],[f],[g],[h] [a],[b],[c],[f],[g],[h]
-
牺牲(sacrificing)一个三元组,检验另一个三元组的正确性:各方掷硬币得到 e e e,计算并揭露 e [ a ] − f e[a]-f e[a]−f和 [ b ] − [ g ] [b]-[g] [b]−[g],记为 ϵ , δ \epsilon,\delta ϵ,δ,然后计算
e [ c ] − [ h ] − δ [ f ] − ϵ [ g ] − ϵ δ e[c]-[h]-\delta[f]-\epsilon[g]-\epsilon \delta e[c]−[h]−δ[f]−ϵ[g]−ϵδ披露它,检查它是否为 0 0 0(对于无错的 c = a b , h = f g c=ab,h=fg c=ab,h=fg的 shares,对于任意的 e e e它恒为零)
-
各方输出 [ a ] , [ b ] , [ c ] [a],[b],[c] [a],[b],[c]作为 Beaver Triple
-
-
Singles 步骤:
- 各方执行 Π s h a r e \Pi_{share} Πshare,获得 < a > <a> <a>
- 接着,各方执行 Π a d d − m a c s \Pi_{add-macs} Πadd−macs,获得 [ a ] [a] [a]
-
详细步骤,诸位可以看 BDOZ 论文:先定义 Ideal Functionality,然后实现 Real Protocol
Compute Phase
电路的计算步骤与 BGW 类似,如图:
SPDZ 协议
MACs
因为 BDOZ 中的每个值 x x x,都有 n n n个 shares,每个 share 都需要 n n n个MAC,因此复杂度为 O ( n 2 ) O(n^2) O(n2)
2012年,SPDZ 协议中改进 information-theoretic one-time MAC 为了 information-theoretic zero-time MAC。使用单个全局密钥(single global key),形如:
M A C α ( x ) : = α x , α ← R F MAC_{\alpha}(x):=\alpha x,\, \alpha \leftarrow_R \mathbb F MACα(x):=αx,α←RF
其中域的大小满足 ∣ F ∣ ≥ 2 κ |\mathbb F| \ge 2^\kappa ∣F∣≥2κ, κ \kappa κ是安全参数。
易知,这是 “zero-time” MAC,一旦敌手获取到消息 x x x的MAC值 t t t,那么就可以计算 α = t ⋅ x − 1 \alpha=t \cdot x^{-1} α=t⋅x−1
如果先 check 某一个消息 x x x的MAC值,那么获知了 ( x , t ) (x,t) (x,t)从而计算出 α \alpha α,那么之后敌手就可以任意伪造MAC值了。所以,应当遵循 all-or-none law(博主的理解),要么都不 check,要么 check 全部的消息。可以使用承诺方案。
Shares
我们用全局密钥 α \alpha α,对若干消息(或者说 shares)计算 1 1 1个(而非 n n n个)MAC。然后当这些 shares 做运算时,MAC也要伴随着做运算。为了保护 α \alpha α,不能直接发布消息对应的MAC,因此需要将它分享出去,让各参与方 P i P_i Pi都持有它的 shares,消息 a a a 的 MAC(连同 [ a ] [a] [a])形式如下:
< a > : = ( δ , ( a 1 , a 2 , ⋯ , a n ) , ( γ ( a ) 1 , γ ( a ) 2 , ⋯ , γ ( a ) n ) ) <a> := (\delta,\, (a_1,a_2,\cdots,a_n),\, (\gamma(a)_1,\gamma(a)_2,\cdots,\gamma(a)_n)) <a>:=(δ,(a1,a2,⋯,an),(γ(a)1,γ(a)2,⋯,γ(a)n))
其中 δ \delta δ是公开值, a = ∑ i a i a=\sum_i a_i a=∑iai,它的 MAC 值为 γ ( a ) = α ( a + δ ) \gamma(a)=\alpha (a+\delta) γ(a)=α(a+δ), γ ( a ) = ∑ i γ ( a ) i \gamma(a) = \sum_i \gamma(a)_i γ(a)=∑iγ(a)i。参与者 P i P_i Pi持有: δ , a i , γ ( a ) i \delta,a_i,\gamma(a)_i δ,ai,γ(a)i
与 SPDZ 不同,因为使用了 SS,MAC密钥在运算过程中不变。MAC 的运算为:
-
Addition,对于 a = ∑ i a i , a ′ = ∑ i a i ′ a=\sum_i a_i,\, a'=\sum_i a_i' a=∑iai,a′=∑iai′,令 ( a + a ′ ) i = a i + a i ′ (a+a')_i = a_i+a_i' (a+a′)i=ai+ai′,那么
< a + a ′ > = < a > + < a ′ > : = ( δ + δ ′ , ( a 1 + a 1 ′ , ⋯ , a n + a n ′ ) , ( γ ( a ) 1 + γ ( a ′ ) 1 , ⋯ , γ ( a ) n + γ ( a ′ ) n ) ) \begin{aligned} <a+a'> &= <a> + <a'>\\ &:= (\delta+\delta',\, (a_1+a_1',\cdots,a_n+a_n'),\, (\gamma(a)_1+\gamma(a')_1,\cdots,\gamma(a)_n+\gamma(a')_n)) \end{aligned} <a+a′>=<a>+<a′>:=(δ+δ′,(a1+a1′,⋯,an+an′),(γ(a)1+γ(a′)1,⋯,γ(a)n+γ(a′)n))由于 α ( a + a ′ ) = α a + α a ′ \alpha(a+a')=\alpha a+\alpha a' α(a+a′)=αa+αa′,每一对 shares 的MAC相加,同时修改对应的 δ \delta δ
-
Multiplication by constants,对于 a = ∑ i a i a=\sum_i a_i a=∑iai,令 ( c ⋅ a ) i = c ⋅ a i (c \cdot a)_i = c \cdot a_i (c⋅a)i=c⋅ai,那么
< c ⋅ a > = c ⋅ < a > : = ( c ⋅ δ , ( c ⋅ a 1 , ⋯ , c ⋅ a n ) , ( c ⋅ γ ( a ) 1 , ⋯ , c ⋅ γ ( a ) n ) ) \begin{aligned} <c \cdot a> &= c \cdot <a>\\ &:= (c \cdot \delta,\, (c \cdot a_1,\cdots,c \cdot a_n),\, (c \cdot \gamma(a)_1,\cdots,c \cdot \gamma(a)_n)) \end{aligned} <c⋅a>=c⋅<a>:=(c⋅δ,(c⋅a1,⋯,c⋅an),(c⋅γ(a)1,⋯,c⋅γ(a)n))由于 α ( c a ) = c ( α a ) \alpha (ca) = c(\alpha a) α(ca)=c(αa),每一个 shares 的MAC乘以常数,同时修改对应的 δ \delta δ
-
Addition of constants,对于 a = ∑ i a i a=\sum_i a_i a=∑iai,令 ( c + a ) 1 = c + a 1 , ( c + a ) i = a i , i = 2 , ⋯ , n (c + a)_1 = c + a_1,\, (c+a)_i=a_i,i=2,\cdots,n (c+a)1=c+a1,(c+a)i=ai,i=2,⋯,n,那么
< c + a > = c + < a > : = ( δ − c , ( c + a 1 , a 2 , ⋯ , a n ) , ( γ ( a ) 1 , γ ( a ) 2 , ⋯ , γ ( a ) n ) ) \begin{aligned} <c + a> &= c + <a>\\ &:= (\delta-c,\, (c + a_1,a_2,\cdots,a_n),\, (\gamma(a)_1,\gamma(a)_2,\cdots,\gamma(a)_n)) \end{aligned} <c+a>=c+<a>:=(δ−c,(c+a1,a2,⋯,an),(γ(a)1,γ(a)2,⋯,γ(a)n))由于 γ ( a ) = α ( a + δ ) \gamma(a)=\alpha(a+\delta) γ(a)=α(a+δ),因此只需保持加和 a + δ a+\delta a+δ不变,那么 γ ( a ) \gamma(a) γ(a)也就不用变了
当 shares 做运算时,MAC也伴随着做运算,保持MAC校验等式。SPDZ 将 check 延迟到 MPC 最后的输出阶段,先让各方发布秘密的 shares 的承诺,然后再重构 MAC 以校验秘密的正确性。
在预处理阶段,SPDZ 使用 Somewhat Homomorphic Encryption(简写做 SHE)来生成 Beaver Triple。
Preprocessing Phase
在预处理阶段,SPDZ 使用 SHE 来生成 Beaver Triple,且 SHE 的私钥被各方共享 [ s k ] [sk] [sk],无人知晓完整私钥。解密时,采用分布式解密算法。
MAC 的全局密钥 α \alpha α 在这个阶段被生成和共享,它的 Shares 形如:
[ α ] = ( ( α 1 , ⋯ , α n ) , { β i , γ ( α ) 1 i , ⋯ , γ ( α ) n i } i = 1 n ) [\alpha] = ((\alpha_1,\cdots,\alpha_n),\, \{\beta_i,\gamma(\alpha)_1^i,\cdots,\gamma(\alpha)_n^i\}_{i=1}^n) [α]=((α1,⋯,αn),{βi,γ(α)1i,⋯,γ(α)ni}i=1n)
其中 α = ∑ i α i \alpha = \sum_i \alpha_i α=∑iαi,将 γ ( α ) j : = α β j = ∑ i γ ( α ) j i \gamma(\alpha)_j := \alpha \beta_j = \sum_i \gamma(\alpha)_j^i γ(α)j:=αβj=∑iγ(α)ji 视为 M A C β j ( α ) MAC_{\beta_j}(\alpha) MACβj(α)。每个参与者 P i P_i Pi持有: α i , β i , γ ( α ) 1 i , ⋯ , γ ( α ) n i \alpha_i,\beta_i,\gamma(\alpha)_1^i,\cdots,\gamma(\alpha)_n^i αi,βi,γ(α)1i,⋯,γ(α)ni,即自己的MAC密钥 β i \beta_i βi,以及 α \alpha α和 M A C β j ( α ) , j = 1 , ⋯ , n MAC_{\beta_j}(\alpha),j=1,\cdots,n MACβj(α),j=1,⋯,n的 shares
另外,在预处理阶段还要生成一些随机数 r r r,以两种 shares 的形式, ( < r > , [ r ] ) (<r>, [r]) (<r>,[r])-pairs,共享给各个参与者。在后面的协议描述中,我看到尖括号的 < r > <r> <r> 被用于电路的计算,而方括号的 [ r ] [r] [r] 则只用于 Open 给某个参与者,且在 [ r ] [r] [r] 上并没有定义类似 < r > <r> <r> 的加性运算。所以说,形如 [ r ] [r] [r] 的其实是一种公共生成的未知随机串吗?(论文里解释两种 shares 类型的异同了吗?我虽然没有每个字每个字地细看,但真的没看到啊!)。
类似 BDOZ,SPDZ 也需要 1 1 1个 ZKPP: Π P o P K \Pi_{PoPK} ΠPoPK,零知识的明文的知识证明;证明给定密文,加密方确实拥有合适的明文和随机性。
预处理阶段简略描述如下:
-
构造 Π r e s h a r e \Pi_{reshare} Πreshare:
- 输入公开的明文向量 m \bf m m的密文 e m : = E n c p k ( m ) e_{m} := Enc_{pk}(\textbf m ) em:=Encpk(m),以及一个控制符 e n c enc enc
- 各方采样随机向量 f i \bf f_i fi,定义 f = ∑ i f i \textbf f = \sum_i \textbf f_i f=∑ifi,广播密文 E n c p k ( f i ) Enc_{pk}(\textbf f_i) Encpk(fi)
- 执行 Π P o P K \Pi_{PoPK} ΠPoPK,验证每个 e f i e_{f_i} efi,然后同态加法 e f = ∑ i e f i e_f = \sum_i e_{f_i} ef=∑iefi,再计算 e m + f = e m + e f e_{m+f}=e_m+e_f em+f=em+ef
- 分布式解密 e m + f e_{m+f} em+f,得到 m+f \textbf{m+f} m+f,令 P 1 P_1 P1设置 m 1 = m + f − f 1 \bf m_1 = m+f-f_1 m1=m+f−f1,其他的 P i P_i Pi设置 m i = − f i \bf m_i= -f_i mi=−fi(易知, m = ∑ i m i \bf m = \sum_i m_i m=∑imi)
- 如果 e n c = NoNewCiphertext enc=\text{NoNewCiphertext} enc=NoNewCiphertext,那么只输出 shares m i \bf m_i mi
- 如果 e n c = NewCiphertext enc=\text{NewCiphertext} enc=NewCiphertext,那么额外输出 e m ′ : = E n c ( m+f ) − ∑ i e f i e_m' := Enc(\textbf{m+f})-\sum_i e_{f_i} em′:=Enc(m+f)−∑iefi
-
构造 Π b r a c k e t \Pi_{bracket} Πbracket:
- 各方拥有 shares v 1 , ⋯ , v n \textbf v_1,\cdots,\textbf v_n v1,⋯,vn,以及公开的密文 e v e_\textbf v ev,这里 v = ∑ i v i \bf v=\sum_i v_i v=∑ivi
- 各方都对每个 i = 1 , ⋯ , n i=1,\cdots,n i=1,⋯,n设置 e γ i = e β i ⋅ e v e_{\gamma_i} = e_{\beta_i} \cdot e_v eγi=eβi⋅ev,其中的 β i \beta_i βi是 P i P_i Pi的私人MAC密钥, e β i e_{\beta_i} eβi在初始化阶段被公开
- 执行 Π r e s h a r e \Pi_{reshare} Πreshare,输入 e γ i , NoNewCiphertext e_{\gamma_i},\text{NoNewCiphertext} eγi,NoNewCiphertext,输出MAC值 β j v \beta_j \bf v βjv的 shares γ i 1 , ⋯ , γ i n \gamma_i^1,\cdots,\gamma_i^n γi1,⋯,γin
- 最终,输出 bracket shares [ v ] = ( ( v 1 , ⋯ , v n ) , { β i , γ 1 i , ⋯ , γ n i } i = 1 n ) [\textbf v] = ((\textbf v_1,\cdots,\textbf v_n),\, \{\beta_i,\gamma_1^i,\cdots,\gamma_n^i\}_{i=1}^n) [v]=((v1,⋯,vn),{βi,γ1i,⋯,γni}i=1n)
-
构造 Π a n g l e \Pi_{angle} Πangle:
- 各方拥有 shares v 1 , ⋯ , v n \textbf v_1,\cdots,\textbf v_n v1,⋯,vn,以及公开的密文 e v e_\textbf v ev,这里 v = ∑ i v i \textbf v=\sum_i \textbf v_i v=∑ivi
- 各方设置 e α v = e v ⋅ e α e_{\alpha v} = e_v \cdot e_\alpha eαv=ev⋅eα,其中 α \alpha α是全局密钥,对应的密文在初始化阶段被公开(但没人知道 α \alpha α)
- 执行 Π r e s h a r e \Pi_{reshare} Πreshare,输入 e α v , NoNewCiphertext e_{\alpha v},\text{NoNewCiphertext} eαv,NoNewCiphertext,输出MAC值 α v \alpha \bf v αv的 shares γ i 1 , ⋯ , γ i n \gamma_i^1,\cdots,\gamma_i^n γi1,⋯,γin
- 最终,输出 angle shares < v > = ( 0 , ( v 1 , ⋯ , v n ) , ( γ 1 i , ⋯ , γ n i ) ) <\textbf v> = (0,(\textbf v_1,\cdots,\textbf v_n),\, (\gamma_1^i,\cdots,\gamma_n^i)) <v>=(0,(v1,⋯,vn),(γ1i,⋯,γni))
-
构造 Π p r e p \Pi_{prep} Πprep:
-
Initialize 步骤:
- 执行 KeyGen 算法,获得公钥 p k pk pk
- 各方生成私人密钥 β i \beta_i βi,以及 α i \alpha_i αi,全局密钥为 α = ∑ i α i \alpha=\sum_i \alpha_i α=∑iαi
- 令 d i a g ( x ) = [ x , ⋯ , x ] diag(x)=[x,\cdots,x] diag(x)=[x,⋯,x],各方计算并广播 e α i = E n c ( d i a g ( α i ) ) e_{\alpha_i}=Enc(diag(\alpha_i)) eαi=Enc(diag(αi))和 α β i = E n c ( d i a g ( β i ) ) \alpha_{\beta_i}=Enc(diag(\beta_i)) αβi=Enc(diag(βi))
- 执行 Π P o P K \Pi_{PoPK} ΠPoPK验证上述密文,计算 e α = ∑ i e α i e_\alpha=\sum_i e_{\alpha_i} eα=∑ieαi,存储它
- 执行 Π b r a c k e t \Pi_{bracket} Πbracket,输入 d i a g ( α 1 ) , ⋯ , d i a g ( α n ) , e α diag(\alpha_1),\cdots,diag(\alpha_n),e_\alpha diag(α1),⋯,diag(αn),eα,获得 shares [ d i a g ( α ) ] [diag(\alpha)] [diag(α)],存储它
-
Pair 步骤:
- 各方生成随机向量 r i \textbf r_i ri,计算并广播 e r i e_{r_i} eri
- 执行 Π P o P K \Pi_{PoPK} ΠPoPK验证每个密文,设置 e r = ∑ i e r i e_r = \sum_i e_{r_i} er=∑ieri
- 输入 r 1 , ⋯ , r n , e r r_1,\cdots,r_n,e_r r1,⋯,rn,er,执行 Π b r a c k e t \Pi_{bracket} Πbracket获得 [ r ] [r] [r],执行 Π a n g l e \Pi_{angle} Πangle获得 < r > <r> <r>
- 最终,输出一对 shares [ r ] , < r > [r],<r> [r],<r>
-
Triple 步骤:
- 各方生成随机向量 a i , b i \bf a_i,b_i ai,bi,计算并广播 e a i , e b i e_{a_i},e_{b_i} eai,ebi
- 执行 Π P o P K \Pi_{PoPK} ΠPoPK验证每个密文,设置 e a = ∑ i e a i , e b = ∑ i e b i e_a = \sum_i e_{a_i},\, e_b = \sum_i e_{b_i} ea=∑ieai,eb=∑iebi,计算 e c = e a ⋅ e b e_c = e_a \cdot e_b ec=ea⋅eb
- 执行 Π a n g l e \Pi_{angle} Πangle,获得 shares < a > , < b > <\textbf a>,<\textbf b> <a>,<b>
- 执行 Π r e s h a r e \Pi_{reshare} Πreshare,输入 e c , NewCiphertext e_c,\text{NewCiphertext} ec,NewCiphertext,输出 c 1 , ⋯ , c n , e c ′ \textbf c_1,\cdots,\text c_n,e_c' c1,⋯,cn,ec′
- 执行 Π a n g l e \Pi_{angle} Πangle,获得 shares < c > <c> <c>
- 最终,输出 < a > , < b > , < c > <a>,<b>,<c> <a>,<b>,<c>
-
详细步骤,诸位可以看 SPDZ 论文:先定义 Ideal Functionality,然后实现 Real Protocol
Compute Phase
BDOZ 和 SPDZ 中,将预处理阶段称为“离线”,将计算阶段称为“在线”
SPDZ 的在线阶段如下:
注意,披露最终计算结果之前,需要对之前披露的所有的 shares 检验 MAC:先承诺所有的需要 check 的 shares 和 MAC 值,然后才披露全局密钥 α \alpha α,再 check 之前披露的 shares 的正确性,最终披露结果 y y y,并要 check 它是否满足MAC关系。
在计算过程中 Open 了一些数值 a 1 , ⋯ , a T a_1,\cdots,a_T a1,⋯,aT,将它作为一个多项式 a ( x ) = ∑ j a j x j a(x) = \sum_j a_jx^j a(x)=∑jajxj。同时,这些数值在 P i , i = 1 , ⋯ , n P_i, i=1,\cdots,n Pi,i=1,⋯,n 那里的 MAC 碎片为 γ ( a j ) i \gamma(a_j)_i γ(aj)i,把它们写成矩阵形式
[ γ ( a 1 ) 1 γ ( a 2 ) 1 ⋯ γ ( a T ) 1 γ ( a 1 ) 2 γ ( a 2 ) 2 ⋯ γ ( a T ) 2 ⋮ ⋯ γ ( a 1 ) n γ ( a 2 ) n ⋯ γ ( a T ) n ] \begin{bmatrix} \gamma(a_1)_1 & \gamma(a_2)_1 & \cdots & \gamma(a_T)_1\\ \gamma(a_1)_2 & \gamma(a_2)_2 & \cdots & \gamma(a_T)_2\\ \vdots & \cdots\\ \gamma(a_1)_n & \gamma(a_2)_n & \cdots & \gamma(a_T)_n\\ \end{bmatrix} γ(a1)1γ(a1)2⋮γ(a1)nγ(a2)1γ(a2)2⋯γ(a2)n⋯⋯⋯γ(aT)1γ(aT)2γ(aT)n
- 每一列的加和 γ ( a i ) = ∑ i γ ( a j ) i \gamma(a_i) = \sum_i\gamma(a_j)_i γ(ai)=∑iγ(aj)i,是所有参与者对 a j a_j aj 的MAC 值
- 每一行的多项式 γ i ( x ) = ∑ j γ ( a j ) i x j \gamma_i(x) = \sum_j\gamma(a_j)_ix^j γi(x)=∑jγ(aj)ixj,是多项式 a ( x ) a(x) a(x) 对应的 MAC 值
接着,我们对于随机点 e e e 求多项式 a ( x ) a(x) a(x) 的值 a : = a ( e ) a:=a(e) a:=a(e) 以及它对应的 MAC 碎片 γ i : = γ i ( e ) \gamma_i := \gamma_i(e) γi:=γi(e),完整的 MAC 值为 γ = ∑ i γ i \gamma = \sum_i \gamma_i γ=∑iγi。如果某个 a j a_j aj 的 MAC 值不正确,那么根据 Schwartz-Zippel lemma,将以压倒性概率在随机点位置的函数值 a , γ a,\gamma a,γ 上检测出两个多项式不相等(论文中没解释,博主自己的理解)。