相关随机数
在安全多方计算中,我们通常需要生成一些具有相关性的随机数,比如Beaver三元组。本文介绍如何在不借助第三方的情况下,快速生成三个随机数 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3满足 x 1 + x 2 + x 3 = 0 x_1+x_2+x_3=0 x1+x2+x3=0,每一方拥有一个随机数,但是除了关系外,不知道其他人的随机数的任何信息。
布尔相关随机数
我们首先讨论布尔随机数的生成,也就是 x i ∈ 0 , 1 x_i \in {0,1} xi∈0,1。生成的随机数满足 x 1 ⊕ x 2 ⊕ x 3 = 0 x_1\oplus x_2 \oplus x_3=0 x1⊕x2⊕x3=0.
假设三个参与者分别为 P 1 , P 2 , P 3 P_1,P_2,P_3 P1,P2,P3.下面介绍两种方法。
方法一:信息论安全的相关随机数生成
1、
P
1
,
P
2
,
P
3
P_1,P_2,P_3
P1,P2,P3分别在本地随机采样3个随机数
r
1
,
r
2
,
r
3
r_1,r_2,r_3
r1,r2,r3;
2、
P
1
P_1
P1将
r
1
r_1
r1发送给
P
2
P_2
P2;
P
2
P_2
P2将
r
2
r_2
r2发送给
P
3
P_3
P3;
P
3
P_3
P3将
r
3
r_3
r3发送给
P
1
P_1
P1;
3、
P
1
P_1
P1计算
x
1
=
r
3
⊕
r
1
x_1=r_3\oplus r_1
x1=r3⊕r1;
P
2
P_2
P2计算
x
2
=
r
1
⊕
r
2
x_2=r_1\oplus r_2
x2=r1⊕r2;
P
3
P_3
P3计算
x
3
=
r
2
⊕
r
3
x_3=r_2 \oplus r_3
x3=r2⊕r3.
证明:
x
1
⊕
x
2
⊕
x
3
=
(
r
3
⊕
r
1
)
⊕
(
r
1
⊕
r
2
)
⊕
(
r
2
⊕
r
3
)
=
0
x_1 \oplus x_2 \oplus x_3 = (r_3 \oplus r_1)\oplus (r_1\oplus r_2)\oplus (r_2\oplus r_3)=0
x1⊕x2⊕x3=(r3⊕r1)⊕(r1⊕r2)⊕(r2⊕r3)=0.
方法二:计算安全的快速生成
方法一虽然是信息论安全的,但是每次生成都需要传输一个元素。方法二通过伪随机数生成器,使得在初始化后,每次生成都不在需要传输信息,减少了协议的通信开销。
假设使用的伪随机数生成器用 F ( k , i ) F(k,i) F(k,i)来表示。其中 k k k表示密钥, i i i表示计数(第几次调用)。由于一般的伪随机生成器只需要一个随机种子作为输入,可以使用hash函数将 k , i k,i k,i映射为随机种子。
初始化:
1、
P
1
P_1
P1生成
k
1
k_1
k1;
P
2
P_2
P2生成
k
2
k_2
k2;
P
3
P_3
P3生成
k
3
k_3
k3;
2、
P
1
P_1
P1将
k
1
k_1
k1发送给
P
2
P_2
P2;
P
2
P_2
P2将
k
2
k_2
k2发送给
P
3
P_3
P3;
P
3
P_3
P3将
k
3
k_3
k3发送给
P
1
P_1
P1。
也就是说
P
1
P_1
P1拥有
k
3
,
k
1
k_3,k_1
k3,k1,
P
2
P_2
P2拥有
k
1
,
k
2
k_1,k_2
k1,k2,
P
3
P_3
P3拥有
k
2
,
k
3
k_2,k_3
k2,k3.
生成相关随机数:
1、
P
1
P_1
P1计算
x
1
=
F
(
k
3
,
i
)
⊕
K
(
k
1
,
i
)
x_1=F(k_3,i)\oplus K(k_1,i)
x1=F(k3,i)⊕K(k1,i);
2、
P
2
P_2
P2计算
x
2
=
F
(
k
1
,
i
)
⊕
K
(
k
2
,
i
)
x_2=F(k_1,i) \oplus K(k_2,i)
x2=F(k1,i)⊕K(k2,i);
3、
P
3
P_3
P3计算
x
3
=
F
(
k
2
,
i
)
⊕
K
(
k
3
,
i
)
x_3=F(k_2,i)\oplus K(k_3,i)
x3=F(k2,i)⊕K(k3,i);
当输入相同的时候,伪随机数的输出也相同,所以显然
x
1
⊕
x
2
⊕
x
3
=
0
x_1\oplus x_2\oplus x_3=0
x1⊕x2⊕x3=0.
算术相关随机数
有时候,我们需要的随机数并不是布尔值,而是一个整数,这时候我们需要将上面的方法推广到整数上。
方法一:信息论安全
1、
P
1
,
P
2
,
P
3
P_1,P_2,P_3
P1,P2,P3分别在本地随机采样3个随机数
r
1
,
r
2
,
r
3
r_1,r_2,r_3
r1,r2,r3;
2、
P
1
P_1
P1将
r
1
r_1
r1发送给
P
2
P_2
P2;
P
2
P_2
P2将
r
2
r_2
r2发送给
P
3
P_3
P3;
P
3
P_3
P3将
r
3
r_3
r3发送给
P
1
P_1
P1;
3、
P
1
P_1
P1计算
x
1
=
r
3
−
r
1
x_1=r_3 - r_1
x1=r3−r1;
P
2
P_2
P2计算
x
2
=
r
1
−
r
2
x_2=r_1- r_2
x2=r1−r2;
P
3
P_3
P3计算
x
3
=
r
2
−
r
3
x_3=r_2 - r_3
x3=r2−r3.
方法二:计算安全
初始化:
1、
P
1
P_1
P1生成
k
1
k_1
k1;
P
2
P_2
P2生成
k
2
k_2
k2;
P
3
P_3
P3生成
k
3
k_3
k3;
2、
P
1
P_1
P1将
k
1
k_1
k1发送给
P
2
P_2
P2;
P
2
P_2
P2将
k
2
k_2
k2发送给
P
3
P_3
P3;
P
3
P_3
P3将
k
3
k_3
k3发送给
P
1
P_1
P1。
也就是说
P
1
P_1
P1拥有
k
3
,
k
1
k_3,k_1
k3,k1,
P
2
P_2
P2拥有
k
1
,
k
2
k_1,k_2
k1,k2,
P
3
P_3
P3拥有
k
2
,
k
3
k_2,k_3
k2,k3.
生成相关随机数:
1、
P
1
P_1
P1计算
x
1
=
F
(
k
3
,
i
)
−
K
(
k
1
,
i
)
x_1=F(k_3,i)- K(k_1,i)
x1=F(k3,i)−K(k1,i);
2、
P
2
P_2
P2计算
x
2
=
F
(
k
1
,
i
)
−
K
(
k
2
,
i
)
x_2=F(k_1,i) - K(k_2,i)
x2=F(k1,i)−K(k2,i);
3、
P
3
P_3
P3计算
x
3
=
F
(
k
2
,
i
)
−
K
(
k
3
,
i
)
x_3=F(k_2,i)- K(k_3,i)
x3=F(k2,i)−K(k3,i);
容易验证上面两种方法生成的随机数满足 x 1 + x 2 + x 3 = 0 x_1+x_2+x_3=0 x1+x2+x3=0.
多方推广:n>3
有时候参与计算的参与者很多,所以我们在这里将上面的方法推广到多方的时候。
假设参与者为 P 0 , P 1 , ⋯ P n − 1 P_0,P_1,\cdots P_{n-1} P0,P1,⋯Pn−1.布尔随机数只需要将 − , + -,+ −,+换成 ⊕ \oplus ⊕即可。下标的加法和减法是在环 Z n \mathbb{Z}_n Zn中,也就是,如果大于等于 n n n,那么就减去 n n n,例如 P n = P 0 , P n + 1 = P 1 P_{n}=P_0,P_{n+1}=P_1 Pn=P0,Pn+1=P1;小于0则加上 n n n,例如 P − 1 = P n − 1 , P − 2 = P n − 2 P_{-1}=P_{n-1},P_{-2}=P_{n-2} P−1=Pn−1,P−2=Pn−2.
方法一的推广
1、
P
0
,
P
1
,
⋯
,
P
n
−
1
P_0,P_1,\cdots,P_{n-1}
P0,P1,⋯,Pn−1分别在本地随机生成一个随机数
r
0
,
r
1
,
⋯
,
r
n
−
1
r_0,r_1,\cdots,r_{n-1}
r0,r1,⋯,rn−1;
2、对于
P
j
P_j
Pj,将
r
j
r_j
rj发送给
P
j
+
1
P_{j+1}
Pj+1;
3、
P
j
P_j
Pj计算
x
j
=
r
j
−
1
−
r
j
x_j=r_{j-1}-r_j
xj=rj−1−rj;
证明:
∑
j
=
0
n
−
1
x
j
=
∑
j
=
0
n
−
1
(
r
j
−
1
−
r
j
)
=
∑
j
=
0
n
−
1
r
j
−
1
−
∑
j
=
0
n
−
1
r
j
=
0
\sum_{j=0}^{n-1}x_j=\sum_{j=0}^{n-1}(r_{j-1}-r_j)=\sum_{j=0}^{n-1}r_{j-1}-\sum_{j=0}^{n-1}r_j=0
∑j=0n−1xj=∑j=0n−1(rj−1−rj)=∑j=0n−1rj−1−∑j=0n−1rj=0.
方法二的推广
初始化:
1、
P
0
,
P
1
,
⋯
,
P
n
−
1
P_0,P_1,\cdots,P_{n-1}
P0,P1,⋯,Pn−1分别在本地随机生成一个随机数
k
0
,
k
1
,
⋯
,
k
n
−
1
k_0,k_1,\cdots,k_{n-1}
k0,k1,⋯,kn−1;
2、对于
P
j
P_j
Pj,将
k
j
k_j
kj发送给
P
j
+
1
P_{j+1}
Pj+1;
生成相关随机数:
P
j
P_j
Pj计算
x
j
=
F
(
k
j
−
1
,
i
)
−
F
(
k
j
,
i
)
x_j=F(k_{j-1},i)-F(k_j,i)
xj=F(kj−1,i)−F(kj,i).
参考文献
[1] Araki, Toshinori, et al. “High-throughput semi-honest secure three-party computation with an honest majority.” Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. 2016.