首页 热门资讯文章正文

安全多方计算(MPC)开源框架详解与实践指南

热门资讯 2025年08月29日 20:12 1 admin

安全多方计算(MPC)允许多个参与方在不泄露各自私有数据的前提下协同完成计算任务,是隐私保护领域的核心技术之一。以下将介绍 3 个主流开源框架的详细特性,并通过代码实例演示其使用方法。

一、CrypTen(Facebook)

框架简介

  • 地址:https://github.com/facebookresearch/CrypTen
  • 开发背景:Facebook(现 Meta)2019 年开源,基于 PyTorch 构建,专注于隐私保护机器学习场景
  • 核心特性:支持半诚实安全模型下的两方 / 多方计算提供与 PyTorch 相似的 API,降低机器学习开发者的使用门槛支持秘密共享、同态加密等基础 MPC 原语原生支持神经网络训练与推理的加密计算
  • 适用场景:隐私保护的机器学习(如联邦学习与 MPC 结合场景、医疗数据联合建模)

使用方法与代码实例:加密线性回归训练

场景说明

安全多方计算(MPC)开源框架详解与实践指南

假设有两个参与方(Alice 和 Bob),分别拥有特征数据和标签数据,希望联合训练线性回归模型而不泄露各自数据。

代码实现

import torchimport cryptenimport numpy as np# 1. 初始化CrypTen环境(指定参与方数量,这里模拟两方计算)crypten.init()crypten.set_default_protocol(crypten.mpc.protocol.SecureNN)  # 使用SecureNN协议# 2. 模拟两方私有数据(实际场景中由不同参与方各自持有)# Alice拥有特征数据X(私有)X = torch.tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])# Bob拥有标签数据y(私有)y = torch.tensor([3.0, 7.0, 11.0])  # 实际关系:y = 1*X1 + 1*X2# 3. 数据加密:将数据转换为加密张量(CrypTensor)# 注意:在真实场景中,加密操作在各自本地完成,不会传输明文X_enc = crypten.cryptensor(X, src=0)  # 参与方0(Alice)加密自己的数据y_enc = crypten.cryptensor(y, src=1)  # 参与方1(Bob)加密自己的数据# 4. 定义加密模型(线性回归)class LinearModel(crypten.nn.Module):    def __init__(self):        super().__init__()        self.linear = crypten.nn.Linear(2, 1)  # 输入维度2,输出维度1    def forward(self, x):        return self.linear(x)# 5. 初始化模型并加密model = LinearModel()model.encrypt()  # 加密模型参数# 6. 定义损失函数和优化器(均在加密状态下运行)criterion = crypten.nn.MSELoss()optimizer = crypten.optim.SGD(model.parameters(), lr=0.01)# 7. 加密训练(核心:所有计算在密态下进行)model.train()for epoch in range(1000):    # 前向传播(加密数据输入加密模型)    outputs = model(X_enc)    # 计算损失(加密状态下的MSE)    loss = criterion(outputs, y_enc.reshape(-1, 1))        # 反向传播与参数更新    optimizer.zero_grad()    loss.backward()    optimizer.step()        if (epoch + 1) % 200 == 0:        # 解密损失值用于监控(仅泄露损失,不泄露原始数据)        print(f"Epoch [{epoch+1}/1000], Loss: {loss.get_plain_text().item():.4f}")# 8. 解密模型参数(得到联合训练的结果)model.decrypt()print("训练得到的权重:", model.linear.weight.data)print("训练得到的偏置:", model.linear.bias.data)

代码解析

  1. 环境初始化:crypten.init()设置 MPC 协议和安全参数,SecureNN协议适合机器学习场景
  2. 数据加密:cryptensor将明文张量转换为加密张量,src参数指定数据所属参与方
  3. 加密计算:模型定义、损失计算、参数更新均在加密状态下进行,参与方无法获取对方数据
  4. 结果解密:仅在必要时解密损失(用于监控)和最终模型参数,原始数据始终保密

二、MP-SPDZ

框架简介

  • 地址:https://github.com/data61/MP-SPDZ
  • 开发背景:澳大利亚 CSIRO's Data61 开发,是 SPDZ 协议的扩展实现,支持多种 MPC 协议
  • 核心特性:支持 20 + 种 MPC 协议(如 SPDZ、MASCOT、Yao 电路等)支持半诚实与恶意安全模型提供高级 Python 接口和低级 C++ 接口,兼顾易用性与性能支持算术电路和布尔电路计算,适用通用场景
  • 适用场景:通用安全计算(如多方联合统计、隐私保护查询、金融风控模型)

使用方法与代码实例:多方平均计算

场景说明

三个参与方分别持有私有数值,希望计算它们的平均值而不泄露各自数值。

实现步骤

1、准备工作:安装 MP-SPDZ 并编译

git clone https://github.com/data61/MP-SPDZ.gitcd MP-SPDZmake -j8  # 编译核心组件

2、编写 MPC 程序(.mpc 文件):定义多方计算逻辑
创建average.mpc文件:

# 定义参与方数量(3个参与方)N = 3# 每个参与方输入自己的私有数值a = sint.get_input_from(0)  # 参与方0的输入b = sint.get_input_from(1)  # 参与方1的输入c = sint.get_input_from(2)  # 参与方2的输入# 计算总和(加密状态下)total = a + b + c# 计算平均值(加密状态下)avg = total / N# 所有参与方获取结果(解密)avg.output_all()  # 输出到所有参与方
  • sint表示秘密整数类型(加密的整数)
  • get_input_from(i)获取参与方 i 的私有输入并加密
  • output_all()将结果解密并发送给所有参与方

3、生成预处理数据:MP-SPDZ 需要预计算一些加密材料(如乘法三元组)

./Scripts/setup-ssl.sh  # 生成SSL证书(用于通信加密)./gen_input_avg  # 生成输入文件模板(自动创建Player-Data目录)

4、设置输入数据:在Player-Data目录下为每个参与方设置输入

  • Player-Data/Input-0:5(参与方 0 的数值)
  • Player-Data/Input-1:10(参与方 1 的数值)
  • Player-Data/Input-2:15(参与方 2 的数值)

5、运行 MPC 计算:启动 3 个参与方进程

# 终端1:参与方0./mascot-party.x 0 average# 终端2:参与方1./mascot-party.x 1 average# 终端3:参与方2./mascot-party.x 2 average

6、输出结果:三方均会收到结果10((5+10+15)/3=10),但始终不知道其他方的输入值

三、SecretFlow(蚂蚁集团)

框架简介

  • 地址:https://github.com/secretflow/secretflow
  • 开发背景:蚂蚁集团 2022 年开源,定位为 "隐私计算一体化框架",整合 MPC、联邦学习、TEE 等技术
  • 核心特性:支持 MPC(两方 / 多方)、联邦学习、同态加密、可信执行环境(TEE)提供高阶 API(如SFOperator)和低阶 MPC 原语内置金融、医疗等行业的隐私计算组件(如联合特征工程、模型训练)支持水平 / 垂直 / 混合数据分割场景
  • 适用场景:工业级隐私计算应用(如联合风控、医疗数据联合分析、政务数据共享)

使用方法与代码实例:垂直联邦学习中的 MPC 特征交互

场景说明

两个参与方(银行和电商)分别持有用户的不同特征(银行有收入数据,电商有消费数据),希望通过 MPC 计算特征交叉项(收入 × 消费)用于联合建模。

代码实现

import secretflow as sffrom secretflow.data.vertical import VDataFramefrom secretflow.preprocessing.scaler import StandardScalerfrom secretflow.utils.simulation.datasets import load_linear# 1. 初始化SecretFlow环境(模拟两方计算)sf.init(['alice', 'bob'], address='local')  # alice和bob为参与方名称alice, bob = sf.PYU('alice'), sf.PYU('bob')  # 创建参与方对象# 2. 加载垂直分割数据(模拟银行和电商的数据)# 数据格式:id为用户标识,alice_data含收入特征,bob_data含消费特征data = load_linear(partitions={alice: [0, 1], bob: [0, 2]}, # 0为id列,1为收入,2为消费                   label=3, # 标签列(假设由bob持有)                   num_samples=1000)vdf = VDataFrame(data)  # 垂直数据帧,自动管理各方数据# 3. 数据预处理(各方本地标准化,不泄露数据)scaler = StandardScaler()vdf_scaled = scaler.fit_transform(vdf)# 4. 使用MPC进行特征交互(计算收入×消费的交叉项)# 选择SPU作为MPC计算引擎(SecretFlow的安全计算单元)spu = sf.SPU(sf.utils.testing.cluster_def(['alice', 'bob']))# 将特征发送到SPU进行加密计算income = vdf_scaled['1'].to(spu)  # alice的收入特征(加密)consumption = vdf_scaled['2'].to(spu)  # bob的消费特征(加密)# 加密状态下计算交叉项(收入×消费)cross_term = income * consumption  # MPC乘法操作# 5. 获取计算结果(解密交叉项,仅用于后续建模)cross_term_plain = cross_term.to(alice)  # 将结果发送给alice(也可发送给bob)print("前5条交叉项结果:", cross_term_plain.values[:5])

代码解析

  1. 环境初始化:sf.init定义参与方和通信方式,PYU代表参与方的本地计算单元
  2. 垂直数据管理:VDataFrame自动维护各方数据的关联(通过用户 id),避免数据泄露
  3. MPC 计算引擎:SPU(Secure Processing Unit)是 SecretFlow 的 MPC 核心,支持多种协议
  4. 特征交互:收入和消费特征在加密状态下相乘,确保原始数据不泄露,仅暴露交叉项结果

框架选型建议

框架

优势场景

技术门槛

性能表现

生态成熟度

CrypTen

隐私保护机器学习

低(PyTorch 用户)

中(适合小规模模型)

中等

MP-SPDZ

通用安全计算

中(需了解 MPC 协议)

高(C++ 优化)

SecretFlow

工业级隐私计算应用

中(高阶 API 降低门槛)

高(分布式优化)


  • 机器学习开发者优先选择CrypTen,可复用 PyTorch 知识
  • 通用安全计算场景优先选择MP-SPDZ,协议支持最全面
  • 工业级应用优先选择SecretFlow,整合多技术且有落地案例

通过上述框架,开发者可在保护数据隐私的前提下实现多方协同计算,满足金融、医疗、政务等敏感领域的合规需求。

发表评论

泰日号Copyright Your WebSite.Some Rights Reserved. 网站地图 备案号:川ICP备66666666号 Z-BlogPHP强力驱动