Facebook CrypTen安全多方计算(MPC)框架介绍及核心代码分析

2023-05-16

简单介绍

CrypTen是Facebook在2019年10月开源的,用于多方安全计算(MPC)的框架。其底层依赖于深度学习框架PyTorch。

  • 官网说明见: https://ai.facebook.com/blog/crypten-a-new-research-tool-for-secure-machine-learning-with-pytorch/.
  • 源码地址:https://github.com/facebookresearch/CrypTen

使用场景

Alice提供模型,Bob提供数据, 加密的数据被分割并在2方参与计算,最终将计算结果合并解密得到结果。在这里插入图片描述
在这里插入图片描述

使用示例

x_enc = crypten.cryptensor([1, 2, 3])
y_enc = crypten.cryptensor([4, 5, 6])
z_enc = x_enc + y_enc

隐藏明文

crypten支持两种分享类型:arithmetic(ArithmeticSharedTensor)和binary(BinarySharedTensor)。
通过cryptensor()方法构造的MPCTensor(继承了CrypTensor)中,默认使用arithmetic分享类型,主要属性_tensor值存放的是ArithmeticSharedTensor。

ArithmeticSharedTensor主要属性是share(等价于属性_tensor)。
构造过程主要为如下几步:

  1. 使用FixedPointEncoder将tensor编码,结果为scaled Integer类型的tensor。
  2. PRZS(psuedo-random sharing of zero)方式生成tensor。利用pytorch的isend和irecv,使得任意1方拥有n方中2方(prev,next)的随机数生成器的种子。核心代码如下
next_seed = torch.tensor(numpy.random.randint(-2 ** 63, 2 ** 63 - 1, (1,)))
prev_seed = torch.LongTensor([0])  # placeholder
# Send random seed to next party, receive random seed from prev party
if world_size >= 2:  # Otherwise sending seeds will segfault.
    next_rank = (rank + 1) % world_size
    prev_rank = (next_rank - 2) % world_size
    req0 = comm.get().isend(tensor=next_seed, dst=next_rank)
    req1 = comm.get().irecv(tensor=prev_seed, src=prev_rank)
    req0.wait()
    req1.wait()
else:
    prev_seed = next_seed
# Seed Generators
comm.get().g0.manual_seed(next_seed.item())
comm.get().g1.manual_seed(prev_seed.item())

3方(P1,P2,P3)计算情况,g0和g1的种子(Seed)对应如下结果:

\P1P2P3
g0S1S2S3
g1S3S1S2
def PRZS(*size):
    """
    Generate a Pseudo-random Sharing of Zero (using arithmetic shares)

    This function does so by generating `n` numbers across `n` parties with
    each number being held by exactly 2 parties. One of these parties adds
    this number while the other subtracts this number.
    """
    tensor = ArithmeticSharedTensor(src=SENTINEL)
    current_share = generate_random_ring_element(*size, generator=comm.get().g0)
    next_share = generate_random_ring_element(*size, generator=comm.get().g1)
    tensor.share = current_share - next_share
    return tensor
  1. 主节点(rank = 0) 的tensor = tensor + PRZS.share. 其他节点tensor = PRZS.share.

获取明文

获取方式是x_enc.get_plain_text()方法,该方法主要步骤如下:

  1. 由于n方的PRZS.share的所有值相加为0. 通过pytorch的reduce方式,sum所有节点的tensor.share即可恢复原始tensor。
  2. 使用FixedPointEncoder将tensor解码

算数运算

“add”,“sub”,“mul”,“matmul"等几个方法在ArithmeticSharedTensor中实现。
其中"mul”,"matmul"等方法使用了Beaver Triples(Multiplication Triples)协议。协议具体过程如下:

  1. Obtain uniformly random sharings [a],[b] and [c] = [a * b]
  2. Additively hide [x] and [y] with appropriately sized [a] and [b]
  3. Open ([epsilon] = [x] - [a]) and ([delta] = [y] - [b])
  4. Return [z] = [c] + (epsilon * [b]) + ([a] * delta) + (epsilon * delta)

推理过程如下:

x * y =(x - a + a)(y - b + b) 
    = (epsilon + a)(delta + b) 
    = c + (epsilon * b) + (a * delta) + (epsilon * delta)

[x * y] = [c] + (epsilon * [b]) + ([a] * delta) + (epsilon * delta) 

第三步在crypten具体实现中,是通过pytorch的reduce将epsilon和delta做了sum(所有节点值相等)。

a,b,c的生成方式

a,b,c的生存方式可以通过环境变量“CRYPTEN_PROVIDER_NAME”来设置。crypten支持3中方式:TFP(TrustedFirstParty,默认),TTP(TrustedThirdParty),HE(HomomorphicProvider)。
但目前HomomorphicProvider代码并未完成,TrustedThirdParty测试没有通过。只有TFP是可以的。

通信

CrypTen遵循标准的MPI编程模型:它为每一方运行一个单独的进程,但是每个进程运行一个相同的(完整)程序。 每个进程都有一个rank来表示自己。
crypten 分布式计算依赖的pytorch。crypten默认的配置DISTRIBUTED_BACKEND=gloo。

模型保护

模型的构建过程:

  1. 读取pytorch模型文件
  2. 将pytorch模型转换为onnx(Open Neural Network Exchange)文件
  3. 解读onnx文件,并构造crypten_model(Graph类或者Module类。Graph继承Container,Container继承Module)

使用场景:Alice提供模型,Bob提供数据

import crypten.mpc as mpc
import crypten.communicator as comm

ALICE = 0
BOB = 1
labels = torch.load('/tmp/bob_test_labels.pth').long()
count = 100 # For illustration purposes, we'll use only 100 samples for classification

@mpc.run_multiprocess(world_size=2)
def encrypt_model_and_data():
    # Load pre-trained model to Alice
    model = crypten.load('models/tutorial4_alice_model.pth', dummy_model=dummy_model, src=ALICE)
    
    # Encrypt model from Alice 
    dummy_input = torch.empty((1, 784))
    private_model = crypten.nn.from_pytorch(model, dummy_input)
    private_model.encrypt(src=ALICE)
    
    # Load data to Bob
    data_enc = crypten.load('/tmp/bob_test.pth', src=BOB)
    data_enc2 = data_enc[:count]
    data_flatten = data_enc2.flatten(start_dim=1)

    # Classify the encrypted data
    private_model.eval()
    output_enc = private_model(data_flatten)
    
    # Compute the accuracy
    output = output_enc.get_plain_text()
    accuracy = compute_accuracy(output, labels[:count])
    print("\tAccuracy: {0:.4f}".format(accuracy.item()))
    
encrypt_model_and_data()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Facebook CrypTen安全多方计算(MPC)框架介绍及核心代码分析 的相关文章

  • CodeBlocks的下载安装、配置、简单编程

    IDE简介 http www baidu com s wd 61 codeblocks xff0c 这里只是介绍Windows平台下的 IDE 环境配置 CodeBlocks的下载 安装 配置 xff1a 下载 xff1a http www
  • 四、安装cuDNN,caffe和openCV

    一 安装cuDNN 1 下载cudnn 可以注册再下载 不过有点麻烦 官网https developer nvidia com cudnn 或者百度云下载http pan baidu com s 1hrAMHko 2 安装 tar span
  • 网络爬虫(三)------宽度优先爬虫(一个的基础,简单但是很重要哦)

    在实际项目中 xff0c 我们使用爬虫遍历互联网 xff0c 把网络中相关的网页全部抓取过来 xff0c 这也体现了爬虫的特点 爬虫爬行的过程是这样子的 xff1a 互联网中每一个页面看作是一个节点 xff0c 页面中的链接可以看成图的有向
  • Win10+Ubuntu双系统修复Ubuntu系统引导

    这两天笔者安装win10 43 ubuntu16 04双系统 xff0c 因为网络上能找到大量的资料 xff0c 安装过程此处就不多讲 因为笔者电脑是华硕主板 xff0c bios默认设置为安全启动 xff0c 笔者猜测会阻止加载ubunt
  • 全面分析 Spring 的编程式事务管理及声明式事务管理

    关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能 xff0c 包括编程式事务和声明式事务 通过对本教程的学习 xff0c 您将能够理解 Spring 事务管理的本质 xff0c 并灵活运用之 先决条件 本教程假定您已经掌
  • classpath*作用

    classpath It refers to a list of resources and loads all such files present in the classpath and list can be empty and i
  • java 8 根据map 字段值 去重

    java 8 根据map 字段值 去重 span class token class name List span span class token generics span class token punctuation lt span
  • java 8 去重

    span class token comment 取差集 span span class token class name List span span class token generics span class token punct
  • 解读程序员的武侠世界,顶级程序员是内外兼修的大侠,那么你呢?

    在漫天的星河中 xff0c 有这样一颗星 xff0c 他朴实无华 xff0c 却又熠熠生辉 xff0c 照亮了无数人的人生 他就是金庸先生 随着一代大侠的驾鹤西去 xff0c 飞雪连天射白鹿 xff0c 笑书神侠倚碧鸳 xff0c 成为绝响
  • Eclipse使用入门教程

    Eclipse使用入门教程 说起java的IDE xff0c 朗朗上口的无非是Eclipse了 xff0c 假若能熟练Eclipse xff0c 对于我们编写java程序会起到事半功倍的效果 xff0c 大大提高我们工作效率 因此本篇博文
  • Win7 + Ubuntu16.04 双系统安装

    之前安装win7 43 Ubuntu14 04双系统 xff0c 后来换成win10用了一段时间后觉得有些卡 xff0c 而且装双系统装了几次都成功 xff0c 所以又换回了win7系统 xff0c 并重新安装了win7 43 Ubuntu
  • 双系统Ubuntu 引导修复(Boot Repair)

    安装完双系统 xff0c 如果在使用过程中不小心删除了Ubuntu引导向 xff0c 则会导致开机后无法选择进入Ubuntu系统 或者当我们重装了windows系统后 xff0c 也会发现原来的Ubuntu引导不见了 xff0c 当出现这两
  • 数据库为何要有复合主键(多主键)

    最近学习一点数据库的基本知识 xff0c 被一个问题困惑了许久 xff1a 主键是唯一的索引 xff0c 那么为何一个表可以创建多个主键呢 xff1f 其实 主键是唯一的索引 这话有点歧义的 举个例子 xff0c 我们在表中创建了一个ID字
  • @JSONField 注解详解和应用

    讲到 64 JSONField 注解 xff0c 就不得不提到Alibaba 开源的fasejson fastjson是目前java语言中最快的json库 xff0c 比自称最快的jackson速度要快 xff0c 第三方独立测试结果看这里
  • 外部访问docker容器(docker run -p/-P 指令)

    容器中可以运行一些网络应用 xff0c 要让外部也可以访问这些应用 xff0c 可以通过 P xff08 大写 xff09 或 p xff08 小写 xff09 参数来指定端口映射 xff08 1 xff09 当使用 P 标记时 xff0c
  • 解决Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题

    LocalDate LocalTime LocalDateTime 是Java 8开始提供的时间日期API xff0c 主要用来优化Java 8以前对于时间日期的处理操作 然而 xff0c 我们在使用Spring Boot或使用Spring
  • gcc 编译选项

    原来 Os相当于 O2 5 是使用了所有 O2的优化选项 xff0c 但又不缩减代码尺寸的方法 ffunction sections fdata sections Place each function or data item into
  • RYU功能开发(一)从simple switch开始

    对于任意一款控制器 xff0c 想要快速了解其开发机制 xff0c 从转发模块入手无疑是最佳的学习方式 RYU通过App的形式提供了一系列功能模块 xff0c 其中包括使用了OpenFlow作为控制协议的二层交换机控制模块simple sw
  • arm-linux-gcc交叉工具链

    Linux ARM交叉编译工具链制作过程 一 下载源文件 源代码文件及其版本与下载地址 xff1a Binutils 2 19 tar bz2 Index of gnu binutils gcc 4 4 4 tar bz2 Index of
  • 我使用过的Linux命令之cal - 显示日历

    我使用过的Linux命令之cal 显示日历 本文链接 xff1a http codingstandards iteye com blog 807962 xff08 转载请注明出处 xff09 用途说明 cal命令可以用来显示公历 xff08

随机推荐

  • 驼峰式与下划线命名规则

    在实际代码开发过程中 xff0c 代码编写格式清晰与否不仅决定了自己的代码编写与维护成本 xff0c 也直接影响到项目的开发进度 编码中常用的有驼峰法和下划线两种编码格式 xff0c 其中驼峰法常用在面向对象的高层语言中 xff0c 下划线
  • 全图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架

    文章目录 一 前言二 RPC 基础概念1 RPC 是什么 xff1f 2 需要解决什么问题 xff1f 3 有哪些开源实现 xff1f 三 protobuf 基本使用1 基本知识2 使用步骤 四 libevent1 libevent 简介2
  • 针对vue的配置文件

    针对vue的配置文件 我们在根目录下创建一个 vue config js 文件 xff0c 将下方配置下去 module exports 61 区分打包环境与开发环境 process env NODE ENV 61 61 61 39 pro
  • Linux | LVM | 对比三种逻辑卷(Logic Volume)

    概述 为了满足在性能和冗余等方面的需求 xff0c LVM支持了下面三种Logic Volume xff1a Linear Logic Volume 线性逻辑卷Striped Logic Volume 条带化逻辑卷Mirror Logic
  • MySql ERROR 1129

    ERROR 1129 HY000 Host 39 mysql02 39 is blocked because of many connection errors unblock with 39 mysqladmin flush hosts
  • SpringBoot整合Shiro

    Apache Shiro是一个强大且易用的Java安全框架 执行身份验证 授权 密码学和会话管理 相比较Spring Security xff0c shiro有小巧 简单 易上手等的优点 所以很多框架都在使用shiro Shiro包含了三个
  • PB数据窗口对象之Button

    Button 重要属性 Action 属性 该属性是Button 控件最重要的一个属性 在数据窗口画板中 xff0c 可以选择一个按钮有哪个动作 可选的动作都是事先定义好的 xff0c 开发人员没有机会精确定义某个动作的执行 xff0c 只
  • 聊聊前端八股文?

    大家好 xff0c 我是若川 xff0c 点此加我微信进源码群 xff0c 一起学习源码 同时可以进群免费看Vue专场直播 xff0c 有尤雨溪分享 Vue3 生态现状以及展望 前些天 xff0c 我看到 剑指前端offer 一系列文章 x
  • 新手向:前端程序员必学基本技能——调试JS代码

    1前言 大家好 xff0c 我是若川 最近组织了源码共读活动 xff0c 感兴趣的可以加我微信 ruochuan12 参与 xff0c 已进行三个月了 xff0c 大家一起交流学习 xff0c 共同进步 想学源码 xff0c 极力推荐之前我
  • 全新的 Vue3 状态管理工具:Pinia

    大家好 xff0c 我是若川 最近组织了源码共读活动 xff0c 感兴趣的可以点此加我微信 ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列 包含
  • 推荐2022前端必看的新书 《Vue.js设计与实现》

    大家好 xff0c 我是若川 持续组织了6个月源码共读活动 xff0c 感兴趣的可以点此加我微信 ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列
  • 面试官问:跨域请求如何携带cookie?

    大家好 xff0c 我是若 川 持续组织了6个月源码共读活动 xff0c 感兴趣的可以点此加我微信 ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体架构系
  • 如何写好技术文章(看张鑫旭老师的直播总结

    大家好 xff0c 我是若川 持续组织了6个月源码共读活动 xff0c 感兴趣的可以点此加我微信 ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列
  • Element使用的async-validator表单校验库源码超详细解析

    大家好 xff0c 我是若川 持续组织了8个月源码共读活动 xff0c 感兴趣的可以 点此加我微信ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列
  • 我捡到宝了!2022版前端面试上岸手册,最新最细致!

    大裁员背景下 xff0c 没什么比辞职后找不到工作更扎心 xff01 在行情好转前 xff0c 前端程序员只能 猥琐发育 xff0c 不轻易跳槽 xff0c 同时要修炼内功 xff1a 对八股文 底层源码 重点项目等进行查缺补漏 xff0c
  • 点击页面元素跳转IDE对应代码,试试这几个工具!

    大家好 xff0c 我是若川 我持续组织了近一年的源码共读活动 xff0c 感兴趣的可以 点此扫码加我微信 ruochuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整
  • 为什么说组件库的源码非常值得学习?

    大家好 xff0c 我是若川 最近来了一些新朋友 xff0c 感谢大家关注 相比于原生 JS 等源码 我们或许更应该学习正在使用的组件库的源码 xff08 如 xff1a element antd vant semi arco tdesig
  • 写一个Vue DevTools,让开发体验飞一会

    大家好 xff0c 我是若川 我持续组织了近一年的源码共读活动 xff0c 感兴趣的可以 点此扫码加我微信 lxchuan12 参与 xff0c 每周大家一起学习200行左右的源码 xff0c 共同进步 同时极力推荐订阅我写的 学习源码整体
  • 偷偷盘点前端面试官才知道的进阶秘籍

    很多人都说35岁是程序员的职业尽头 而我们部门leader是位80年的大哥 xff0c 曾经是字节3 1大佬 xff0c 今年43岁了依然独当一面 于是 xff0c 我向他请教了 不被淘汰 的秘籍 他总结了两点 xff1a 1 努力修炼内功
  • Facebook CrypTen安全多方计算(MPC)框架介绍及核心代码分析

    简单介绍 CrypTen是Facebook在2019年10月开源的 用于多方安全计算 MPC 的框架 其底层依赖于深度学习框架PyTorch 官网说明见 xff1a https ai facebook com blog crypten a