当前位置: 首页 > news >正文

【隐私计算篇】混淆电路之深入浅出

        入门隐私计算的阶段,一般都会涉及对于混淆电路的学习,这是因为混淆电路是多方安全计算中的基础密码原语,也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理,今天对其进行原理以及相关优化手段进行解析和分享。

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之间的关系来实现这一点。在混淆电路时,发送方选择一个随机字符串 R \in \{0,1\}^b。发送方然后随机选择每个标签 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优化兼容的技术。他们利用了对于任意 b \in \{0,1\}v_i \land v_j = (v_i \land (v_j \oplus b)) \oplus (v_i \land b)这一事实。在Half Gates技术中, b 被确定为用来计算选择位 p_j = v_j \oplus r_j的随机值r_jb = r_j由混淆方选择,并且v_i \oplus b = p_j被透露给评估方。利用她对 b的了解,混淆方可以通过单个密文有效地混淆“混淆方半门”v_i \land b。由于评估方知道v_i \oplus b,因此可以基于该值进行不同的操作,混淆方可以同样有效地通过单个密文混淆“评估方半门” v_i \land (v_j \oplus 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能够支持跨平台兼容,是不错的学习方向,于是就自己学习了网上的很多教程,并将所有学到的知…...

工程化实践:工程配置化设计

文内项目 Github:XIAOJUSURVEY 配置化是很灵活且很常见的使用,那XIAOJUSURVEY里有哪些地方应用到了呢? 基础模板​ 问卷模板​ 在创建问卷时,我们提供了多种问卷类型选择,例如普通问卷、投票、报名、NPS等。 为了实…...

浏览器事件循环详解

1. 浏览器的进程模型 1.1. 何为进程? 程序运行需要有它自己的专属内存空间,可以把这块内存空间简单的理解为进程。 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 1.2. 何为线程&#xff1f…...

Linux:线程管理(线程创建、线程退出、线程回收、线程分离、其它线程函数)

线程管理 (1)What(什么是线程管理) 对程序中线程的创建、调度、同步、退出、回收等操作进行有效的控制和协调 (2)Why(为什么要管理线程) 充分利用系统资源,提高程序的并发的性能和稳定性。但如果管理不当,…...

【JVM】常见面试题

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. JVM 中的内存区域划分2. JVM 的类加载机制2.1 加载(Loading)✨双亲委派模型2.2 验证(Verification)2.3 准…...

0805作业+梳理

一、作业&#xff1a; 代码&#xff1a; create.c #include<myhead.h> int main(int argc, const char *argv[]) {//创建一个有名管道文件if(mkfifo("./linux",0664)-1){perror("mkfifo linux error");return -1;}getchar();system("rm linux…...

Java高并发编程详解教程(对高并发更深一层的领悟和体会 电子版)

前言 第一部分主要阐述Thread的基础知识&#xff0c;详细介绍线程的API使用、线程安全、线程间数据通信以及如何保护共享资源等内容&#xff0c;它是深入学习多线程内容的基础。 在第二部分中之所以引人 ClassLoader&#xff0c;是因为 ClassLoader 与线程不无关系&#xff0…...

字符串中的第一个唯一字符

给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 s 只包含小写字母 示例 1&#xff1a; 输入: s "leetcode" 输出: 0示例 2: 输入: s "loveleetcode" 输出: 2示例 3: 输…...

leetcode数论(​3044. 出现频率最高的质数)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 描述 给你一个大小为 m x n 、下标从 0 开始的二维矩阵 mat 。在每个单元格&#xff0c;你可以按以下方式生成数字&#xff1a; 最多有 8 条路径可以选择&#xff1…...

70.加载功能菜单功能设计

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;69.搭建分析工具界面 以 69.搭建分析工具界面 它的代码为基础进行修改 效果图&#xf…...

在线Banner设计工具大比拼:谁更胜一筹

在数字营销的时代&#xff0c;一个吸引眼球的 Banner 广告是吸引潜在客户、提高品牌知名度的关键。为了帮助营销人员和设计师快速创建专业的 Banner 广告&#xff0c;市面上出现了多种易于使用的 Banner 设计工具。本文将介绍几个受欢迎的 Banner 设计工具&#xff0c;包括即时…...