【隐私计算篇】混淆电路之深入浅出
入门隐私计算的阶段,一般都会涉及对于混淆电路的学习,这是因为混淆电路是多方安全计算中的基础密码原语,也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理,今天对其进行原理以及相关优化手段进行解析和分享。
1. 混淆电路简介
混淆电路,也被称为Yao-garbled circuits,是一种用于在加密输入上安全计算函数的密码学技术,广泛应用于安全多方计算协议中。
在混淆电路中,函数的输入和输出被加密,同时电路本身被混淆以隐藏其内部结构,接收方不知道电路中的具体门结构和逻辑。混淆的过程包括为电路的输入和输出线路分配随机标签,并加密每个逻辑门的真值表条目。混淆后的电路会被发送给接收方,接收方拥有必要的解密密钥。
接收方在评估混淆电路时,使用输入标签确定每个逻辑门的正确真值表条目,并解密这些条目以获得输出标签。通过将输出标签与预定义的期望输出标签进行比较,接收方可以获取计算结果,而不会泄露输入或计算函数的任何信息。
混淆电路提供了一种在不向参与计算的任何一方透露敏感信息的情况下,在加密数据上执行安全计算的方法。它们在安全计算协议、隐私信息检索和隐私保护机器学习等各个领域都有广泛应用。
2. 实现原理
混淆电路的实施,主要分为四个主要步骤:混淆方(发送方)准备(生成混淆电路)、通信(OT及混淆表)、评估方(接收方)计算(执行电路)、解码及共享(获得最终结果)。原理图参考OSU Mike Rosulek教授关于GC的分享【1】。
2.1 准备阶段
发送方(混淆方)将要计算的函数表示为一个布尔电路,其中包含输入门、输出门和内部逻辑门。
发送方为每个输入和输出门生成两个随机的比特字符串,称为标签(labels)。一个标签对应于0的输入,另一个标签对应于1的输入。
发送方为每个内部逻辑门生成一个加密的真值表。每个真值表条目包含对应的输入标签的加密结果。
'''
pre-generate garbled truth table
'''class PreGenerateGTT(object):def __init__(self, bits=64, file='compare.json'):self.circuit = parse_json(file)self.GTTs = []self.bits = bitsdef generate_k_garbled_table(self, k):for i in range(k):b_labels, c_labels, tables, circuit_info = generate_labels(self.circuit)self.GTTs.append((b_labels, c_labels, tables, circuit_info))return self.GTTsdef generate_alice_labels(self, batch_a, gtts):a_labels_arr = []for i in range(len(batch_a)):a_bytes = intToBin(batch_a[i], self.bits)[::-1]b_labels, c_labels, tables, circuit_info = gtts[i]a_labels = generate_a_labels(self.circuit, circuit_info, a_bytes)a_labels_arr.append(a_labels)return a_labels_arr
2.2 传输阶段
发送方将加密的真值表和标签发送给接收方。
发送方还将混淆电路的结构信息(如门之间的连接关系)发送给接收方,但接收方不知道具体的门结构和逻辑。
2.3 执行阶段
接收方根据自己的输入值,使用输入标签替换电路的输入门,这里涉及到1-out-of-2 OT技术,也就是接收方需要将自己的输入值作为选择bit,从混淆方获得对应的随机标签信息。
接收方根据混淆电路的结构信息,使用加密的真值表来计算每个内部逻辑门的输出标签。这里涉及到使用输入的label对每一个对应的门混淆表进行解密,只能正确解密其中的一个真值标签。
接收方根据输出标签替换电路的输出门。
接收方将最终的输出标签发送回发送方。
2.4 解码阶段
发送方使用自己持有的解密密钥,解密接收到的输出标签。
发送方根据解密的结果确定最终的输出值。
Yao‘s混淆电路的实现依赖于加密技术和零知识证明的概念。通过对输入和输出进行加密和混淆,以及仅通过标签的比较来传递计算结果,Yao‘s混淆电路实现了对计算过程的保密性和隐私性。这种技术被广泛应用于安全多方计算和隐私保护领域,以实现在保护敏感数据的同时进行计算。
3.优化手段
混淆电路虽然是一种比较有效的多方安全计算技术,但是目前业内的应用相对有限,这可能是因为其工程实现以及大规模数据上、低带宽下的性能问题。从章节2中可以看到混淆电路可能涉及大量的逻辑门,将会带来庞大的混淆表通信消耗,。因此,自从Yao提出混淆电路后,后续有一系列对该算法的优化,如下图所示,Classical是经典的实现,之后学术界相继提出了点和置换(Point&Permutation)、Garbled Row Reduction(GRR3)、Free XOR、GRR2、FleXOR、半门(HalfGates),可以看到HalfGates在电路大小和garble环节相对classical有了很大的优化。
3.1 点和置换(Point&Permutation)
随机分配颜色对给每对电线标签,在电线标签中包含颜色 (例如,作为最后一位),按密钥的颜色规范地排列四个密文,过解密由你颜色索引的密文来评估。点和置换技术 [BMR90] 使接收方无需尝试解密所有四个密文。它将每根电线 w与两个选择位 p0和 p1以及标签 W0 和 W1相关联。在评估一个门时,接收方使用对应于两个输入电线的选择位(例如, pi和 pj对应于电线 wi和 wj)来确定解密门k中的哪个密文。
def point_and_permute_garble(left_wire, right_wire, output_wire, gate_type):truth_table = generate_truth_table(gate_type)garbled_table = [None] * 4for line in truth_table:output_label = output_wire.get_label_by_value(line[2])key_left = left_wire.get_label_by_value(line[0])key_right = right_wire.get_label_by_value(line[1])ciphertext = enc_hash(key_left.label, key_right.label, bytes_to_int(output_label.label))garbled_table[2 * key_left.pp_bits + key_right.pp_bits] = ciphertextreturn garbled_table
3.2 混淆行减少 (Garbled Row Reduction, GRR3)
混淆行减少 [NPS999],允许消除一个密文。这是通过选择一个标签使得对应的密文为0来实现的。(被消除的密文总是由选择位决定的顶部密文。)
def grr3_garble(left_wire, right_wire, output_wire, gate_type):set_zero_ciphertext(left_wire, right_wire, output_wire, gate_type)garbled_table = [None] * 3for left_label in left_wire.labels():for right_label in right_wire.labels():left_pp = left_label.pp_bitsright_pp = right_label.pp_bitsif left_pp or right_pp:in1 = left_label.valuein2 = right_label.valueboolean_to_str = {True: '1', False: '0'}logic_value = boolean_to_str[logic(int(in1), int(in2), gate_type)]output_label = output_wire.get_label_by_value(logic_value)ciphertext = enc_hash(left_label.label, right_label.label, bytes_to_int(output_label.label))garbled_table[2 * left_pp + right_pp - 1] = ciphertextreturn garbled_table
3.3 自由XOR(FreeXOR)
FreeXOR技术 [KS08] 使得计算XOR门变得无通信代价。它通过固定标签 W0 和 W1之间的关系来实现这一点。在混淆电路时,发送方选择一个随机字符串 。发送方然后随机选择每个标签 W0 并设置 W1=W0⊕R。如果门 gk是一个XOR门,并且以电线 wi 和 wj作为输入,那么电线 wk的新标签可以通过简单地取标签 Wi和 Wj的XOR来计算【2】。
def free_xor_garble(left_wire, right_wire, output_wire, gate_type):if gate_type == 'XOR':C0 = xor(left_wire.label0.label, right_wire.label0.label)C1 = xor(C0, gloVar.R)pp_bit = get_last_bit(C0)f_label = output_wire.label0t_label = output_wire.label1f_label.label = C0f_label.pp_bits = pp_bitt_label.label = C1t_label.pp_bits = not pp_bitreturn None
3.4 GRR2
混淆行减少(Garbled Row Reduction,GRR2)[PSSW09],第二种形式的混淆行减少,允许消除两个密文而不是一个。然而,虽然第一种形式的混淆行减少与Free异或(free-XOR)技术兼容,但这种形式(GRR2)却不兼容。在GRR2中,评估者不是通过解密一次性填充加密来恢复输出标签,而是通过对二次曲线进行多项式插值来完成。输出标签被编码为y轴截距。评估者将拥有三个点来进行插值,这是进行插值所需的最低点数。由于可能存在两个输出标签,因此需要考虑两个不同的二次多项式。它们被设计成在混淆门中包含的两个点上精确相交。
3.5 FleXOR
Kolesnikov等人 [KMR14]提出了通过动态转换电线标签以保持恒定距离R,从而将自由XOR技术与AND门优化相结合的方法。根据是否需要这种转换(即,XOR门的输入是否是AND门的输出),XOR混淆门包含0到2个密文。
3.6 Half Gates
Zahur等人[ZRE15]介绍了第一种仅需要每个混淆AND门两个密文并且与FreeXOR优化兼容的技术。他们利用了对于任意 ,
这一事实。在Half Gates技术中, b 被确定为用来计算选择位
的随机值
。
由混淆方选择,并且
被透露给评估方。利用她对 b的了解,混淆方可以通过单个密文有效地混淆“混淆方半门”
。由于评估方知道
,因此可以基于该值进行不同的操作,混淆方可以同样有效地通过单个密文混淆“评估方半门”
。对这两个AND操作取XOR是无通信代价的,因此只需要两个密文。
def half_gates_garble(left_wire, right_wire, output_wire, gate_type):if gate_type == 'AND':def H(x):return hashlib.sha256(x).digest()p_a = left_wire.label0.pp_bitsp_b = right_wire.label0.pp_bitsC0 = H(left_wire.label0.label)# Generator Half Gateentry1 = xor(C0, H(left_wire.label1.label))if p_b:entry1 = xor(entry1, gloVar.R)if p_a:C0 = xor(C0, entry1)# Evaluator Half GateC0_ = H(right_wire.label0.label)entry2 = xor(C0_, H(right_wire.label1.label))entry2 = xor(entry2, left_wire.label0.label)if p_b:C0_ = xor(C0_, xor(entry2, left_wire.label0.label))table = [entry1, entry2]xor_c0_c0_ = xor(C0, C0_)update_output_wire(xor_c0_c0_, xor(xor_c0_c0_, gloVar.R), output_wire)return tableelif gate_type == 'XOR':return free_xor_garble(left_wire, right_wire, output_wire, gate_type)else:return grr3_garble(left_wire, right_wire, output_wire, gate_type)
4.参考材料
【1】Practical Garbled Circuit Optimizations
【2】A Gentle Introduction to Yao’s Garbled Circuits
相关文章:

【隐私计算篇】混淆电路之深入浅出
入门隐私计算的阶段,一般都会涉及对于混淆电路的学习,这是因为混淆电路是多方安全计算中的基础密码原语,也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理,今天对其进行原理以及相关优化手段进行解析和分享。 1. 混淆…...
基于GRU神经网络的微博分类预测
目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 gru的原理 GRU神经网络微博分类 结果分析 展望 参考论文 背影 传统的方法微博分类预测准确率低,为提高精度,本文用gru进行预测 摘要 LSTM原理,GRU原理,MATALB编程gru的微博分类预测 LSTM的基本定义 LSTM是一种含有LST…...

LVS-DR模式集群:案例与概念
DR模式(直接路由) 概念 Direct Routing,简称DR模式采用半开放式的网络结构,与TUN模式的结构类似,但内网服务器并不是分散在各地,而是与调度器位于同一个物理网络负载调度器与内网服务器通过本地网络连接&a…...
拓扑排序:Kahn算法与DFS算法
引言 拓扑排序是有向无环图(DAG)中的一种线性排序,使得对于图中的每一条有向边 ( u \rightarrow v ),顶点 ( u ) 在排序中出现在顶点 ( v ) 之前。本文将详细介绍两种实现拓扑排序的算法:Kahn算法和基于深度优先搜索&…...
图像处理 -- Sobel滤波器的实现原理与使用案例
Sobel滤波器 概述 Sobel滤波器是一种边缘检测方法,用于图像处理和计算机视觉领域。它通过计算图像灰度值的梯度来检测边缘。Sobel滤波器结合了高斯平滑和微分操作,以减少噪声并增强边缘检测效果。 实现原理 Sobel滤波器通过使用两个3x3卷积核&#x…...

机器学习 第10章-降维与度量学习
机器学习 第10章-降维与度量学习 10.1 k近邻学习 k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。通…...
linux驱动:(7)物理地址到虚拟地址映射
单片机、裸机、linux操控硬件方法 在单片机和裸机中操作硬件是通过指针来对寄存器赋值来进行操控 但对于linux中不能这样,不能直接对物理地址直接修改,因为linux使能了mmu,所以不能直接菜操作物理地址 如果要操作硬件,需要先把…...

浏览器用户文件夹详解 - Preferences(十)
1.Preferences简介 1.1 什么是Preferences文件? Preferences文件是Chromium浏览器中用于存储用户个性化设置和配置的一个重要文件。每当用户在浏览器中更改设置或安装扩展程序时,这些信息都会被记录在Preferences文件中。通过这些记录,浏览…...
Robot Operating System——电池电量通知
大纲 应用场景定义字段解释 案例 sensor_msgs::msg::BatteryState 是 ROS 2 中定义的消息类型,用于表示电池状态。它包含了电池电量、电压、电流、温度等信息。 应用场景 机器人 电池监控:在移动机器人中,电池是主要的电源。BatteryState 消…...
二进制安装docker
目录 一、准备 Docker CE 二进制包 二、解压.tgz包 三、复制二进制文件到/usr/bin/目录 四、创建用户组 五、配置相关服务配置文件 六、拷贝配置文件到指定目录 七、启动 dockerd 服务进程 八、shell脚本一键安装 一、准备 Docker CE 二进制包 https://download.docker…...
@SpringBootConfiguration重复加载报错
Junit单元测试Test启动报错,SpringBootConfiguration注解重复问题排查: SpringBootApplication 注解的 exclude 属性用于排除特定的自动配置类,而不是用于排除主配置类本身。因此,不能通过 exclude 属性来排除主配置类的加载。 …...
【SpringBoot】数据验证之分组校验
分组校验 在不同情况下,可能对JavaBean对象的数据校验规则有所不同,有时需要根据数据状态对JavaBean中的某些属性字段进行单独验证。这时就可以使用分组校验功能,即根据状态启用一组约束。 Hibernate Validator的注解提供了groups参数&#…...

MySQL Galera Cluster 部署与介绍
目录 主要特点 组件 一. 环境准备 二. 配置 1. 配置 galera1 主机的my.cnf的文件 2. 配置 galera2 主机的my.cnf的文件 3. 配置 galera3 主机的my.cnf的文件 4. 在给galera1 主机的my.cnf的文件增加节点 5. 写入数据验证同步 6. 配置 galera4 主机的my.cnf的文件 M…...

RuoYi-Vue-Plus (XXL-JOB任务调度中心二:配置管理与定时任务编写、执行策略、命令行任务、邮件报警等等
一、后端xxl job的配置属性介绍 enabled : 是否开启执行器,如果为false,调度中心就调用不了后端定时任务admin-addresses:调度中心的地址,多个则可以逗号拼接: url1,url2,url3access-token: 执行器通讯TOKEN ,必须和x…...

【docker】虚拟化与docker基础
一、虚拟化 1.虚拟化概述 什么是虚拟化? 虚拟化:将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率 2、虚拟化的功能 将虚拟化的性能优化趋近于物理资源的性能,主要用于提高资源利用…...

Vue3安装ffmpeg做视频截取报错
通过 yarn 安装 ffmpeg 时报错。 即,执行以下指令时报错: yarn add ffmpeg/ffmpeg^0.10.0 yarn add ffmpeg/core^0.10.0错误信息: node_modules\pngquant-bin: Command failed. Error: pngquant failed to build, make sure that libpng-d…...
如何在 Java 中实现自定义的排序算法?
在Java中实现自定义排序算法的步骤如下: 创建一个类,实现Java的Comparator接口,该接口包含一个compare方法,用于比较两个对象的大小。在compare方法中,根据自定义的排序规则,比较两个对象的大小并返回-1、…...
【Homebrew】brew 命令
Brew(也称为Homebrew)是Mac OS上的一款包管理器,它允许用户通过简单的命令行界面来安装、更新、卸载和管理软件包。以下是一些常用的Brew命令及其功能说明: 安装与卸载 安装Brew 命令(适用于大多数用户,可…...
【https】无法安装OpenSSL时如何在局域网开通https服务
【背景】 做Stream传输服务,需要用到fetch方法,所以自然也需要https服务。 公司的开发机由于某些管理上的原因无法直接安装openssl for win的安装包。 【分析】 没有命令行工具,就试试看万能的python包吧,直接安装cryptography包。 pip install cryptography【方法】 …...

OpenGL实现3D游戏编程【连载1】——初探3D世界
1、前言 在我学习C的过程中,研究了一下OpenGL编程,打开了3D世界的编程世界,3D世界的效果还是相当不错。而且OpenGL能够支持跨平台兼容,是不错的学习方向,于是就自己学习了网上的很多教程,并将所有学到的知…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...