什么是MPC?

MPC 的中文是“安全多方计算”,英文全称为 Secure Multi-Party Computation,首字母简写为 SMPC 或 MPC。其中,业界更常用的是 MPC。

MPC 是隐私计算技术中的一种,它是一个描述由多个参与方共同协作完成隐私计算的密码学原语概念。

顾名思义,“安全多方计算”是在描述一种“安全的、在多方之间进行的计算”。先说“计算”这个词,它是一个抽象的概念,我们可以将其具象化为任何数学运算,例如数学的加减乘除四则运算。而“多方计算”则是由多方共同参与来做数学运算。为了方便理解,我们以桌游扑克牌游戏来模拟几个场景:

场景一:总共有 3 个同学,每个同学各自从扑克牌中抽取一张牌,然后游戏的规则是要求得这三个同学手里的牌面数字之和。

场景二:总共有 5 个同学,每个同学各自从扑克牌中抽取一张牌,然后游戏的规则是要对这三个同学手里的牌面数字比较大小。

以上这 2 个场景例子都非常简单,场景一我们就可以称之为是一个“三方(求和)计算”,场景二可以称之为是一个“五方(比大小)计算”。这两个场景都是“多方计算”这个抽象概念的一个具体的实例。在现实生活中,以上这两个“多方计算”的例子很容易完成并得到想要的计算结果——只需要让每位同学把自己抽到的牌亮出来,然后对牌面的数字进行求和或比大小即可。

然而,这仅仅是因为我们在以上两个“多方计算”的例子没有提出更高的要求而已。假如我们的游戏规则强制要求每位同学抽到的牌不可以公开给其他任何人,那么我们该如何完成上面这两个“多方计算”游戏并求得正确的结果呢?

这个新增的规则,其实就是对“多方计算”提出了更高的“安全”要求——不仅要得到正确的结果,还要保证过程中参与计算的原始数据的隐私安全。

作为一个机灵鬼,你肯定想到了让桌游裁判(或称为“法官”)来完成这个任务。是的,现实的桌游游戏中,确实是常有一个专职角色来做这样的工作,他有特权,所有人都信任他并把底牌(或身份)单独展示给他看,并由他完成这个游戏的任务,得出计算结果。然而,这个裁判的角色并不能达到上述的“原始数据隐私安全”要求——因为裁判作为一个第三方介入了游戏,他知道了所有人的底牌,游戏结果的公平性、准确性和玩家隐私的安全性完全依赖于裁判。用区块链或 Web3 常用的术语来描述,这个裁判就是一个中心化的、无法对其免除信任的节点。无论这个裁判是现实生活中的肉身个人,还是一台电脑、服务器或机器人,这个中心化的问题都始终存在、无法根除。如果裁判作弊、偏袒或被黑客攻击,那么游戏要求的结果的公平性、准确性和安全性都是无法保证的。

至此,我们发现,当我们对这两个”多方计算”的游戏提出更高的“安全”要求时,在大家的现实生活中、常识范围内已经找不到完美解决方案了。

万幸的是,我们有数学,我们有密码学。这些在现实生活中以及常识范畴内无法解决的问题,在抽象的数学和密码学中却能找到完美的解决方案,尽管他们看起来非常反常识、反直觉,但数学家和密码学家们却可以用无可辩驳的数学公式证明这是真的。不仅如此,密码学家们还专门针对这类问题提出了一个密码学研究方向,并取名叫 MPC(安全多方计算)。MPC 并不是指代某种具体的算法或某个具体的协议,而是根据目标要求描述了一组特性集合,只要满足了这些特性,都可以称之为是 MPC。这些特性包括以下四点:

  • 多方参与

    参与计算的必须是大于或等于两方。这是 MPC 的最基本的要求和特征,否则就不能称之为多方计算。与之对应的,是仅由一方独立进行的单方计算。

  • 结果准确

    计算结果必须是数学可证明的、准确的。无论使用了什么算法,都必须保证这个多方参与的计算结果一定是准确无误的。

  • 公平、免信任、去中心化

    1. 计算过程仅在参与计算的多方之间进行,不依赖于任何第三方;

    2. 参与计算的各方身份角色完全对等,没有任何一方有特权,完全去中心化。

  • 隐私安全

    计算过程中,各方的原始数据不会泄露给任何其他方,更不会泄露给任何第三方。

MPC 的实现技术包括了同态加密(Homomorphic Encryption)、混淆电路(Garbled Circuit)、不经意传输(Oblivious Transfer)和秘密分享(Secret Sharing)等,其中我们重点解释一下同态加密,因为这将有助于理解 MPC 背后的实现原理,有助于本文行文逻辑流畅。

同态加密

同态加密(Homomorphic Encryption)是另一个密码学原语,同态加密技术被誉为隐私计算技术 “皇冠上的明珠”,这足以说明其开创性的地位。同态加密是指这样一种加密函数,对明文进行加法和乘法运算然后再加密,其运算结果与加密后对密文进行相应的运算结果是等价的。这个定义有点绕,我们可以直接看一个加法同态的数学表达式:

En(x+y+z) = En(x) ⊕ En(y) ⊕ En(z) 
或 
x+y+z = Dec( En(x) ⊕ En(y) ⊕ En(z) )

其中 En 是加密运算,Dec 是解密运算,⊕ 表示在密文域上的运算。公式解释如下:

x, y, z 是三个明文数字。
如果我们将其直接相加,得到结果 x+y+z ;
如果我们将其分别加密,分别得到三个密文 En(x)、En(y) 和 En(z),然后在这三个密文基础上做加法运算,再将运算结果进行解密,得到的结果也是 x+y+z;
即,明文直接相加得到的结果“等于”密文相加得到的结果再解密。

同态加密的这个“在密文基础上进行运算仍然得到与明文运算相同的正确结果”的性质可被认为是实现 MPC 中隐私安全特性的关键基础,而这个特性却是很反常识、反直觉的,虽然其真实地存在于伟大的数学里,但我们在现实生活中却很难找到可以类比的例子。不过,对于大多数人而言,在理解 MPC 时,不需要完全理解其背后的数学原理,只需要记住其四个关键特性即可:多方参与、原始数据隐私安全、结果准确以及去中心化。

在了解完 MPC 的概念定义后,我们再回到上面游戏的例子中。可以发现,MPC 其实就是对那两个游戏任务的解决方案提出的要求进行定性描述和概括抽象,至于如何具体实现这个要求,则是算法和协议设计层面的工作。一般来说,每个具体的场景都需要设计一套专有的算法和协议来实现目标,而并非是使用一套通用的算法和协议解决所有的安全多方计算需求。

下面我们将以本文开头模拟的“游戏场景一”中的“三方(求和)计算”为例,分别为其设计一个“不安全多方计算”解决方案和一个“安全多方计算”解决方案来试图达成游戏要求,并对这两个方案进行对比,从而更加清晰地理解的 MPC 的特性。

游戏场景:有 Party A、Party B 和 Party C 三个同学,他们各自抽到的秘密的底牌数字分别是 5、3 和 9

游戏要求:在所有人的秘密底牌数字不公开给其他人的前提下,求得三人的底牌数字之和。

“不安全”多方计算方案

“不安全”三方求和计算
“不安全”三方求和计算

上图描述了一种有裁判(Party D )介入的多方计算方法:A、B 和 C 三方必须把各自的底牌数字(秘密)告诉裁判(Party D),然后由裁判(Party D)将这三方的数字求和运算得到结果——17,再把这个结果返回给 A、B 和 C。这个计算方法引入了必须信任的第三方,且会被迫泄露秘密给第三方,并不满足公平、免信任和安全性的要求。为了解决这些问题,我们来看看安全多方计算方案。

安全多方计算方案

安全三方求和计算
安全三方求和计算

上图描述了一种真正的安全多方计算方法:A、B 和 C 三方各自首先将自己的底牌(秘密)进行同态加密处理,然后将分别将密文广播出去,其他任何人都可以接收到。于是,各方手里就都有了自己和其他两方的密文,共计三份。由于这种加密是单向的,不可被反向解密,因此他们三人都依然不知道其他人的底牌(秘密)是多少。接下来,各方各自将自己已经掌握的三份全部密文进行求和运算,并将这一运算结果进行解密,即可以得到正确的结果——17

用同态加密公式表达和解释如下:

De( En(5) ⊕ En(3) ⊕ En(9) ) = 17 = 5 + 3 + 9

ABC 三方对各自手里 539 先加密,然后把自己的密文共享出去,同时收到其他人的密文,在每个人手里就都得到三个密文后,ABC 三方再分别对得到的三个密文求和,再对求和得到的结果进行解密,即可得到求和结果 17,这与对 539 的明文Z直接进行求和运算的结果是一样的。

与前述“不安全”三方求和方案对比,这个新的三方求和方案没有引入任何第三方,各方分别在不依赖第三方的前提下独立计算独立得到结果,可以保证全过程中各方的底牌数字(秘密)不会泄露给任何人,且同态加密可以从密码学层面保证最终的计算结果一定是正确的,这就完全满足了 MPC 的四项特征要求,因此可以把这个计算过程称之为是一个 MPC。

总结

MPC 是个抽象的概念,其描述了一组在多方联合计算场景下的特性集合,无论使用什么协议或算法,只要符合这些特性,都可称之为 MPC。