隐私计算基础学习——秘密共享技术(加性、Shamir、RSS)
本文主要记录隐私计算中的秘密共享(Secret Sharing,SS)技术,包括加性秘密共享、Shamir 秘密共享、复制秘密共享(Replicated Secret Sharing,RSS)等技术,仅供参考。
一、秘密共享技术介绍
秘密共享是安全多方计算中的一项关键技术,它的核心思想是将一个秘密(隐私数据)随机拆分为若干份额,随后将这些份额分发给不同的参与方,只有持有足够份额数量的参与方聚集在一起才可以重建秘密。此外,不同的数据在秘密共享的状态下可以通过一些算法实现安全的运算。
秘密共享技术主要用于多方计算的算术部分(加法和乘法),且对于非线性运算往往只能采用多项式近似将其转化为线性运算。秘密共享主要由三类算法组成:分发、运算、重建。本文从算法实现角度将秘密共享分为加性秘密共享、Shamir 秘密共享以及复制秘密共享进行介绍。
符号说明:一个秘密 sss 在共享状态下通常表示为 ⟦s⟧\llbracket s\rrbracket[[s]],而 ⟦z⟧=⟦x⟧+⟦y⟧\llbracket z\rrbracket = \llbracket x\rrbracket + \llbracket y\rrbracket[[z]]=[[x]]+[[y]] 代表两个秘密 x,yx,yx,y 在共享状态下进行加法运算得到结果 z=x+yz=x+yz=x+y 的共享 ⟦z⟧\llbracket z\rrbracket[[z]]。
二、加性秘密共享
加性秘密共享通常在环上实现(例如 Z2k\mathbb{Z}_{2^k}Z2k),后文介绍中的加法和乘法运算均为环上的运算(模 2k2^k2k),使用环或有限域中的定点数表示是为了保证安全性。加性秘密共享支持扩展至任意数量的参与方,本文中为便于表示以两个参与方(Alice 和 Bob)为例进行介绍。
1. 秘密分发
对于一个秘密 s∈Z2ks\in \mathbb{Z}_{2^k}s∈Z2k,不妨设该秘密由 Alice 拥有,则秘密分发过程为:Alice 生成一个随机数 r∈Z2kr\in \mathbb{Z}_{2^k}r∈Z2k,并将其发送给 Bob 作为 Bob 的秘密份额 s2=rs_2 = rs2=r,则 Alice 的秘密份额为 s1=s−rs_1 = s - rs1=s−r,即 ⟦s⟧=(s−r,r)\llbracket s\rrbracket = (s-r,r)[[s]]=(s−r,r)。
2. 秘密重建
在加性秘密共享中,只有集齐所有的参与方的份额才能重建秘密。重建过程很简单:Alice 将 s1s_1s1 发送给 Bob,Bob 将 s2s_2s2 发送给 Alice,双方在本地计算秘密 s=s1+s2s = s_1 + s_2s=s1+s2。
3. 加法运算
设两个秘密 x,yx,yx,y 在加性秘密共享状态下的份额为:Alice 拥有 x1,y1x_1,y_1x1,y1,Bob 拥有 x2,y2x_2, y_2x2,y2,即 ⟦x⟧=(x1,x2)\llbracket x\rrbracket = (x_1, x_2)[[x]]=(x1,x2),⟦y⟧=(y1,y2)\llbracket y\rrbracket=(y_1,y_2)[[y]]=(y1,y2)。
则这两个秘密进行加法运算后的结果 z=x+yz = x + yz=x+y 在秘密共享状态下的份额为:Alice 在本地计算 z1=x1+y1z_1=x_1+y_1z1=x1+y1,Bob 在本地计算 z2=x2+y2z_2 = x_2 + y_2z2=x2+y2,得到 ⟦z⟧=(z1,z2)\llbracket z\rrbracket = (z_1, z_2)[[z]]=(z1,z2),正确性显然成立。
4. 乘法运算
设两个秘密 x,yx,yx,y 在加性秘密共享状态下的份额为:Alice 拥有 x1,y1x_1,y_1x1,y1,Bob 拥有 x2,y2x_2, y_2x2,y2,即 ⟦x⟧=(x1,x2)\llbracket x\rrbracket = (x_1, x_2)[[x]]=(x1,x2),⟦y⟧=(y1,y2)\llbracket y\rrbracket=(y_1,y_2)[[y]]=(y1,y2)。记两个秘密进行乘法运算后的结果为 ⟦z⟧=⟦x⟧⋅⟦y⟧\llbracket z\rrbracket = \llbracket x\rrbracket \cdot \llbracket y\rrbracket[[z]]=[[x]]⋅[[y]]。
乘法运算需要利用 Beaver 三元组实现,该三元组 (a,b,c)(a,b,c)(a,b,c) 满足 a⋅b=ca\cdot b = ca⋅b=c,并以加性秘密共享的形式分享在 Alice 和 Bob 之间,满足:⟦a⟧=(a1,a2),⟦b⟧=(b1,b2),⟦c⟧=(c1,c2)\llbracket a\rrbracket = (a_1, a_2),\llbracket b\rrbracket=(b_1,b_2),\llbracket c\rrbracket=(c_1,c_2)[[a]]=(a1,a2),[[b]]=(b1,b2),[[c]]=(c1,c2),其中 Alice 持有 (a1,b1,c1)(a_1,b_1,c_1)(a1,b1,c1),Bob 持有 (a2,b2,c2)(a_2, b_2, c_2)(a2,b2,c2)。
假设已经得到了这个三元组,那么乘法运算后的结果可以通过如下运算得到:
z=x⋅y=(x−a)⋅(y−b)+x⋅b+a⋅y−a⋅b=(x−a)⋅(y−b)+(x−a)⋅b+a⋅(y−b)+a⋅b \begin{align} z = x\cdot y &=(x-a)\cdot (y-b) + x\cdot b + a\cdot y - a\cdot b \nonumber \\ &= (x-a)\cdot (y-b) + (x - a) \cdot b + a \cdot (y - b) + a\cdot b \nonumber \end{align} z=x⋅y=(x−a)⋅(y−b)+x⋅b+a⋅y−a⋅b=(x−a)⋅(y−b)+(x−a)⋅b+a⋅(y−b)+a⋅b
Alice 和 Bob 可以首先计算 x^=x−a\hat{x} = x-ax^=x−a 和 y^=y−b\hat{y} = y-by^=y−b 并将它们公开重建,则乘法可以表示为:
z=x^⋅y^+x^⋅b+a⋅y^+a⋅b=(x^⋅y^+x^⋅b1+a1⋅y^+c1)+(x^⋅b2+a2⋅y^+c2) \begin{align} z &= \hat{x}\cdot \hat{y} + \hat{x} \cdot b + a \cdot \hat{y} + a\cdot b \nonumber \\ &= (\hat{x}\cdot \hat{y} + \hat{x} \cdot b_1 + a_1 \cdot \hat{y} + c_1)+( \hat{x} \cdot b_2 + a_2 \cdot \hat{y} + c_2) \nonumber \end{align} z=x^⋅y^+x^⋅b+a⋅y^+a⋅b=(x^⋅y^+x^⋅b1+a1⋅y^+c1)+(x^⋅b2+a2⋅y^+c2)
因此 Alice 和 Bob 可以在本地计算 zzz 在加性秘密共享下的份额 ⟦z⟧\llbracket z\rrbracket[[z]]:
z1=x^⋅y^+x^⋅b1+a1⋅y^+c1z2=x^⋅b2+a2⋅y^+c2 \begin{align} z_1 &= \hat{x}\cdot \hat{y} + \hat{x} \cdot b_1 + a_1 \cdot \hat{y} + c_1 \nonumber \\ z_2 &= \hat{x} \cdot b_2 + a_2 \cdot \hat{y} + c_2 \nonumber \end{align} z1z2=x^⋅y^+x^⋅b1+a1⋅y^+c1=x^⋅b2+a2⋅y^+c2
由于三元组是随机生成的,公开重建 x^=x−a\hat{x} = x-ax^=x−a 和 y^=y−b\hat{y} = y-by^=y−b 并不会暴露 x,yx,yx,y 的信息。
三元组的生成方式通常可以分为三种:通过可信第三方生成、利用同态加密生成、利用不经意传输生成。
4.1 可信第三方生成 Beaver 三元组
假设存在一个所有参与方都能信任,且不会与任何参与方合谋的第三方服务器存在,那么只需要在这个服务器中生成好三元组与其对应的份额,再通过安全信道传输给对应的参与方即可。
通过可信第三方生成三元组的方式效率极高,但现实世界一般无法找到这样的第三方。
4.2 同态加密生成 Beaver 三元组
利用 Paillier 或 DGK 同态加密技术可以在不依赖第三方的情况下生成三元组,这两种同态加密技术都具备加法同态和常量乘法同态性质。设要生成的三元组为 (a,b,c)(a,b,c)(a,b,c) 满足 a⋅b=ca\cdot b = ca⋅b=c,且 Alice 应当持有 (a1,b1,c1)(a_1,b_1,c_1)(a1,b1,c1),Bob 应当持有 (a2,b2,c2)(a_2, b_2, c_2)(a2,b2,c2)。该方法生成三元组本质上是利用同态加密实现加法秘密共享下的乘法运算:
-
Alice 在本地随机生成 a1,b1a_1, b_1a1,b1,Bob 在本地随机生成 a2,b2a_2, b_2a2,b2,且只有 Alice 具有同态加密算法的私钥。
-
Alice 将 a1,b1a_1,b_1a1,b1 利用同态加密算法加密后得到 Enc(a1),Enc(b1)Enc(a_1),Enc(b_1)Enc(a1),Enc(b1) 并将它们发送给 Bob。
-
Bob 在本地生成一个随机数 rrr,并利用同态加密算法同态计算 Enc(a1⋅b2+a2⋅b1+r)Enc(a_1\cdot b_2 + a_2 \cdot b_1 + r)Enc(a1⋅b2+a2⋅b1+r) 并将其发送给 Alice。
-
Alice 使用私钥解密 Bob 发来的消息,并计算份额 c1=a1⋅b1+a1⋅b2+a2⋅b1+rc_1 = a_1 \cdot b_1 +a_1\cdot b_2 + a_2 \cdot b_1 + rc1=a1⋅b1+a1⋅b2+a2⋅b1+r。
-
Bob 在本地计算份额 c2=a2⋅b2−rc_2 = a_2 \cdot b_2 - rc2=a2⋅b2−r。
既然上述步骤可以利用同态加密实现加法秘密共享下的乘法运算,为什么还要生成三元组后再让参与方进行若干计算?这是因为上述步骤利用了公私钥加解密方案,直接使用效率较低,但三元组的生成不依赖于真实数据,可以在需要计算乘法前预先生成,在真实计算时直接使用之前生成的三元组即可。
4.3 不经意传输生成 Beaver 三元组
利用不经意传输技术也可以在不依赖第三方的情况下生成三元组。
首先 Alice 在本地随机生成 a1,b1a_1, b_1a1,b1,Bob 在本地随机生成 a2,b2a_2, b_2a2,b2,它们要计算:
c1+c2=(a1+a2)⋅(b1+b2)=a1⋅b1+a1⋅b2+a2⋅b1+a2⋅b2 c_1 + c_2 = (a_1 + a_2 ) \cdot (b_1 + b_2) = a_1 \cdot b_1 + a_1 \cdot b_2 + a_2 \cdot b_1 + a_2 \cdot b_2 c1+c2=(a1+a2)⋅(b1+b2)=a1⋅b1+a1⋅b2+a2⋅b1+a2⋅b2
显然 a1⋅b1a_1\cdot b_1a1⋅b1 和 a2⋅b2a_2 \cdot b_2a2⋅b2 可以在本地计算,只需要利用不经意传输计算 a1⋅b2a_1 \cdot b_2a1⋅b2 和 a2⋅b1a_2 \cdot b_1a2⋅b1 即可,将它们统一表示为计算 x⋅yx\cdot yx⋅y,其中 Alice 拥有 xxx,Bob 拥有 yyy。由于 x,y∈Z2kx,y\in \mathbb{Z}_{2^k}x,y∈Z2k,则有:
x⋅y=x[0]⋅20⋅y+x[1]⋅21⋅y+⋯+x[k−1]⋅2k−1⋅y x\cdot y = x[0] \cdot 2^{0} \cdot y + x[1] \cdot 2^{1} \cdot y + \cdots + x[k-1] \cdot 2^{k-1} \cdot y x⋅y=x[0]⋅20⋅y+x[1]⋅21⋅y+⋯+x[k−1]⋅2k−1⋅y
其中 x[i]x[i]x[i] 代表 xxx 在二进制表示下第 iii 位的取值。Bob 可以构造 kkk 对消息 (si,2i⋅y+si)(s_i, 2^{i} \cdot y + s_i)(si,2i⋅y+si) 作为发送方,其中 sis_isi 为随机数,而 Alice 分别以 (x[0],x[1],⋯ ,x[k−1])(x[0], x[1], \cdots, x[k-1])(x[0],x[1],⋯,x[k−1]) 为选择比特利用 2 选 1 不经意传输技术作为接收方按顺序对 kkk 对消息进行选择,并将结果求和作为自己的份额 z1z_1z1,Bob 在本地计算份额 z2=−∑i=0k−1siz_2 = -\sum_{i = 0}^{k-1}{s_i}z2=−∑i=0k−1si。
类似于 4.2,不经意传输生成三元组也是预先生成的,且可以利用 OT 扩展技术执行大量的 OT 操作,效率较高。
三、Shamir 秘密共享
Shamir 秘密共享[1]^{[1]}[1]是一种 (k,n)(k,n)(k,n) 门限秘密共享,即秘密被随机拆分为 nnn 份,拥有其中 kkk 份及以上即可还原秘密,否则无法获取关于秘密的任何额外信息。
Shamir 秘密共享基于多项式的拉格朗日插值法实现,本质上是在二维平面上 kkk 个不同的点即可唯一确定一个 k−1k-1k−1 阶的多项式,而少于 kkk 个不同的点则存在无穷多种 k−1k-1k−1 阶的多项式。
为了使加密有意义,kkk 作为门限应当满足 k≥2k\ge 2k≥2,且 n≥kn \ge kn≥k(若需乘法计算,必须满足 n≥2k−1n \ge 2k-1n≥2k−1,原因在乘法部分介绍)。在实际应用中,通常取 n≥2k−1n\ge 2k-1n≥2k−1,这样既可以进行乘法运算,也可以在少数份额丢失 (≤⌊n/2⌋=k−1)(\le \lfloor n/2\rfloor=k - 1)(≤⌊n/2⌋=k−1) 的场景下还原秘密。
1. 秘密分发
Shamir 秘密共享通常在有限域 Fp\mathbb{F}_pFp 上实现,其中 ppp 往往是一个大于秘密值的质数。以下所有的运算默认在该有限域上进行 (mod ppp)。
对于一个秘密 s∈Fps\in \mathbb{F}_ps∈Fp,一个 (k,n)(k,n)(k,n) 门限的 Shamir 秘密共享需要构造一个 k−1k-1k−1 阶的随机多项式:
f(x)=a0+a1x+a2x2+⋯+ak−1xk−1 f(x) = a_0 + a_1x+a_2x^2 + \cdots +a_{k-1}x^{k-1} f(x)=a0+a1x+a2x2+⋯+ak−1xk−1
其中令 a0=sa_0=sa0=s,而 a1,⋯ ,ak−1a_1, \cdots,a_{k-1}a1,⋯,ak−1 均为 Fp\mathbb{F}_pFp 的随机数。
秘密持有者构造完多项式后,随机选择该多项式上 nnn 个不同的点 (xi,yi)(x_i,y_i)(xi,yi) 并将其对应发送给 nnn 个参与方 PiP_iPi(通常取 xi=ix_i=ixi=i),其中 i=1,2,⋯ ,ni =1,2,\cdots, ni=1,2,⋯,n。这样每个参与方拥有一个点,即一个秘密份额,完成秘密分发。
注意:在秘密分发时,每个参与方份额对应的横坐标应当公开且保持不变。
2. 秘密重建
在进行秘密重建时,需要至少 kkk 个参与方参加,不妨设 kkk 个参与方提供的 kkk 个点为 (xi,yi)(x_i,y_i)(xi,yi),其中 i=1,2,⋯ ,ki=1,2,\cdots,ki=1,2,⋯,k。则根据拉格朗日插值法,有:
f(x)=∑i=1k(yi⋅li(x)) f(x) = \sum_{i=1}^{k}(y_i \cdot l_i(x)) f(x)=i=1∑k(yi⋅li(x))
其中,li(x)l_i(x)li(x) 为拉格朗日基多项式:
li(x)=∏j=1,j≠ikx−xjxi−xj l_i(x) = \prod_{j=1,j\ne i}^k\frac{x-x_j}{x_i - x_j} li(x)=j=1,j=i∏kxi−xjx−xj
原理可以参考拉格朗日插值法的证明,当 f(x)f(x)f(x) 被唯一确定后,其常数项 a0a_0a0 就是重建得到的秘密 sss。
注意到,Shamir 秘密共享在秘密重建时引入了除法运算,这是其在域而非环上实现的原因,环中的元素不保证都存在乘法逆元。
3. 加法运算
在 Shamir 秘密共享下,加法运算较为简单。对于两个秘密 a,ba,ba,b,每个秘密都对应一个 k−1k-1k−1 阶多项式,不妨记为 A(x),B(x)A(x),B(x)A(x),B(x)。每个参与方都持有每个秘密对应的一个份额(点坐标),不妨设 PiP_iPi 持有 (xi,A(xi))\big(x_i,A(x_i)\big)(xi,A(xi)) 和 (xi,B(xi))\big(x_i,B(x_i)\big)(xi,B(xi)),其中 i=1,2,⋯ ,ni = 1,2,\cdots, ni=1,2,⋯,n。
由于在不同秘密分享时,每个份额对应的横坐标应当公开且保持不变,即对于 PiP_iPi 来说,所有秘密在它这里的份额横坐标都为 xix_ixi。
显然 PiP_iPi 可以计算 a+ba+ba+b 的份额为 (xi,A(xi)+B(xi))\big(x_i,A(x_i)+B(x_i)\big)(xi,A(xi)+B(xi)) 。
4. 乘法运算
Shamir 秘密共享的乘法运算较为复杂。类似地,对于两个秘密 a,ba,ba,b,每个秘密都对应一个 k−1k-1k−1 阶多项式,不妨记为 A(x),B(x)A(x),B(x)A(x),B(x)。参与方 PiP_iPi 持有 (xi,A(xi))\big(x_i,A(x_i)\big)(xi,A(xi)) 和 (xi,B(xi))\big(x_i,B(x_i)\big)(xi,B(xi)),其中 i=1,2,⋯ ,ni = 1,2,\cdots, ni=1,2,⋯,n。设:
A(x)=a0+a1x+⋯+ak−1xk−1B(x)=b0+b1x+⋯+bk−1xk−1 \begin{align} A(x) &=a_0 +a_1x+\cdots +a_{k-1}x^{k-1} \nonumber\\ B(x) &=b_0 +b_1x+\cdots +b_{k-1}x^{k-1} \nonumber \end{align} A(x)B(x)=a0+a1x+⋯+ak−1xk−1=b0+b1x+⋯+bk−1xk−1
其中 a=a0,b=b0a=a_0,b=b_0a=a0,b=b0。不妨设 D(x)=A(x)⋅B(x)D(x) = A(x)\cdot B(x)D(x)=A(x)⋅B(x):
D(x)=d0+d1x+⋯+d2k−2x2k−2 D(x) =d_0 +d_1x+\cdots +d_{2k-2}x^{2k-2} D(x)=d0+d1x+⋯+d2k−2x2k−2
显然有 d0=a0⋅b0=a⋅bd_0 = a_0\cdot b_0 = a \cdot bd0=a0⋅b0=a⋅b,因此每个参与方 PiP_iPi 在本地计算 D(xi)=A(xi)⋅B(xi)D(x_i)=A(x_i) \cdot B(x_i)D(xi)=A(xi)⋅B(xi)。
这样一来,所有参与方总共拥有 nnn 个点 (xi,D(xi))(x_i,D(x_i))(xi,D(xi)),而为了还原 D(x)D(x)D(x) 这个 2k−22k-22k−2 阶多项式,至少需要 2k−12k-12k−1 个点,因此必须满足 n≥2k−1n\ge 2k-1n≥2k−1。
即使满足 n≥2k−1n\ge 2k-1n≥2k−1,这个结果仍然存在一些问题,最重要的是门限由 kkk 变为了 2k−12k-12k−1。如果乘法计算会导致门限上升,经过有限次乘法后一定会超过 nnn 导致无法还原秘密。
经典的解决方法是一种“二次共享“的思想。我们的目标是基于上述信息构建一个 k−1k-1k−1 阶的多项式 C(x)C(x)C(x),其常数项为 d0=a⋅bd_0 = a\cdot bd0=a⋅b,其余项为随机数,且这个过程不能泄露 a,b,a⋅ba,b,a\cdot ba,b,a⋅b 的信息。
由拉格朗日插值法可知:
D(x)=∑i=1n(D(xi)⋅li(x))li(x)=∏j=1,j≠inx−xjxi−xj \begin{align} D(x) &= \sum_{i=1}^{n}(D(x_i) \cdot l_i(x)) \nonumber \\ \nonumber \\ l_i(x) &= \prod_{j=1,j\ne i}^n\frac{x-x_j}{x_i - x_j} \nonumber \end{align} D(x)li(x)=i=1∑n(D(xi)⋅li(x))=j=1,j=i∏nxi−xjx−xj
则有 a⋅b=d0=D(0)=∑i=1n(D(xi)⋅li(0))a\cdot b =d_0 = D(0) = \sum_{i=1}^{n}(D(x_i) \cdot l_i(0))a⋅b=d0=D(0)=∑i=1n(D(xi)⋅li(0))。
由于横坐标是固定且公开的,li(0)l_i(0)li(0) 也可以公开计算得到。
D(xi)D(x_i)D(xi) 由参与方 PiP_iPi 持有,这时每个参与方对自己的 D(xi)D(x_i)D(xi) 进行一次 (k,n)(k,n)(k,n) 门限的 Shamir 共享,得到一个多项式 fi(x)f_i(x)fi(x):
fi(x)=D(xi)+ri,1x+ri,2x2+⋯+ri,k−1xk−1 f_i(x) = D(x_i) + r_{i,1}x+r_{i,2}x^2+\cdots+r_{i,k-1}x^{k-1} fi(x)=D(xi)+ri,1x+ri,2x2+⋯+ri,k−1xk−1
其对应的 nnn 个点坐标(份额)为 (x1,fi(x1))\big(x_1,f_i(x_1)\big)(x1,fi(x1)),(x2,fi(x2))\big(x_2, f_i(x_2)\big)(x2,fi(x2)),⋯\cdots⋯,(xn,fi(xn))\big(x_n,f_i(x_n)\big)(xn,fi(xn))。
总共有 nnn 个这样的多项式,因此总共有 n2n^2n2 个点坐标,每个参与方拥有其中 nnn 个,例如参与方 P1P_1P1 拥有 (x1,f1(x1))\big(x_1,f_1(x_1)\big)(x1,f1(x1)),(x1,f2(x1))\big(x_1,f_2(x_1)\big)(x1,f2(x1)),⋯\cdots⋯,(x1,fn(x1))\big(x_1,f_n(x_1)\big)(x1,fn(x1))。
注意到:
∑i=1n(li(0)⋅fi(x))=∑i=1n(li(0)⋅D(xi))+∑i=1nli(0)⋅ri,1x+⋯+∑i=1nli(0)⋅ri,k−1xk−1=a⋅b+ri,1′x+ri,2′x2+⋯+ri,k−1′xk−1=C(x) \begin{align} \sum_{i=1}^n\big(l_i(0)\cdot f_i(x)\big) &= \sum_{i=1}^n\big(l_i(0)\cdot D(x_i)\big) + \sum_{i=1}^nl_i(0)\cdot r_{i,1}x + \cdots + \sum_{i=1}^nl_i(0)\cdot r_{i,k-1}x^{k-1} \nonumber \\ &= a\cdot b + r'_{i,1}x+r'_{i,2}x^2+\cdots+r'_{i,k-1}x^{k-1}\nonumber \\ &=C(x) \nonumber \end{align} i=1∑n(li(0)⋅fi(x))=i=1∑n(li(0)⋅D(xi))+i=1∑nli(0)⋅ri,1x+⋯+i=1∑nli(0)⋅ri,k−1xk−1=a⋅b+ri,1′x+ri,2′x2+⋯+ri,k−1′xk−1=C(x)
其中因为 ri,1r_{i,1}ri,1 是随机数,所以 ri,1′r'_{i,1}ri,1′ 也为随机数。因此可以看出上面这个多项式就是我们最终要构造的多项式 C(x)C(x)C(x),它是 fi(x)f_i(x)fi(x) 以 li(0)l_i(0)li(0) 为系数的一个线性组合。
我们找出了一种 C(x)C(x)C(x) 的构造方法,最后一步就是获得 C(x)C(x)C(x) 的 nnn 个点坐标,即秘密分享的份额。 由于对 nnn 个多项式进行线性组合,等价于在点坐标表示下对这 nnn 个多项式的点坐标进行线性组合。因此我们要获取的最终的多项式 C(x)C(x)C(x) 的 nnn 个点坐标为:
(x1,∑i=1n(li(0)⋅fi(x1))),(x2,∑i=1n(li(0)⋅fi(x2))),⋯ ,(xn,∑i=1n(li(0)⋅fi(xn))) \Big(x_1,\sum_{i=1}^n\big(l_i(0)\cdot f_i(x_1)\big)\Big), \Big(x_2,\sum_{i=1}^n\big(l_i(0)\cdot f_i(x_2)\big)\Big), \cdots , \Big(x_n,\sum_{i=1}^n\big(l_i(0)\cdot f_i(x_n)\big)\Big) (x1,i=1∑n(li(0)⋅fi(x1))),(x2,i=1∑n(li(0)⋅fi(x2))),⋯,(xn,i=1∑n(li(0)⋅fi(xn)))
显然每个参与方对应的点坐标(份额)可以直接在本地计算得出,这样 Shamir 秘密共享的乘法计算就完成了,计算结果 ⟦a⋅b⟧\llbracket a\cdot b\rrbracket[[a⋅b]] 就是上述 nnn 个点坐标(份额),仍然保持 (k,n)(k,n)(k,n) 门限。
Shamir 秘密共享的乘法计算看上去较为繁琐,但思想其实很简单,“二次共享“的本质可以理解为利用 Shamir 秘密共享加密 Shamir 秘密共享的解密过程,这个思想和同态加密的 Bootstrapping 类似,都是一种“同态解密“。在这个过程中,D(xi)D(x_i)D(xi) 可以看成每个参与方的“解密密钥“,将这些解密密钥利用 Shamir 秘密共享“加密“,进行“密文状态下的解密运算“,最终得到计算结果的“密文“,即 nnn 个份额。
四、复制秘密共享
复制秘密共享通常是指三方复制秘密共享,即三个参与方 P0,P1,P2P_0,P_1,P_2P0,P1,P2 参与计算。复制秘密共享也可以扩展至多方,其思想相同,可以参考[2]{[2]}[2]的实现,本文以三方复制秘密共享为例介绍。
复制秘密共享也是一种门限秘密共享,在三方复制秘密共享中门限通常为 222。复制秘密共享一般不涉及除法,因此可以在环上实现(例如 Z2k\mathbb{Z}_{2^k}Z2k),后续介绍中的运算默认都在环上进行(模 2k2^k2k)。
后续介绍中会经常提到某个参与方的上一个/下一个参与方,这里的顺序可以理解为模 333 环绕,例如 P0P_0P0 的上一个参与方是 P2P_2P2,P2P_2P2 的下一个参与方是 P0P_0P0,其他变量的下标序号也遵循这个规范。
复制秘密共享利用伪随机数生成器优化随机数在多个参与方上的生成,首先对这个优化作一个介绍。
1. 伪随机数生成器优化
一个伪随机数生成器 PRGPRGPRG,给定一个随机数种子 sss,可以生成看似随机的确定序列,即在不知道种子 sss 的取值时,PRGPRGPRG 每次生成的数字都可以看成随机数,而知道 sss 取值的情况下,PRG 生成的数字序列都是确定的。
在三方复制秘密共享中,每个参与方 PiP_iPi 本地生成一个随机数种子 sis_isi,并将其发送给上一个参与方,使得 P0P_0P0 拥有 (s0,s1)(s_0, s_1)(s0,s1),P1P_1P1 拥有 (s1,s2)(s_1, s_2)(s1,s2),P2P_2P2 拥有 (s2,s0)(s_2, s_0)(s2,s0)。
这样一来,任意两个参与方可以使用它们共有的随机数种子生成一个相同的随机数,例如 P0,P1P_0,P_1P0,P1 可以通过 PRG(s1)PRG(s_1)PRG(s1) 生成一个随机数 rrr,这样就避免了一次通信(不使用 PRGPRGPRG 时必须一方生成随机数后发送给另一方)。在安全多方计算中,通信开销非常影响性能,尤其在低带宽高时延网络环境下,减少一次通信有利于整体效率的提升。
利用这种技巧,三个参与方可以不通过任何通信交互构造出三个零和随机数 α0,α1,α2\alpha_0,\alpha_1,\alpha_2α0,α1,α2,其中 αi\alpha_iαi 只有 PiP_iPi 拥有,且三者满足 α0+α1+α2=0\alpha_0+\alpha_1+\alpha_2=0α0+α1+α2=0。构造方式如下:
-
利用伪随机数生成器,(P0,P1)(P_0,P_1)(P0,P1) 生成一个随机数 r1r_1r1,(P1,P2)(P_1,P_2)(P1,P2) 生成一个随机数 r2r_2r2,(P2,P0)(P_2,P_0)(P2,P0) 生成一个随机数 r0r_0r0。
-
PiP_iPi 在本地计算得到 αi=ri−ri+1\alpha_i = r_i - r_{i+1}αi=ri−ri+1。
显然可以验证 α0+α1+α2=(r0−r1)+(r1−r2)+(r2−r0)=0\alpha_0+\alpha_1+\alpha_2 = (r_0-r_1) + (r_1-r_2)+(r_2-r_0)=0α0+α1+α2=(r0−r1)+(r1−r2)+(r2−r0)=0。
不妨记上述步骤为 (α0,α1,α2)=PRGShare(0)(\alpha_0,\alpha_1,\alpha_2)=PRGShare(0)(α0,α1,α2)=PRGShare(0)。
2. 秘密分发
三方复制秘密共享的秘密分发会使用到伪随机数生成器。不妨设待共享的秘密 xxx 由 P0P_0P0 持有,三个参与方计算 (α0,α1,α2)=PRGShare(0)(\alpha_0,\alpha_1,\alpha_2)=PRGShare(0)(α0,α1,α2)=PRGShare(0),随后三个参与方分别计算三个份额:x0=α0+xx_0=\alpha_0 + xx0=α0+x,x1=α1x_1 = \alpha_1x1=α1,x2=α2x_2=\alpha_2x2=α2。
参与方 PiP_iPi 将份额 xix_ixi 发送给上一个参与方 Pi−1P_{i-1}Pi−1 完成秘密分发,使得 P0P_0P0 拥有 (x0,x1)(x_0, x_1)(x0,x1),P1P_1P1 拥有 (x1,x2)(x_1, x_2)(x1,x2),P2P_2P2 拥有 (x2,x0)(x_2, x_0)(x2,x0),即 ⟦x⟧=((x0,x1),(x1,x2),(x2,x0))\llbracket x\rrbracket = \big((x_0, x_1),(x_1, x_2),(x_2, x_0)\big)[[x]]=((x0,x1),(x1,x2),(x2,x0))。
易证 x=x0+x1+x2x=x_0+x_1+x_2x=x0+x1+x2。可以看出任意两个参与方都可以还原秘密 xxx,因此这是一个 (2,3)(2,3)(2,3) 门限秘密共享。
3. 秘密重建
三方复制秘密共享在重建秘密 xxx 时,每个参与方 PiP_iPi 将 xix_ixi 发送给下一个参与方即可。这样一来所有参与方都有拥有完整的 (x0,x1,x2)(x_0,x_1,x_2)(x0,x1,x2),从而还原秘密。
在重建时可以指定在参与方 PiP_iPi 处重建秘密,只需让 Pi−1P_{i-1}Pi−1 将 xi−1x_{i-1}xi−1 发送给 PiP_iPi 即可。
4. 加法运算
对于两个在三方复制秘密共享下的秘密 ⟦x⟧\llbracket x\rrbracket[[x]] 和 ⟦y⟧\llbracket y\rrbracket[[y]],要计算 ⟦z⟧=⟦x⟧+⟦y⟧\llbracket z\rrbracket = \llbracket x\rrbracket + \llbracket y\rrbracket[[z]]=[[x]]+[[y]],只需每个参与方 PiP_iPi 在本地计算 (zi,zi+1)=(xi+yi,xi+1+yi+1)(z_i,z_{i+1})=(x_i+y_i,x_{i+1}+y_{i+1})(zi,zi+1)=(xi+yi,xi+1+yi+1) 即可。
5. 乘法运算
对于两个在三方复制秘密共享下的秘密 ⟦x⟧\llbracket x\rrbracket[[x]] 和 ⟦y⟧\llbracket y\rrbracket[[y]],要计算 ⟦z⟧=⟦x⟧⋅⟦y⟧\llbracket z\rrbracket = \llbracket x\rrbracket \cdot \llbracket y\rrbracket[[z]]=[[x]]⋅[[y]],首先可以观察到:
z=x⋅y=(x0+x1+x2)⋅(y0+y1+y2)=x0⋅(y0+y1)+x1⋅y0+x1⋅(y1+y2)+x2⋅y1+x2⋅(y2+y0)+x0⋅y2 \begin{align} z =x\cdot y &= (x_0+x_1+x_2) \cdot (y_0+y_1+y_2) \nonumber \\ &= x_0 \cdot (y_0+y_1) + x_1 \cdot y_0 \\ &+ x_1 \cdot (y_1 + y_2) + x_2 \cdot y_1 \\ &+ x_2 \cdot (y_2 + y_0) + x_0 \cdot y_2 \end{align} z=x⋅y=(x0+x1+x2)⋅(y0+y1+y2)=x0⋅(y0+y1)+x1⋅y0+x1⋅(y1+y2)+x2⋅y1+x2⋅(y2+y0)+x0⋅y2
注意上述等式中的 (1)(2)(3)(1)(2)(3)(1)(2)(3) 行的内容均可由三个参与方分别在本地计算,即 PiP_iPi 可以在本地计算 zi′=xi⋅(yi+yi+1)+xi+1⋅yiz_i'=x_i \cdot (y_i + y_{i+1}) + x_{i+1} \cdot y_izi′=xi⋅(yi+yi+1)+xi+1⋅yi。
这样一来我们似乎没有进行任何通信交互就得到了乘法运算的结果,但仍然存在两个问题。一是 zi′z_i'zi′ 并非完全随机,其取值依赖于输入数据;二是每个参与方 PiP_iPi 只拥有一个份额 zi′z_i'zi′,不满足三方复制秘密共享 (2,3)(2,3)(2,3) 门限共享的规范,无法进行后续乘法计算。
解决办法仍然是利用伪随机数生成器得到 (α0,α1,α2)=PRGShare(0)(\alpha_0,\alpha_1,\alpha_2)=PRGShare(0)(α0,α1,α2)=PRGShare(0),随后每个参与方 PiP_iPi 在本地计算 zi=zi′+αiz_i=z_i'+\alpha_izi=zi′+αi(解决随机性),并将 ziz_izi 发送给上一个参与方 Pi−1P_{i-1}Pi−1(解决份额不足),最终得到 ⟦z⟧=((z0,z1),(z1,z2),(z2,z0))\llbracket z\rrbracket = \big((z_0, z_1),(z_1, z_2),(z_2, z_0)\big)[[z]]=((z0,z1),(z1,z2),(z2,z0))。
可以看出三方复制秘密共享在进行秘密分发、秘密重建和乘法运算时都只需要一轮通信,进行加法运算不需要通信,在不合谋的三方半诚实敌手安全模型下,效率极高,是最常用的秘密共享技术之一。
参考文献
-
[1] Adi Shamir. 1979. How to share a secret. Commun. ACM 22, 11 (Nov. 1979), 612–613. https://doi.org/10.1145/359168.359176
-
[2] A. Baccarini, M. Blanton, and C. Yuan, ‘Multi-party replicated secret sharing over a ring with applications to privacy-preserving machine learning’, Proceedings on Privacy Enhancing Technologies, 2023, doi: 10.56553/popets-2023-0035.
本文为作者在学习相关知识时的一种记录,便于以后的回顾。作者并没有系统地学习过密码学,因此在表述上可能会存在不严谨甚至出错的地方,文章仅供参考,欢迎大家与我交流,一起进步!
其他平台:
- 知乎(Totoro):https://www.zhihu.com/people/totoro-14-60
- B站(Totoro_134):https://space.bilibili.com/279377771
- Github(Totoro134):https://github.com/Totoro134
- 公众号(知识长生所)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)