1 概念
- 混淆电路是一种密码学协议,以实现安全多方计算(MPC)。场景是当多个通信方需要共同输入数据,然后通过同一个函数计算出一个结果,但是,各个通信方都不允许其他人知道自己的输入是什么。混淆电路就能很好地解决这个问题。
- 补充:可计算函数都可转化为电路的实现:加、比较、乘法等。电路是由门(gate)组成,如与门、非门、或门、与非门等。
- 混淆电路通过加密和扰乱电路值来掩盖真实的输入信息,加密和扰乱是以门为单位,每个门都有一张真值表。
- 混淆电路(GC) = 不经意传输(OT) + 逻辑电路
2 流程
本文以与门为例介绍混淆电路的算法流程。Alice和Bob两方分别拥有数据 X X X和 Y Y Y(0或1),现在希望双方都不知道对方数据的情况下,计算出逻辑与的结果 Z Z Z。
Step 1:Alice生成混淆电路
首先,Alice将目标函数转化为布尔电路,然后生成一张与门的 真值表(true table):
然后,随机生成6个数
X
0
,
X
1
,
Y
0
,
Y
1
,
Z
0
,
Z
1
X_0, X_1, Y_0, Y_1, Z_0, Z_1
X0,X1,Y0,Y1,Z0,Z1对真值表进行替换。注:
X
1
X_1
X1表示替换
X
=
1
X=1
X=1的位置,其他同理。于是有了下面这张 替换表:
之后,Alice对替换表中的
Z
Z
Z进行连续两次对称加密(加密密钥和解密密钥相同)。如下图,加密密钥则是两个输入
X
,
Y
X, Y
X,Y,得到加密表:
然后,打乱各行,使加密表内容与行号无关(这里我交换了第2和第3行的顺序),最终得到 混淆表(garbled table)。 这也就是混淆电路中“混淆”二字的由来!
Step 2:Alice和Bob进行通信
Alice将自己的输入
X
=
n
X=n
X=n替换为为第一步生成的随机数
X
n
X_n
Xn,发送给Bob,这样Bob就无从知晓Alice的真是输入到底是多少了。
然后,Bob也需要将手里的真实输入替换为第一步生成的随机数,怎么实现?通过不经意传输(OT)协议,从Alice手里获取对应的替换值
Y
1
/
Y
0
Y_1/Y_0
Y1/Y0。注意!因为采用了1-out-of-2 OT协议,所以Bob只能取到
Y
1
,
Y
0
Y_1, Y_0
Y1,Y0中的其一,并且Alice无从知晓Bob到底取走了哪个,从而无法知道Bob手里的真实值是多少。
随后,Alice也将混淆表发送给Bob进行后续的计算。
Step 3:Bob计算混淆电路
Alice和Bob完成上述的通信后(Alice替换真实值发给Bob,Bob从Alice手里取到对应替换值,Alice将混淆表发给Bob),Bob尝试进行电路解密。假设Alice真实输入是0,Bob真实输入是1,那么目前Bob已知的信息有 X 0 , Y 1 X_0, Y_1 X0,Y1两个数据。使用这两个值,对混淆表进行对称密钥解密,最终,只有第3行是可以解密出结果的!也就是 Z 0 Z_0 Z0。注意,这里解密出的 Z 0 Z_0 Z0仍是替换值,而只有Alice才知道替换的关系。
Step 4:Alice和Bob共享计算结果
Bob分享解密后的结果 Z 0 Z_0 Z0给Alice,Alice知道替换值与原始值的替换关系,所以可以快速替换回真实值,并且可以将最终的真实结果分享给Bob。
通过以上4个步骤,就在双方均不知道对方数据的情况下,顺利实现了共同计算同一个函数的功能。
总结
Alice端会生成布尔电路已经对应的真值表、替换表、加密表以及混淆表,发送给Bob的是替换值和混淆表,然后Bob通过OT协议拿到自己的替换值,从而对混淆表中的值进行解密。最后,将解密结果共享给Alice得到真值结果,最后双方共享真值结果。
参考资料:
混淆电路简介(GC)
MPC系列-混淆电路