多方安全计算(4):MPC万能积木-秘密共享
学习&转载文章:多方安全计算(4):MPC万能积木-秘密共享
前言
在之前的文章(多方安全计算(3)MPC万能钥匙:混淆电路中,我们对MPC中一类通用方案混淆电路(GC)与密文比较策略做了介绍。混淆电路通过将任务抽象为电路以及对基础电路提供加密方案达到了万能钥匙的效果。在姚期智先生提出GC方案不久后,Goldreich等人[1]提出了GMW范式,给通用的密文计算任务指明了一条新的方向。
与GC不同,GMW范式认为既然一个电路可以由与门或者或门组成,那么如果对与门和或门都可以做到输入与输出都为密文形式,且加密形式相同,那么就可以将初始的计算任务拆解为若干子计算步骤,通过逐步的完成密文计算就可以做到在密文下完成整个计算任务。当然,一个真实的计算任务从与门、或门出发是不合适的;一个更自然的出发点是加法计算与乘法计算,而本文将介绍如何通过秘密共享(也常被称为秘密分享)技术在MPC任务中完成加法与乘法计算。读者可以想象,这类似于搭积木,而基础的积木块就是密文加法与密文乘法。
- GC是通过与门或者或门构造任意计算
- SS是通过加法和乘法构成任意计算
宏观上说,如图一所示,多方安全计算以不经意传输为根基,基于此可以构造出混淆电路与秘密共享两类通用方案。值得注意的是,此三类方案在理论上都可以完成任意的密文计算任务;但在实际的方案中,往往由于效率上的取舍而构造更定制化的协议。
图1 多方安全计算概览
秘密共享
秘密共享技术事实上早于MPC被提出,其最初是为了解决密钥存储相关的问题,其最初的设计思路可参考文章(秘密共享—隐私计算和区块链共识中的榫卯)。简单起见,本文直接给出秘密共享的通用定义形式。
定义1:(接入结构)
定义(p_1,...,p_n)为参与方集合,(Ain 2^{p_1,...,p_n})为参与方集合的一个集族。如果集合(Bin A)且(Bin C)可推出(Cin A),那么集族(A)就是单调的。接入结构定义为(p_1,...,p_n)的非空子集的一个单调集族(A)。接入结构(A)内的集合被称为授权集合,接入结构外的集合被称为未授权集合。
此处通过定义授权集合来确定秘密应该被哪些参与方知晓。
定义2:(秘密共享)
如果以下条件成立,那么分配方案是在秘密的给定概率分布(S)上实现接入结构(A)的一个秘密共享方案,此处(H)表示信息熵。
正确性:对于每个授权集合(Bin A),有(H(S|S_B)=0)。
安全性:对于每个未授权集合(T otin A),有(H(S|S_T)=H(S))。
即对授权集合用户来说,更多的其它参与方也不能得到额外的信息;而对未授权集合,他们事实上未得到任何信息。因为上述定义需要绝对的正确性与安全性,以上定义也常被称为完美秘密共享;如将上述公式中的等号换成约等号,则相应方案常被称为统计秘密共享;在MPC计算中通常只关注于完美秘密共享方案。
以上定义是从信息论层面定义的秘密共享,即只有授权的参与方才能得到有用的信息。
密文加法
完美秘密共享有多种构造方法,通常也对应着不同的密钥管理需求;但在MPC中通常不聚焦于此;与同态类似,我们更关注于其计算的同态性。如本文开头所述,我们需要让单步计算的输入与输出保持同样的密文格式。
在MPC计算中,我们通常使用最简单的秘密共享方案:加法秘密共享。
可参考:Shamir秘密共享
例如,有原始的秘密值4,有两个参与方(S_1)与,(S_2),那么在经过加法秘密共享后,参与方(S_1)可能得到分享值3, (S_2)对应得到分享值1。当然,实践中我们通常选用一个较大的环(比如uint64)来完成秘密共享,需保证原始秘密值在这个环中,而分享值等可能的为环上的任意数;方便起见,后文中所述运算都为环中的运算,不再显式说明。
那么加法秘密共享是如何保证自然的保证加法同态性的呢?
有原始两份秘密(a)与(b);那么由于输入时秘密已被分享,比如(S_1)方持有((a_1,b_1)),(S_2)方持有((a_2,b_2)) ,那么由于有(a_1+b_1+a_2+b_2=a+b);那么每一方无需与另一方通信,即可在不暴露原始明文的情况下完成密文加法,计算完后(S_1)方持有(a_1+b_1),(S_2)方持有(a_2+b_2)。特别的,如果是已知的明文与秘密值相乘,也可以视为密文加法运算。
密文乘法
上一节中我们描述了加法秘密共享方案如何自然的完成密文加法,然而此类方案在不交互的情况下完成密文乘法是不可能的。早期文献往往通过OT等方案辅助完成密文乘法;幸运的是,Beaver[2]提出一种被称为beaver triples
的策略来更加优雅与一致的解决了这个问题。
- 目的计算:(xy)
具体来说,Beaver将密文计算过程分为离线阶段与在线阶段;离线阶段即获得实际秘密之前的阶段。 beaver triples
通过在离线阶段生成一个三元组((a,b,c)),保证((c=ab));然后让参与方(S_1)与(S_2)分别获得((a_1,b_1,c_1))与((a_2,b_2,c_2))。
- 需要引入一个三元组:((a,b,c)),满足(c=ab),参与方(S_1)和(S_2)分别有((a_1,b_1,c_1))与((a_2,b_2,c_2))
然后在某个时间点,参与方分别获得了实际秘密与的分享值((x_1,y_1))与((x_2,y_2))。容易注意到,存在如下公式:((x-a)(y-b)=x y-a(y-b)-b(x-a)-ab)
- 进行秘密分发:(S_1)有秘密分片((a_1,b_1,c_1,x_1,y_1))和(S_2)有秘密分片((a_2,b_2,c_2,x_2,y_2))
此时,两参与方(S_i(i=1,2))只需分别计算如下步骤(注:步骤中(=)为赋值运算符):
① (S_i)在本地计算 (e_i=x_i-a_i,f_i=y_i-b_i);
②(S_i)通过一轮交互【加法】恢复出(e)与(f);
③(S_i)在本地计算(xy_i=c_i+b_ie+a_if),然后(S_1)进一步计算(xy_1=xy_1+ef)。
- 进行秘密重构:引入辅助信息((e=x-a)和(f=y-b)),所以(ef=(x-a)(y-b)=x y-a(y-b)-b(x-a)-ab),即(xy=ef+af+be+c)
- 其中(e,f)可以通过加法恢复出来,接下来各方通过(xy=x(y_1+y_2)=xy_1*xy_2)完成乘法计算。
其过程如下图所示。
图2 两方密文乘法过程
容易注意到,上述步骤实质上构造出了公式中除(xy)外每一项的加法分享;通过离线阶段的乘法替代了在线阶段的乘法。该方案也是两方(也可拓展为任意多方)秘密共享策略密文乘法的通用策略,但如何快速的在离线阶段生成beaver triples
是一个十分有趣艰深且仍在不断探索的问题。
例子
本节中我们描述一个简单的使用场景:安全地提取传感器收集信息的特征。简单来说,系统模型如下:
这也是一个边缘计算的例子
图3 传感器信息密文特征提取
1、传感器搜集原始图像信息,然后借助两个边缘服务器完成信息的处理,并将结果反馈给用户。此处由于传感器无力完成信息的处理步骤,而不得不借助外部服务器;而传感器直接搜集的信息往往敏感而不能直接公开,因而需要保证边缘服务器们只能得到密文的输入。
2、针对图像的特征提取往往使用卷积神经网络。
卷积神经网络常常由全连接层、卷积层、激活函数层与池化层组成。
-
卷积层与全连接层仅涉及乘法与加法。例如,某卷积层的神经元共享同样的权重和偏置值;在计算这一层时,第((j,k))个输出神经元是通过计算(y_{j, k}=sum_{l=0}^{n-1} sum_{m=0}^{n-1} w_{l, m} x_{j+1, k+m}+b)得到的,其中(w_{l,m})与(x_{j+1,k+m})为权重矩阵(W)与输入神经元对应位置的值。当使用预训练神经网络时,权重(W)与(b)为已知值。全连接层的计算与之类似,不再赘述。
-
激活函数层为神经网络提供非线性。常见的激活函数,一类如
sigmoid
,其涉及指数运算与除法运算;另一类如ReLU
,其仅涉及比较运算。诸如前者,通常可使用泰勒展开等方式将其转换为多项式,然后即可使用密文乘法与加法完成。而后者由于涉及比较运算,可借助于混淆电路中的方案完成;在之后的文章中,我们也将进一步介绍如何仅使用秘密共享完成比较计算。 -
池化层分为最大池化与平均池化。最大池化层首先将输入分为若干个非重叠的小块,然后找出每个小块中最大的值并保留该值,而将其余值都置为0;平均池化计算每个小块中值的平均值,并用该平均值替换原来的值。对于前者同样涉及密文比较计算,而后者只是一个普通的密文加法运算,可在秘密共享中各方独立完成。
就这样,依靠本文所介绍的密文加法与乘法策略,再简单结合之前文章中的GC比较策略,我们就可以做到密文神经网络的计算,从而进一步完成密文传感器信息的特征提取,而只需传感器进行简单的加法秘密共享计算。
熟悉联邦学习的朋友可能注意到,上述策略如果应用于密文神经网络训练则与联邦建模目标一致;但请注意两类方案有着本质的不同:
- MPC对每一步基础计算都做了密文替换,而联邦学习通常只对梯度等信息做了一定程度的遮掩;
- MPC类方案输入信息与神经网络参数的安全性由严格的困难性假设保证,但在效率上也仍有较大的改善空间。
总结
本文简要的介绍了多方安全计算中另一个重要工具秘密共享,并以加法秘密共享这一最简形式为例,介绍了密文加法与密文乘法的计算方法。值得注意的是,相比于GC类方案,秘密共享更符合直觉,也更多停留在数值计算的层次,因而在实际编码实现与应用中更占优势。虽然通过本文介绍的方案,在理论上已可以计算任意的密文计算,然而更高效的计算方式往往需要更定制化的密文计算协议,在真实的计算机中往往也有着更复杂的取舍。在之后的文章中,我们将介绍诸如比较与除法等基础计算模块的密文协议构造方法,也将介绍更多已有的开源密文计算框架。
参考文献
[1] Micali S, Goldreich O, Wigderson A. How to play any mental game[C]//Proceedings of the Nineteenth ACM Symp. on Theory of Computing, STOC. ACM, 1987: 218-229.
[2] Beaver D. Efficient multiparty protocols using circuit randomization[C]//Annual International Cryptology Conference. Springer, Berlin, Heidelberg, 1991: 420-432.
相关文章
- 直接在代码里面对list集合进行分页
- .NET Framework 4.5新特性详解
- 大数据的简要介绍
- 大数据的由来
- 高斯混合模型的自然梯度变量推理
- timing-wheel 仿Kafka实现的时间轮算法
- 使用Navicat软件连接自建数据库(Linux系统)
- 那一天,我被Redis主从架构支配的恐惧
- Redis 深入了解键的过期时间
- C#使用委托调用实现用户端等待闪屏
- 基于流计算 Oceanus 和 Elasticsearch Service 构建百亿级实时监控系统
- GRAND | 转录调控网络预测数据库
- JFreeChart API中文文档
- 临床相关突变查询数据库
- TIGER | 人类胰岛基因变化查询数据库
- 视频边缘计算网关EasyNVR在视频整体监控解决方案中的应用分析
- Apache Arrow - 大数据在数据湖后的下一个风向标
- 常见的电商数据指标体系
- AKShare-艺人数据-艺人流量价值
- MySQL中多表联合查询与子查询的这些区别,你可能不知道!