本文目录导读:

这是一个非常专业且核心的问题,安全多方计算(Secure Multi-Party Computation,简称 MPC)的“协同”并非指大家物理上坐在一起计算,而是指多个互不信任的参与方,在各自持有私有数据的情况下,通过执行特定的密码学协议,共同完成一个计算任务,并且每个参与方除了计算结果外,无法获知其他方的任何额外信息。
它的核心是:“共同计算,但数据不出域”。
为了实现这种“协同”,MPC 主要依赖以下几种核心技术路线,它们像不同的“合作语言”,让各参与方在保护隐私的前提下完成协作。
核心实现技术(协同的“语言”)
-
秘密共享 (Secret Sharing) - 最直观的“分而治之”
- 协同方式:每个参与方把自己的私有数据(比如一个数字)切割成若干份随机的“碎片”,分发给其他参与方,任何单一参与方手中的碎片都是无意义的随机数,只有当足够数量的参与方(如超过半数)将各自的碎片拼在一起时,原始数据才能被恢复。
- 计算过程:各方利用自己手中的碎片,直接进行加法或乘法运算,要计算
A + B,每个参与方只需将自己手里的 A 碎片和 B 碎片相加,得到结果碎片,这些结果碎片组合起来就是A+B的正确结果,整个过程,没有人知道 A 或 B 具体是多少。 - 典型协议:Shamir 秘密共享、加性秘密共享。
-
混淆电路 (Garbled Circuit) - 最常用的“两方会话”
- 协同方式:将计算任务(比如比较两个数的大小)表示成一个由逻辑门(与、或、非)组成的布尔电路,一方(生成者)为电路中的每条导线和每个门生成一系列加密的“真值表”(即混淆电路),另一方(求值者)获取这个混淆电路,并用自己的输入以及通过一种称为“不经意传输”的技术从生成者那里获取的对应密钥,去逐门计算,最终得到结果。
- 计算过程:求值者像一个执行者,在不解密任何内部中间值的情况下,一步步执行加密后的电路,生成者提供了“加密蓝图”,但无法看到求值者的实际输入,只有结果被揭示。
- 典型场景:经典的姚氏百万富翁问题(两人比较谁更富有,而不透露具体财富)。
-
不经意传输 (Oblivious Transfer) - 核心的“选择接口”
- 协同方式:它是很多 MPC 协议的基础构件,本身也是一种协同,假设发送方有两条消息(m0, m1),接收方有一个选择比特(0 或 1),不经意传输允许接收方确切地收到他所选择的那一条消息(m0),但对另一条消息(m1)一无所知,发送方无法知道接收方选择了哪一条。
- 计算过程:这就像一个“黑箱”,接收方只能取出自己想要的,而发送方不知道取走了哪个,这在混淆电路中至关重要,用于将求值者的输入与电路连接起来。
-
同态加密 (Homomorphic Encryption) - 直接在密文上计算
- 协同方式:各方先使用一个共同的公钥加密自己的数据后发送出去,任何一方(或一个计算节点)可以直接对这些密文进行加法、乘法等代数运算,由于同态加密的特性,对密文运算的结果,解密后正好等于对原始明文进行相同运算的结果。
- 计算过程:计算过程完全在密文空间进行,所有人都可以参与计算,但只有拥有私钥的人(或所有参与方联合起来)才能解密看到最终结果,数据在计算过程中的安全等级最高(全加密状态),但计算效率相对较低。
协同流程(一个典型的 MPC 计算流程)
- 任务定义:所有参与方(P1, P2, ..., Pn)共同确认要计算的函数
f(x1, x2, ..., xn)。“计算所有员工的平均工资”,P1 有工资 w1,P2 有 w2,……。 - 协议选择:根据参与方数量、数据敏感性、网络环境、性能要求等,选择一种或多种上述技术组合成具体的 MPC 协议(如 SPDZ、MASCOT、ABY 等用于不同场景)。
- 数据分发/加密:
- 如果使用秘密共享:各方将自己的数据 w1 分割成碎片 (w1_1, w1_2, ..., w1_n),分发给对应的参与方。
- 如果使用同态加密:各方用共同公钥加密自己的数据得到
Enc(w1),并广播。
- 协同计算:各方根据协议规则,使用本地持有的碎片或密文,执行一系列预定义的交互式消息(如交换碎片、执行不经意传输、计算加密电路)和本地计算。
- 结果恢复:当计算完成后,各方手中的碎片或密文被组合起来,或者通过解密,得到最终结果
f(w1, w2, ..., wn),这个结果会广播给所有参与方,或者只给特定方。
MPC 协同的三重含义
- 数据层面的协同:数据不是交给一个中心,而是以加密或碎片化的形式分布在各参与方手中,大家的“保密信息”共同构成了计算的原料。
- 计算层面的协同:每一步计算都需要多方交互,共同“编织”出一个安全的计算过程,没有人能独立完成全部计算,也没有人能窥探到中间过程。
- 信任层面的协同:MPC 创造了一个“无需信任第三方”的信任环境,只要参与方中至少有一方是诚实的(或满足一定数量的诚实条件),整个协议就能保证安全和正确。
一个简单例子(秘密共享版“平均工资”)
- P1(工资 3)、P2(工资 5)、P3(工资 7)
- 秘密共享:各方将自己的工资随机切成三片:
- P1 分发:(2, -1, 2) (2+ (-1) +2 =3)
- P2 分发:(1, 2, 2) (1+2+2=5)
- P3 分发:(3, 1, 3) (3+1+3=7)
- 分发后,各方持有的碎片(第一片给P1,第二片给P2,第三片给P3):
- P1 持有:(来自P1的2,来自P2的1,来自P3的3) -> 总和片1 = 6
- P2 持有:(来自P1的-1,来自P2的2,来自P3的1) -> 总和片2 = 2
- P3 持有:(来自P1的2,来自P2的2,来自P3的3) -> 总和片3 = 7
- 本地计算:每个人计算自己手中所有碎片的总和。
- 结果恢复:P1, P2, P3 广播自己的“总和片”:6, 2, 7。
- 最终计算:6 + 2 + 7 = 15,除以3,平均工资为5。
- 关键:在整个过程中,没有任何一个参与方知道另外两方的具体工资,但所有人共同协作,算出了正确的结果。
一句话总结:安全多方计算通过秘密共享、混淆电路、同态加密等密码学技术,将数据与计算过程“解构”并“重组”,实现了数据可用但不可见的高效协同。