转换逻辑电路
遵照这个混淆电路的定义,双方能在互相不知晓对方数据的情况下计算某一函数。混淆电路要求这一函数能被逻辑电路表示,所以如何将要求函数转化为一个逻辑电路是关键的一步。
我们不妨以著名的百万富翁问题为例。在这个问题中,两个富翁Alice和Bob想在不知道对方财富值的情况下计算谁的财富值更高,所以他们需要求解的函数是比较大小,我们尝试将这一函数转化为电路。
逻辑电路
我们不妨认为Alex和Bob的财富是用二进制表示的一个整数
a
n
a
n
−
1
⋯
a
1
a_na_{n-1}\cdots a_1
anan−1⋯a1,
b
n
b
n
−
1
⋯
b
1
b_nb_{n-1}\cdots b_1
bnbn−1⋯b1,其中
a
i
,
b
i
∈
{
0
,
1
}
a_i,b_i\in\{0,1\}
ai,bi∈{0,1}。我们可以用归纳法来判断它们的大小。
我们定义变量
c
i
=
{
1
,
a
i
a
i
−
1
⋯
a
1
>
b
i
b
i
−
1
⋯
b
1
0
,
a
i
a
i
−
1
⋯
a
1
≤
b
i
b
i
−
1
⋯
b
1
c_i=\begin{cases}1,&a_ia_{i-1}\cdots a_1>b_ib_{i-1}\cdots b_1\\0,&a_ia_{i-1}\cdots a_1\leq b_ib_{i-1}\cdots b_1\end{cases}
ci={1,0,aiai−1⋯a1>bibi−1⋯b1aiai−1⋯a1≤bibi−1⋯b1
以及其初始值
c
1
=
0
c_1=0
c1=0 。在已知
a
i
,
b
i
,
c
i
a_i,b_i,c_i
ai,bi,ci的情况下,
c
i
+
1
c_{i+1}
ci+1可以做如下推导。
c
i
+
1
=
1
⇔
(
a
i
>
b
i
)
o
r
(
a
i
=
b
i
a
n
d
c
i
=
0
)
c_{i+1}=1\Leftrightarrow(a_i>b_i)\ or\ (a_i=b_i\ and\ c_i =0)
ci+1=1⇔(ai>bi) or (ai=bi and ci=0),可以转化成以下逻辑电路。
我们将上述电路封装成一个三个输入(
a
i
,
b
i
,
c
i
a_i,b_i,c_i
ai,bi,ci)一个输出(
c
i
+
1
c_{i+1}
ci+1)的模块> 。我们将
n
n
n个这样的模块串联起来,就完成了判断
a
i
a
i
−
1
⋯
a
1
>
b
i
b
i
−
1
⋯
b
1
a_ia_{i-1}\cdots a_1>b_ib_{i-1}\cdots b_1
aiai−1⋯a1>bibi−1⋯b1的电路。
在这个电路中,
c
n
+
1
c_{n+1}
cn+1为整个电路的输出。当输出是1时,
a
i
a
i
−
1
⋯
a
1
>
b
i
b
i
−
1
⋯
b
1
a_ia_{i-1}\cdots a_1>b_ib_{i-1}\cdots b_1
aiai−1⋯a1>bibi−1⋯b1成立。
总结
我们在这里成功地将一个比较大小的函数转化成了一个逻辑电路,但仅仅有电路还不够解决百万富翁问题。因为电路中每一根线的值都是明文的,所以Alice和Bob都能知道对方的财富值。
结合逻辑电路和之前提到的不经意传输,我们就可以得到混淆电路,并提供百万富翁问题 的一种解法。
附录
正文中提到的电路用到了多处取反,并不是最优的。通过观察,我们不难发现
c
i
+
1
=
a
i
⊕
[
(
a
i
⊕
c
i
)
∧
(
b
i
⊕
c
i
)
]
c_{i+1}=a_i\oplus[(a_i\oplus c_i)\wedge(b_i\oplus c_i)]
ci+1=ai⊕[(ai⊕ci)∧(bi⊕ci)] 。
所以我们可以将电路简化为: