N 方各自持有私有输入,协同计算函数而不泄露输入。
从百万富翁问题到联邦学习——"计算可见,数据不可见"。
多方安全计算(Secure Multi-Party Computation, MPC / SMPC)是密码学的一个子领域,目标是在多方各自持有私有数据的情况下,协同计算一个公共函数的输出,同时确保任何一方都无法获知他人的输入。
与传统的加密通信不同,传统密码学保护的是"传输中的数据"(防止窃听者),而 MPC 保护的是"计算中的数据"——防止参与者之间互相窥探。
协议执行过程中的所有消息,不能推断出任何参与者的私有数据。唯一可推断的信息,是从输出本身就能推出的那些。
密码学保证任何恶意参与者的子集合谋偏离协议,都不能迫使诚实参与者得到错误结果。要么得到正确输出,要么检测到作弊而终止。
鲁棒或中止MPC 安全性基于Real/Ideal 世界范式:
存在一个绝对可信的第三方 Tony。每个人把输入私密地交给 Tony,Tony 独立计算 F,再把输出发回。在理想世界里,参与者之间不交换任何消息——隐私天然得到保证。
没有可信第三方。参与者只能互相发消息来达成计算。如果现实世界协议中,参与者能学到的信息不超过理想世界中能学到的,那这个协议就是安全的。
这给了我们一个强大的抽象:如果你的应用在理想世界是安全的,那用安全 MPC 替换掉理想第三方后,应用依然安全。
1982 年,姚期智(Andrew Yao)提出了这个经典问题,开启了安全多方计算的整个领域:
数学上就是安全计算比较函数 F(x, y) = x > y,其中 x 是 Alice 的财富,y 是 Bob 的财富。
输入两方的私有值,协议将只揭示比较结果,不泄露具体数值。
Yao 在 1986 年将此推广到了任意函数的安全两方计算——这就是著名的混淆电路(Garbled Circuit)协议。随后 Goldreich、Micali、Wigderson 将其推广到多方情况(GMW 范式)。
秘密共享是大多数 MPC 协议的基石。核心思想:把一个秘密拆成 N 份"碎片",任意 t 份可以重建,少于 t 份则毫无信息。
由 Adi Shamir 于 1979 年提出,基于多项式插值。一个 (t, n) 门限方案:
f(x) = a₀ + a₁x + a₂x² + ... + aₜ₋₁xᵗ⁻¹,其中 a₀ = secretf(i) 作为份额输入一个秘密值,生成 3 份份额,验证 2 份可重建、1 份不可。
更简单但在 MPC 中同样广泛使用:
r₁, r₂, ..., rₙ,满足 r₁ + r₂ + ... + rₙ = s (mod p)| 特性 | Shamir 秘密共享 | 加法秘密共享 |
|---|---|---|
| 门限 | 灵活 (t, n),t < n/2 | 固定 (n, n),需全部份额 |
| 被动安全 | t < n/2 | t < n |
| 主动安全 | t < n/3 | t < n (配合 MAC) |
| 信息论安全 | ✅ | ✅ |
| 乘法运算 | 需通信 (BGW 协议) | 需通信 (Beaver 三元组) |
| 加法运算 | 本地执行 ✅ | 本地执行 ✅ |
| 代表协议 | BGW, Shamir-ATLAS | SPDZ, MASCOT |
| 扩展性 | ATLAS 比 plain Shamir 扩展更好 | Temi/Hemi 比 Semi 扩展更好 |
Yao 在 1986 年提出,是安全两方计算 (2PC) 的核心技术。核心思想:把计算函数表示为布尔电路,然后"加密"每个逻辑门,使得求值方只能得到输出而不能推断输入。
原始真值表: 混淆后的真值表: A B | Out A B | Enc(Out) ──────────── ───────────────────────────────── 0 0 | 0 lbl_A₀ lbl_B₀ | Enc(lbl_Out₀) 0 1 | 0 lbl_A₀ lbl_B₁ | Enc(lbl_Out₀) 1 0 | 0 lbl_A₁ lbl_B₀ | Enc(lbl_Out₀) 1 1 | 1 lbl_A₁ lbl_B₁ | Enc(lbl_Out₁) # lbl_X₀ = 随机字符串, 代表线 X 取值 0 # lbl_X₁ = 随机字符串, 代表线 X 取值 1 # Evaluator 只有正确的标签才能解密对应行 # 无法从标签推断对应的是 0 还是 1
混淆电路的关键辅助协议。Sender 有两个值 m₀、m₁,Receiver 选择 b ∈ {0,1}:
OT 被证明是2PC 的完备原语——任何安全两方计算都可以用 OT 来实现。
XOR 门的求值完全不需要通信——只需本地异或标签。这使得 XOR 密集型电路(如 AES)极大加速。
0 通信开销将混淆表的行数从 4 减少到 3(再进一步到 2),减少 25%-50% 的通信量。
通信优化对抗恶意敌手:发送多个混淆电路副本,随机打开一半检查一致性,未打开的用于计算。多数投票输出。
恶意安全MPC 协议的安全性取决于敌手模型。不同的敌手能力对应不同级别的安全保证。
腐败方遵守协议,但尝试从接收到的消息推断他人输入。协议防止意外信息泄露。实际场景:合作方之间的隐私保护。
最弱安全最高效率腐败方可以任意偏离协议——发送错误消息、拒绝参与、提前终止。协议必须保证:要么诚实方得到正确输出,要么检测到作弊而终止。
最强安全效率代价敌手愿意作弊,但不想被抓到。协议提供概率检测(如 75%-90% 的作弊发现概率)。声誉风险让敌手不敢作弊。
中间地带| 腐败模型 | Shamir 秘密共享 | 加法秘密共享 | 混淆电路 |
|---|---|---|---|
| 被动,t < n/2 | ✅ 信息论安全 | — | — |
| 被动,t < n | — | ✅ 信息论安全 | — |
| 主动,t < n/3 | ✅ 信息论安全 | — | — |
| 主动,t < n (不诚实多数) | — | ✅ + MAC (SPDZ) | ✅ + Cut-and-Choose |
| 2PC,t=1 of 2 | — | — | ✅ Yao's GC |
MPC 协议按底层技术分为三大类,再按安全模型和计算域进一步细分。
各方持有份额,通过交互协议在份额上做运算。加法本地执行,乘法需通信。
代表:SPDZ, BGW, GMW, Rep3, Shamir-ATLAS
优势:多方场景更高效,可扩展到大量参与方
劣势:通信轮数与计算深度成正比
多方主流一方构造混淆布尔电路,另一方求值。轮数恒定(与函数无关)。
代表:Yao's GC, BMR (多方扩展)
优势:通信轮数常量,低延迟
劣势:整数计算昂贵(需转布尔电路),主要适用于 2PC
2PC低轮次利用部分同态加密 (Paillier) 或全同态加密在密文上直接计算。
代表:MASCOT (用 HE 做预处理), SPDZ-HE 变体
优势:通信量少
劣势:需要批量才高效,计算开销大
少通信MP-SPDZ 是目前最全面的 MPC 基准测试框架,由 Data61 (CSIRO) 的 Marcel Keller 开发,支持以下所有协议变体:
| 安全模型 | 模素数 / GF(2ⁿ) | 模 2ᵏ | 二进制秘密共享 | 混淆电路 |
|---|---|---|---|---|
| 恶意,不诚实多数 | MASCOT / LowGear / HighGear | SPDZ2k | Tiny / Tinier | BMR |
| 隐蔽,不诚实多数 | CowGear / ChaiGear | N/A | N/A | N/A |
| 半诚实,不诚实多数 | Semi / Hemi / Temi / Soho | Semi2k | SemiBin | Yao's GC / BMR |
| 恶意,诚实多数 | Shamir / Rep3 / PS / SY / Rep4 | Brain / Rep3 / PS / SY / Rep4 | Rep3 / CCD / PS / Rep4 | BMR |
| 半诚实,诚实多数 | Shamir / ATLAS / Rep3 | Rep3 / Astra / Trio | Rep3 / CCD | BMR |
在秘密共享方案中,加法是"免费的"(本地执行),但乘法需要通信。Beaver 三元组是乘法的预处理技巧:
# 预处理阶段(离线完成,与实际输入无关) # 生成三元组 (a, b, c) 其中 c = a * b,各方持有份额 # 在线阶段:计算 [x] * [y] # 1. 各方公开 d = x - a 和 e = y - b # 2. z = c + d*b + e*a + d*e (仅用加法和公开值) # 3. [z] = [x*y] — 只用了一轮通信! # 关键:三元组在离线阶段预生成,在线阶段乘法变成一轮通信 # SPDZ 协议的核心:用同态加密在离线阶段高效生成 Beaver 三元组
MPC 不是学术玩具——它在 AI/ML 领域有大量实际应用场景,核心诉求是"计算可见,数据不可见"。
模型所有者和数据所有者不同。数据方不想暴露原始数据,模型方不想暴露模型权重。MPC 让双方在加密状态下完成推理。
案例:医疗影像诊断——医院数据不出院,AI 公司模型不泄露。
模型隐藏数据隐藏多机构协同训练模型,各方的训练数据不离开本地。MPC 保证只共享梯度更新,不泄露原始数据。
案例:多银行联合训练反欺诈模型,各银行客户数据不互通。
联邦学习在不看到原始数据的情况下,对多方数据做聚合统计、机器学习、数据挖掘。
案例:竞争对手联合分析市场趋势,各方销售额不互知。
数据协作将密钥拆分给多方持有,必须 N/M 方同意才能使用密钥。防止单点泄露。
案例:MPC 钱包(加密货币)、根证书私钥管理。
密钥安全以下数据来自 TF Encrypted 的 ABY3 三方协议基准测试(LAN 40Gbps, RTT 0.02ms;WAN 352Mbps, RTT 40ms):
| 模型 | 建图 (秒) | LAN 推理 (秒) | WAN 推理 (秒) |
|---|---|---|---|
| VGG19 | 105.18 | 49.63 | 139.63 |
| ResNet50 | 150.47 | 19.07 | 84.29 |
| DenseNet121 | 344.55 | 33.53 | 151.43 |
数据来源:tf-encrypted GitHub 仓库基准测试。ResNet50 在 LAN 下 19 秒是已知最快的三方安全推理实现之一。
| 模型架构 | 优化器 | 精度 (5 epochs) | LAN 每批 (秒) | WAN 每批 (秒) |
|---|---|---|---|---|
| A (小 MLP) | SGD | 96.5-96.7% | 0.098-0.167 | 4.5-9.7 |
| B (中 MLP) | Adam | 98.8% | 0.772-5.733 | 21.1-98.1 |
| C (大 MLP) | Adam | 99.0-99.1% | 2.825-9.893 | 65.3-195.0 |
| 逻辑回归 | SGD | 84.8% | 0.010 | 0.844 |
数据来源:TF Encrypted vs MP-SPDZ 对比基准测试。模型 C 在 WAN 下每批 65-195 秒,说明 MPC 训练大规模网络仍有显著开销。
联邦学习 (Federated Learning) 让多方在不共享原始数据的情况下协同训练模型。但标准联邦学习有一个关键弱点:梯度更新可能泄露训练数据信息(梯度反转攻击)。
最简单也最实用的 MPC+FL 组合:各方用秘密共享将梯度发给聚合服务器,服务器只能看到聚合结果,看不到任何单方梯度。
# 简化的安全聚合协议
# N 个客户端 C₁, C₂, ..., Cₙ 各有梯度 gᵢ
# 目标:服务器只学到 Σgᵢ,不知道任何 gᵢ
# Step 1: 每个客户端 Cᵢ 生成随机掩码
for each pair (i, j), i < j:
seed_ij = PRG(seed_ij) # 预共享的随机种子
C_i adds +seed_ij to g_i
C_j adds -seed_ij to g_j
# 掩码在聚合时相互抵消
# Step 2: 各方发送被掩码的梯度
C_i → Server: g_i + Σ_j mask_ij
# Step 3: 服务器聚合
result = Σᵢ (g_i + masks) = Σᵢ g_i # 掩码全部抵消!
# 关键:即使服务器与 t < n/2 方合谋,
# 也无法推断诚实方的梯度(被随机掩码保护)
| 维度 | MPC | 同态加密 (HE) | 差分隐私 (DP) |
|---|---|---|---|
| 隐私保证 | 数学精确(无信息泄露) | 数学精确 | 统计近似(可控泄露) |
| 计算开销 | 10-100x | 100-10000x | 1.1-2x |
| 通信开销 | 高(多轮交互) | 低(1-2 轮) | 无额外通信 |
| 模型精度影响 | 无 | 无 | 有(噪声降低精度) |
| 参与方要求 | 需多方在线 | 1 方可独立计算 | 无 |
| 信任假设 | 诚实多数 | 密钥持有者可信 | 可信聚合方 |
| 最佳场景 | 安全聚合、阈值签名 | 云端密文计算 | 统计发布、数据共享 |
随着 AI Agent 系统越来越复杂,多 Agent 协作涉及敏感信息交互。MPC 为 Agent 之间的隐私协作提供了密码学基础。
Agent A 持有用户行为数据,Agent B 持有风险模型。MPC 让 A 和 B 协作计算风险评分,A 不暴露行为数据,B 不暴露模型。
隐私计算高权限工具(如删除数据库、转账)需要 N/M 个 Agent 共同授权。MPC 实现阈值签名——必须足够多 Agent 同意才能执行。
权限控制一组 Agent 需要投票决策(如是否执行某操作),但各 Agent 的投票需要保密。MPC 安全投票协议确保仅公布结果。
投票隐私不同组织的 Agent 协作完成跨域任务(如跨银行反洗钱),MPC 确保各方数据不离开各自安全域。
数据不出域┌─────────────────────────────────────────────────┐ │ Agent 协作层 │ │ ┌─────────┐ MPC 安全通道 ┌─────────┐ │ │ │ Agent A │◄──────────────►│ Agent B │ │ │ │ (数据方) │ 秘密共享 │ (模型方) │ │ │ └────┬────┘ Beaver 三元组 └────┬────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────────────────────────────┐ │ │ │ MPC 计算引擎 │ │ │ │ · 安全推理 (Garbled Circuit / SS) │ │ │ │ · 安全聚合 (Secret Sharing) │ │ │ │ · 阈值签名 (t-of-n) │ │ │ └─────────────────────────────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────┐ ┌─────────┐ │ │ │ 工具调用 │ │ 工具调用 │ │ │ │ (需授权) │ │ (需授权) │ │ │ └─────────┘ └─────────┘ │ └─────────────────────────────────────────────────┘
最全面的 MPC 基准框架,支持几乎所有主流协议变体。由 Data61 (CSIRO) 开发,2020 年 CCS 论文。
支持:秘密共享 / HE / 混淆电路,恶意/半诚实,诚实/不诚实多数。
语言:C++ + Python(高层编程),GitHub 1.2K+ stars
研究首选协议最全纯 Python 的 MPC 库,无依赖,基于 Shamir 秘密共享。由 Berry Schoenmakers 开发。
支持:被动安全、诚实多数 (t < m/2)。有丰富的 Jupyter notebook 示例。
GitHub,pip install mpyc
Meta (Facebook) 的隐私 ML 框架,基于 PyTorch。CrypTensor 用起来就像普通 Tensor。
支持:3PC 诚实多数、算术/二进制秘密共享。支持 GPU 加速。
PyTorch 生态ML-firstTensorFlow 的隐私计算框架,Keras API 风格。支持训练和推理。
支持:ABY3 三方协议、HE。ResNet50 LAN 推理 19 秒。
TF 生态训练+推理蚂蚁集团开源的隐私计算框架,支持 MPC + HE + TEE 混合。中文文档友好。
支持:SS, OT, HE。生产级别,有完整的数据分析流水线。
生产级中文友好矩阵源的隐私 AI 框架,在 TensorFlow 上封装 MPC 后端,API 与原生 TF 完全一致。
支持:2PC/3PC/4PC 多种配置。零代码改造(理论上的)。
TF 兼容低改造
# pip install mpyc
# 运行: python millionaire.py
from mpyc.runtime import mpc
mpc.run(mpc.start()) # 启动 MPC 运行时
# 各方的秘密输入(只有自己知道)
my_wealth = mpc.input(mpc.SecInt()(42)) # Alice 输入 42
# 安全比较:x > y
result = mpc.run(mpc.output(my_wealth > other_wealth))
print(f"我更富有吗? {result}")
mpc.run(mpc.shutdown())
# 运行方式(模拟 3 方):
# python millionaire.py -M3 -I0 & # Party 0
# python millionaire.py -M3 -I1 & # Party 1
# python millionaire.py -M3 -I2 # Party 2
# pip install crypten
import torch
import crypten
crypten.init()
# 加载预训练模型
model = torch.load("model.pth")
private_model = crypten.load_from_party("model.pth", src=0)
# 加密输入数据
x = torch.tensor([1.0, 2.0, 3.0])
x_enc = crypten.cryptensor(x) # 加密
# 加密推理——全程不暴露数据和模型
with torch.no_grad():
output_enc = private_model(x_enc)
# 解密输出(需要各方同意)
output = output_enc.get_plain_text()
print(f"推理结果: {output}")
| 维度 | MPC | 全同态加密 (FHE) | 可信执行环境 (TEE) | 差分隐私 (DP) |
|---|---|---|---|---|
| 隐私保证 | 密码学精确保证 | 密码学精确保证 | 硬件保证(SGX漏洞频出) | 统计近似 |
| 计算开销 | 10-100x | 1000-10000x | 1.05-1.5x | 1.1-2x |
| 通信开销 | 高(多轮交互) | 低(1-2 轮) | 低 | 无额外 |
| 参与方要求 | 多方同时在线 | 单方可计算 | 单方可计算 | 无 |
| 信任假设 | 诚实多数 (t < n/2) | 密钥持有者可信 | 硬件厂商可信 | 聚合方可信 |
| 输出精度 | 精确 | 精确(有噪声编码) | 精确 | 有噪声 |
| 成熟度 | 生产可用(特定场景) | 研究为主 | 生产可用 | 生产可用 |
| 量子安全 | 部分协议信息论安全 | 依赖格密码可量子安全 | 依赖具体实现 | 与量子无关 |
| 典型场景 | 安全聚合、阈值签名、联合分析 | 云端密文搜索、ML 推理 | 密钥保护、安全计算 | 统计发布、数据共享 |
信息论安全:少于门限 t 份份额在数学上等价于随机数。对于 Shamir 的 (t, n) 方案:
加法可以本地执行:[x+y] = [x] + [y](份额相加即可)。
但乘法不行:[x·y] ≠ [x]·[y](份额相乘会泄露交叉项信息)。
# 加法秘密共享下的乘法问题 # x = x₁ + x₂ + x₃ (mod p) # y = y₁ + y₂ + y₃ (mod p) # # x · y = (x₁ + x₂ + x₃)(y₁ + y₂ + y₃) # = x₁y₁ + x₁y₂ + x₁y₃ + x₂y₁ + x₂y₂ + x₂y₃ + x₃y₁ + x₃y₂ + x₃y₃ # # 本地只能算 xᵢyᵢ,交叉项 xᵢyⱼ (i≠j) 需要通信 # Beaver 三元组的魔法:预生成 (a,b,c=a·b) 的共享, # 将在线乘法降为一轮通信 + 本地加法
在加法秘密共享中,恶意敌手可以篡改自己的份额。SPDZ 的解决方案:
MPC 的性能瓶颈主要在通信。以下是实际项目中的优化策略:
将多个独立计算打包到一次通信轮次中。HE-based 的 SPDZ 预处理需要批量生成 Beaver 三元组才高效。批大小 10000+ 时效率提升 10-100x。
最重要Beaver 三元组、OT 扩展等可以在不知道输入的情况下预生成。在线阶段只做轻量操作。适合"可以等待但计算时需快速"的场景。
延迟优化整数运算用算术电路(模素数/2ᵏ),比较运算用二进制电路。通过 edaBits(转换共享)在两种表示间切换。MP-SPDZ 支持自动混合。
精度-效率平衡星形拓扑(通过一个聚合方)减少连接数但增加延迟。全连接拓扑延迟低但通信量 O(n²)。少量参与方 → 全连接;大量参与方 → 星形 + 层次聚合。
通信优化CrypGPU、CrypTen 支持在 GPU 上运行 MPC 运算。AES 电路求值从 2.7 秒降到 0.3 秒(降低安全到 Covert)。GPU 并行化适合矩阵运算密集的 ML 推理。
硬件加速为 MPC 定制神经网络:用 ReLU 替代 Sigmoid(比较更便宜)、减少全连接层维度、用量化到低精度(int8 代替 float32)。Crypto-Oriented Neural Architecture。
ML 适配从零到生产,MPC 项目需要考虑什么?