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

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

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

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/392536.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不同角色路由权限配置(六)

一、启用方式 配置开启config/config.ts。同时需要 src/access.ts 提供权限配置 export default {access: {},// access 插件依赖 initial State 所以需要同时开启initialState: {}, };这里以扩展的路由配置为例,配置只有admin权限才能查看的页面 1、在src/acces…

前端web开发HTML+CSS3+移动web(0基础,超详细)——第3天

目录 一,列表-无序和有序的定义列表 二,表格-基本使用与表格结构标签 三,合并单元格 四,表单-input标签 五,表单-下拉菜单 六,表单-文本域 七,表单-label标签 八,表单-按钮 …

【已解决】页面操作系统功能,诡异报错500nginx错误

【已解决】页面操作系统功能,诡异报错500nginx错误,后台没有任何报错信息 不知道啥原因 清理了浏览器缓存 也没有效果 还有一个表现情况,同样的操作,有时可以又是不行 因为报错ng的代理问题,检查了ng配置 后续经过同…

【C/C++】C语言和C++实现Stack(栈)对比

我们初步了解了C,也用C语言实现过栈,就我们当前所更新过的有关C学习内容以栈为例子,来简单对比一下C语言和C。 1.C中栈的实现 栈的C语言实现在【数据结构】栈的概念、结构和实现详解-CSDN博客 ,下面是C实现的栈, 在St…

OD C卷 - 多线段数据压缩

多段 线 数据压缩 (200) 如图中每个方格为一个像素(i,j),线的走向只能水平、垂直、倾斜45度;图中线段表示为(2, 8)、(3,7)、(3, 6)、&#xff08…

学习STM32(2)--STM32单片机GPIO应用

目录 1 引 言 2 实验目的 3 实验内容 3.1掌握STM32F103的GPIO控制 3.1.1 GPIO的分组 3.1.2 GPIO的常用功能 3.1.3 STM32单片机GPIO位结构 3.1.4 STM32单片机GPIO工作模式 3.1.5 STM32的GPIO 输出-点亮LED编程要点 使用GPIO时,按下面步骤进行&#xff1…

部署服务器项目及发布

当技术总监直接丢给我一个服务器账号密码时,我该怎么完成映射本机;配置网关;配置代理和发布项目呢? 我使用的是putty远程登录到服务器 输入ip后,点open 输入账号密码 登录的账号如果不是root;使用sudo su…

sqllab靶场练习第1~15关

1、第一关 代码解析 if(isset($_GET[id]))//判断获取的id字段是否为空 { $id$_GET[id]; //logging the connection parameters to a file for analysis. $fpfopen(result.txt,a);//打开这个文件,记录操作的日志 fwrite($fp,ID:.$id."\n"); fclose($fp);…

【C++高阶】深入理解C++异常处理机制:从try到catch的全面解析

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:Lambda表达式 🌹🌹期待您的关注 🌹🌹 ❀C异常 📒1. C异常概念…

WPF学习(3)- WrapPanel控件(瀑布流布局)+DockPanel控件(停靠布局)

WrapPanel控件(瀑布流布局) WrapPanel控件表示将其子控件从左到右的顺序排列,如果第一行显示不了,则自动换至第二行,继续显示剩余的子控件。我们来看看它的结构定义: public class WrapPanel : Panel {pub…

【前端】(仅思路)如何在前端实现一个fc手柄,将手机作为游戏手柄设备。

文章目录 背景界面demo原型图(没错,就是它,童年回忆) 遇到的问题最终后端demo(甚至比前端逻辑更简单) 背景 突发奇想,想要在前端实现一个fc游戏手柄,然后控制电脑的nes模拟器玩玩魂斗罗。 思路很简单&…

【编程笔记】解决移动硬盘无法访问文件或目录损坏且无法读取

解决移动硬盘无法访问文件或目录损坏且无法读取 只解决:移动硬盘无法访问文件或目录损坏且无法读取 问题 由于频繁下载数据,多次安装虚拟机导致磁盘无法被系统识别。磁盘本身是好的,只是不能被识别,如果将磁盘格式化&#xff0c…

Chainlit快速实现AI对话应用1 分钟内实现聊天数据的持久化保存

概述 默认情况下,Chainlit 应用不会保留其生成的聊天和元素。即网页一刷新,所有的聊天记录,页面上的所有聊天记录都会消失。但是,存储和利用这些数据的能力可能是您的项目或组织的重要组成部分。 一旦启用,数据持久性…

Unlikely argument type for equals(): int seems to be unrelated to Long

代码审查不规范: Unlikely argument type for equals(): int seems to be unrelated to Long check package code_check;public class Obj {public Obj(){}private Long mail;public Long getMail(){return mail;}public void setMail(Long mail){this.mail mail;…

【零基础实战】基于物联网的人工淡水湖养殖系统设计

文章目录 一、前言1.1 项目介绍1.1.1 开发背景1.1.2 项目实现的功能1.1.3 项目硬件模块组成1.1.4 ESP8266工作模式配置 1.2 系统设计方案1.2.1 关键技术与创新点1.2.2 功能需求分析1.2.3 现有技术与市场分析1.2.4 硬件架构设计1.2.5 软件架构设计1.2.6 上位机开发思路 1.3 系统…

Java | Leetcode Java题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; class Solution {Random random new Random();public void wiggleSort(int[] nums) {int n nums.length;int x (n 1) / 2;int mid x - 1;int target findKthLargest(nums, n - mid);for (int k 0, i 0, j n - 1; k < j; k) {if…

DAMA学习笔记(十)-数据仓库与商务智能

1.引言 数据仓库&#xff08;Data Warehouse&#xff0c;DW&#xff09;的概念始于20世纪80年代。该技术赋能组织将不同来源的数据整合到公共的数据模型中去&#xff0c;整合后的数据能为业务运营提供洞察&#xff0c;为企业决策支持和创造组织价值开辟新的可能性。与商务智能&…

使用Go语言绘制柱状图教程

使用Go语言绘制柱状图教程 本文将介绍如何使用Go语言及gg包绘制柱状图&#xff0c;并将图表保存为PNG格式的图片。gg包是一个功能强大的2D图形库&#xff0c;适合用于绘制各种图表。 安装gg包 首先&#xff0c;确保你已经安装了gg包。如果还没有安装&#xff0c;可以使用以下…

【安当产品应用案例100集】005-安当ASP实现Exchange双因素登录认证

Exchange双因素登录通过增加额外的安全验证层&#xff0c;可以有效提高企业邮箱系统的安全性&#xff0c;减少了数据泄露和账号被盗的风险&#xff0c;同时也符合了日益严格的安全合规要求。 其必要性主要体现在以下几个方面&#xff1a; 提高安全性&#xff1a;传统的用户名…

1.MySQL面试题之innodb如何解决幻读

1. 写在前面 在数据库系统中&#xff0c;幻读&#xff08;Phantom Read&#xff09;是指在一个事务中&#xff0c;两次读取同一范围的数据集时&#xff0c;由于其他事务的插入操作&#xff0c;导致第二次读取结果集发生变化的问题。InnoDB 作为 MySQL 的一个存储引擎&#xff…