Shamir门限方案是用来解决这样一个问题:有
n
n
n个人,共同拥有一个秘密
S
S
S,只要有
k
(
k
<
n
)
k(k<n)
k(k<n)个人在场,则可以知道这个秘密
S
S
S,反之只要在场的人数少于k,则无法恢复秘密
S
S
S。这样的方案叫做
(
k
,
n
)
(k,n)
(k,n)门限方案。
由Adi Shamir在1979年的论文How to Share a Secret中提出,该方案的时间复杂度为
O
(
n
log
2
n
)
O(n \log ^2n)
O(nlog2n).
该方案基于多项式插值:给定k个横坐标不同的点
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
k
,
y
k
)
(x_1,y_1),(x_2,y_2),\cdots,(x_k,y_k)
(x1,y1),(x2,y2),⋯,(xk,yk)可以完全确定一个
k
−
1
k-1
k−1次多项式
q
(
x
)
q(x)
q(x)使得
q
(
x
i
)
=
y
i
q(x_i)=y_i
q(xi)=yi对于所有
i
∈
[
1
,
k
]
i \in [1,k]
i∈[1,k]成立。
给定一个秘密
S
S
S,不失一般性,假设
S
S
S是一个数字。我们随机选择一个
k
−
1
k-1
k−1次多项式
q
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
+
⋯
+
a
k
−
1
x
k
−
1
q(x)=a_0+a_1x+a_2x^2+\cdots+a_{k-1}x^{k-1}
q(x)=a0+a1x+a2x2+⋯+ak−1xk−1,并且有
S
=
a
0
S=a_0
S=a0。显然,我们只需要随机选择
{
a
1
,
a
2
,
⋯
,
a
k
−
1
}
\{a_1,a_2,\cdots,a_{k-1}\}
{a1,a2,⋯,ak−1}即可确定
q
(
x
)
q(x)
q(x)。首先确定
n
n
n个不同的数
{
x
1
,
x
2
,
⋯
,
x
n
}
\{x_1,x_2,\cdots,x_n\}
{x1,x2,⋯,xn},然后计算:
y
1
=
q
(
x
1
)
,
y
2
=
q
(
x
2
)
,
⋯
,
y
n
=
q
(
x
n
)
y_1=q(x_1),y_2=q(x_2),\cdots,y_n=q(x_n)
y1=q(x1),y2=q(x2),⋯,yn=q(xn).
每个人保存一个点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi),显然,只要有任意
k
k
k个点,我们就可以快速计算出
q
(
x
)
q(x)
q(x),从而计算
S
=
q
(
x
0
)
S=q(x_0)
S=q(x0).
使用Shamir门限方案隐私求和
假设有
n
n
n个人需要执行隐私求和,也就是知道了
n
n
n个人的和,但是不暴露其他任何人的私有数据。
在开始之前,首先,大家协商的n个不同的数
{
x
1
,
x
2
,
⋯
,
x
n
}
\{x_1,x_2,\cdots,x_n\}
{x1,x2,⋯,xn}作为公共参数,求和阶段至少需要的人数为
k
k
k。
对于每一个人
p
i
p_i
pi,其私有数据为
d
i
d_i
di。
p
i
p_i
pi随机选择
k
−
1
k-1
k−1个数,得到一个多项式
q
i
(
x
)
=
d
i
+
r
i
,
1
x
+
r
i
,
2
x
2
+
⋯
+
r
i
,
k
−
1
x
k
−
1
q_i(x)=d_i+r_{i,1}x+r_{i,2}x^2+\cdots+r_{i,k-1}x^{k-1}
qi(x)=di+ri,1x+ri,2x2+⋯+ri,k−1xk−1.然后计算
y
i
,
1
=
q
i
(
x
1
)
,
y
i
,
2
=
q
i
(
x
2
)
,
⋯
,
y
i
,
n
=
q
i
(
x
n
)
y_{i,1}=q_i(x_1),y_{i,2}=q_i(x_2),\cdots,y_{i,n}=q_i(x_n)
yi,1=qi(x1),yi,2=qi(x2),⋯,yi,n=qi(xn).计算完成后,将
y
i
,
j
y_{i,j}
yi,j发送给
p
j
p_j
pj。
p
i
p_i
pi显然,将会收到
n
−
1
n-1
n−1个数
y
k
,
i
(
k
∈
[
1
,
n
]
,
k
≠
i
)
y_{k,i}(k \in [1,n], k\neq i)
yk,i(k∈[1,n],k=i)。然后,
p
i
p_i
pi计算
y
i
=
∑
k
=
1
n
y
k
,
i
y_i=\sum_{k=1}^{n}y_{k,i}
yi=∑k=1nyk,i。
显然,从全局来看,我们构造了一个多项式
q
(
x
)
=
∑
i
=
1
n
q
i
(
x
)
q(x)=\sum_{i=1}^{n}q_i(x)
q(x)=∑i=1nqi(x)。
p
i
p_i
pi拥有的值为
y
i
=
q
(
x
i
)
y_i=q(x_i)
yi=q(xi)。
现在,我们需要至少
k
k
k个人将他们的
y
y
y公布出来,我们就可以计算多项式
q
(
x
)
q(x)
q(x),从而计算
n
n
n个隐私数据的和
q
(
0
)
=
∑
i
=
1
n
d
i
q(0)=\sum_{i=1}^{n}d_i
q(0)=∑i=1ndi.
证明:
q
(
x
)
=
∑
i
=
1
n
q
i
(
x
)
=
∑
i
=
1
n
d
i
+
r
i
,
1
x
+
r
i
,
2
x
2
+
⋯
+
r
i
,
k
−
1
x
k
−
1
=
∑
i
=
1
n
d
i
+
∑
i
=
1
n
r
i
,
1
x
+
⋯
+
∑
i
=
1
n
r
i
,
k
−
1
x
k
−
1
=
d
+
r
1
x
+
r
2
x
2
+
⋯
+
r
k
x
k
−
1
\begin{aligned} q(x)&=\sum_{i=1}^{n}q_i(x)\\ &=\sum_{i=1}^{n}d_i+r_{i,1}x+r_{i,2}x^2+\cdots+r_{i,k-1}x^{k-1}\\ &=\sum_{i=1}^{n}d_i+\sum_{i=1}^{n}r_{i,1}x+\cdots+\sum_{i=1}^{n}r_{i,k-1}x^{k-1}\\ &=d+r_1x+r_2x^2+\cdots+r_kx^{k-1} \end{aligned}
q(x)=i=1∑nqi(x)=i=1∑ndi+ri,1x+ri,2x2+⋯+ri,k−1xk−1=i=1∑ndi+i=1∑nri,1x+⋯+i=1∑nri,k−1xk−1=d+r1x+r2x2+⋯+rkxk−1
所以
q
(
x
)
q(x)
q(x)是一个
k
−
1
k-1
k−1次多项式。
y
i
=
q
(
x
i
)
=
∑
i
=
1
n
q
i
(
x
i
)
=
∑
k
=
1
n
y
i
,
k
y_i=q(x_i)=\sum_{i=1}^{n}q_i(x_i)=\sum_{k=1}^{n}y_{i,k}
yi=q(xi)=∑i=1nqi(xi)=∑k=1nyi,k。
即
(
x
i
,
y
i
(x_i,y_i
(xi,yi是多项式
q
(
x
)
q(x)
q(x)上的一个点,故满足Shamir门限方案的假设。