标签:P2 协议 P1 MPC 导线 初识 oplus OT
MPC调研报告
这是一篇关于MPC的调研报告,主要介绍了我对MPC领域的一些基础认识。全文按照这样的方式组织:第一节我介绍了什么是MPC以及MPC的起源;第二节介绍了MPC领域常用的一些符号和安全定义;第三节描述了基础的MPC协议包括GC,GMW,BGW,GESS和OT协议,主要介绍了协议的执行过程;第四节给出了GC,原始GESS和降低秘密份额开销的GESS,以及基于公钥的OT协议的个人实现;第五节总结了我的调研结果,叙述了个人在调研过程中的感受。
1. MPC简介
安全多方计算(Secure Multi-Party Computation,MPC)由姚期智先生于1982年提出。MPC起源于百万富翁问题:两个百万富翁都想知道谁富有,但是又都不想让对方知晓各自的财产数目。百万富翁问题可以抽象为这样一个问题:有两个参与方,第一个参与方拥有私有输入\(x_1\),第二个参与方拥有私有输入\(x_2\),同时有一个函数\(F(x_1,x_2)\)被定义为返回\(x_1\leq x_2\)的布尔值,两个参与方输入\(x_1,x_2\)得到返回值\(F(x_1,x_2)\)。由于\(x_1,x_2\)都是私有输入,因此不会泄露\(x_1\)和\(x_2\),但是可以双方可以共享\(F(x_1,x_2)\)的结果。
百万富翁问题是MPC在具体场景下的典型应用,但是它并不能完全代表MPC。在百万富翁问题中双方共享输出结果后,对于任一参与方来说都可以获得对方私有输入的相关信息,例如假设\(x_1=5\),计算结果为True, 那么至少可以知道\(x2\geq5\)。目前的MPC都不解决或者说关心的问题是用户如何从输出中推测出其他参与方的私有输入。MPC的定义为:MPC允许一组相互独立的数据所有方在互不信任且不信任任何公开第三方的条件下,以各自的私有输入联合完成某一个函数的计算。
MPC所完成的功能可以看作是在加密数据上完成功能函数的计算,与之有类似的功能是全同态加密(Fully Homorphic Encryption, FHE).FHE同时支持加法和乘法运算,常数0和1,以至于FHE可以在加密数据上实现任意有限函数的计算。通过在FHE中引入多密钥技术可以实现MPC,但是MPC与FHE是两种完全不同的MPC实现方式,综合来看FHE和MPC的性能对比结果取决于计算和通信带宽的成本。
2. 符号以及一些安全定义
2.1 符号
在描述MPC时通常具有一些惯用的表示,这些符号和解释可以描述如下
符号 | 含义 |
---|---|
$$MPC$$ | 安全多方计算 |
$$SFE$$ | 安全函数求值 |
$$Enc_k(m)$$和$$Dec_k(m)$$ | 用密钥k加密和解密消息m |
$$k$$ | 安全参数,一般设置为128 |
$$2PC$$ | 两方MPC |
2.2 安全定义
主要介绍一些在安全多方计算中经常使用的安全性定义。
理想世界:存在一个完全可信的第三方的想像中的世界
现实世界:不存在可信的参与方,攻击者可以攻陷参与方
协议是安全的:如果攻击者实施攻击以后,在现实世界与理想世界产生的攻击效果相同,则认为协议是安全的
半诚实攻击者:攻击者可以攻陷参与方,但是被攻陷的参与方会遵循协议规则执行协议,也称被动攻击者
恶意攻击者:可以攻陷参与方,并且被攻陷的参与方能够以任意偏离协议规则的方式执行协议,也称主动攻击者
输出公平性:在理想世界中,如果攻陷参与方可以得到输出,那么所有的参与方都可以得到输出
可中止安全性:在2PC协议中,一方可以在另一个参与方之前得到最终输出,因此攻陷参与方可以在得到输出后终止协议。可中止安全性定义为:输出函数只将输出结果交付给攻陷参与方,随后攻陷产预防发出命令决定诚实参与方是否中止协议。在描述功能函数时一般不讨论可中止安全性,但是在描述恶意攻击者时一般要讨论可中止安全性,并且不讨论输出公平性。
适应性攻陷:攻击者可以在协议执行过程中根据自己获得信息选择攻陷哪一个参与方
静态性攻陷:在协议执行过程中,被攻陷的参与方是固定不变的
第三节和第六节描述的协议都是静态性攻陷场景下的MPC协议。第三节描述的协议都是在半诚实攻击者下是安全的,第六节描述的协议在恶意攻击者下是安全的。
2.3 基础原语
一些密码学原语在MPC中经常作为基础工具来使用包括AES,secret sharing等,在本节中,我把一些专用功能函数也当作基础原语来描述,尽管他们并不是,但是他们充当的角色与基础原语相同,我认为这样分类是合理的。
-
\(AES\)
指AES加密算法
-
秘密共享\((Secret\ Sharing)\)
秘密共享是很多MPC协议核心构造模块。秘密共享由Shamir开创,一个(t,n)秘密共享的含义为:将一个秘密值s分成n份,任意t个人在一起可以恢复完整的秘密S,但是任意少于t个人都无法恢复秘密S,更进一步讲,任意少于t个人都无法获得关于秘密S的任何信息。(t,n)秘密共享又称(t,n)门限秘密共享,t被叫做门限,其中一个最经典的实现是Shamir提出的利用Lagrange插值法进行秘密重建的方法,其大致思路为:
Share:生成度最多为t-1的多项式f,令f(0)=S。选择多项式上随机t个点(x,f(x)),将f(x)分给t个人
Reconstruct:根据t个点(x,f(x)),利用拉格朗日插值法重构多项式f,计算S=f(0)
特别需要指出的是(2,2)秘密共享,即将秘密分成2份,需要2个人在一起才能恢复秘密S,若采用Shamir秘密共享则效率太低,因此通常的构造方法为:
Share:生成一个随机数r,一方拥有随机数r,另一方拥有$$r\oplus S$$
Reconstruct:\(S=r\oplus(r\oplus S)\)
-
随机预言机(Random Oracle, RO)
随机预言机机的功能可以看作是将一个在输入允许范围内任意长的比特串一一映射为一个长为k的随比特串。其基本思想是将哈希函数H看作是公开的理想随机函数。工作原理是:如果输入的比特串x之前已经调用过H,则直接返回之前存储的rx=H(x)的值;若没有调用过H,则返回一个长为k随机字符串,并记录\((x,rx=H(x))\)。
-
不经意传输(Oblivious Transfer, OT)
这里介绍的OT为2选1-OT协议。
2选1-OT的定义为:有一个发送方\(S\),持有两个秘密值\(x_0,x_1\)。有一个接收方\(R\),持有一个选择比特\(b\in \{0,1\}\)。
OT允许\(R\)得到\(x_b\),但其无法得到\(x_{1-b}\)的任何信息,\(S\)无法得到任何信息。
2选1-OT的形式化定义如下:
参数:
- 两个参与方:发送方S,接收方R。S拥有两个秘密值\(x_0,x_1 \in \{0,1\}^n\),R拥有一个选择比特\(b\in \{0,1\}\)
功能函数:
- \(R\)将\(b\)发送给功能函数\(F^{OT}\),S将\(x_0,x_1\)发送给功能函数\(F^{OT}\)
- \(R\)收到\(x_b\),S收到\(\bot\)
可以通过图片来描述
-
零知识证明(Zero-Konwledge, ZK)
零知识证明允许证明方让验证方相信证明方自己知道一个满足F(x)=1的x,但是不会泄露关于x的任何信息,F是一个函数。举个例子,现在有一个保险箱,Bob需要向Alice证明的是自己能够打开保险箱,但是并不向Alice透露自己是如何打开保险箱的。为此Bob首先让Alice在保险箱里放入一个Bob事先并不知道的物品A,之后Alice将保险箱交给Bob, Bob在Alice不知道的地方隐蔽地打开保险箱,取出物品B交给Alice。如果A与B相同,则Alice相信Bob确实能够打开保险箱,由于Bob打开保险箱地过程没能让Alice知晓,因此Alice没能获得关于Bob如何打开保险箱的任何信息。
零知识证明地形式化定义如下:
参数
- 两个参与方:证明方\(P\)和验证方\(V\)
功能函数
- \(P\)将\((C,x)\)发送给功能函数\(F^{zk}\),其中\(C:\{ 0,1\}^n \rarr \{0,1\}\)是输出为一个比特值得布尔电路,而\(x\in \{0,1\}^n\)。如果\(C(x)=1\),则\(F^{zk}\)将(已证明,\(C\))发送给\(V\)。否则\(F^{zk}\)将\(\bot\)发送给\(V\)
3. 基础MPC协议
本节中介绍的MPC协议都是最基础的MPC协议,并且这些MPC协议都只能抵御半诚实攻击者。3.1介绍的GC协议是最先提出的MPC协议,也是最著名、最广为人知的协议,一般认为GC协议具有最优的执行效率。3.2介绍的GMW协议采用秘密共享的方式,让各个参与方持有激活导线值得加法秘密份额来实现MPC。3.3介绍的BGW协议是首批支持多个参与方计算的MPC协议之一,巧妙的运用了Shamir秘密共享方案的同态特性实现MPC。3.4介绍的GESS协议是目前为止最高效的信息论安全乱码电路方案,其直接在导线上进行秘密共享,在密文状态下完成了对布尔门的求值。
我在本节中详细的描述了GC协议和GESS协议,包括协议的主要思想,协议的执行过程,协议的效率以及安全性等,并且在第4节中给出了这两个协议的实现,尤其采用多线程的方式仿真的实现了GC协议。对于GMW和BGW协议只是简单的描述了原理和大致的执行过程。
3.1 GC协议
在描述GC协议之前,需要先明确一些定义:
F(x,y):给定的求值函数
P1,P2:两个参与方,P1持有\(x\in X\),P2持有\(y\in Y\).其中\(X,Y\)分别表示P1和P2的输入域
C:布尔电路
\(k_x\):与输入\(x\)相对应的密钥\(k\)
标识置换:将密钥的的一部分作为(即第一个密钥的后\(log{|X|}\)和第二个密钥的后\(log{|Y|}\))作为查找表T的置换标识,标识密钥应该用来加密哪行密文,根据置换标识对加密后的查找表进行置换。置换标识不仅完成了查找,也同时确定了置换策略。
导线标签:与导线输入值相对应的密钥
导线值:导线的明文值
激活标签:用户选中的导线输入值对应的导线标签
激活值:用户选中的导线的明文值
查找表,乱码表,解码表:查找表是将F(x,y)的每一个输出做成表格,每一行\(T_{x,y}=F(x,y)\)。乱码表是经过标识置换后的查找表。解码表是将导线输出值与导线标签一一对应的表。
3.1.1 GC的主要思想
GC的主要思想从名字可以窥见一二:GC=电路+混淆(乱码)。电路的意思是函数F表示成布尔电路,混淆的意思是求值方P2无法从查找表中获得任何额外信息,除非P2拥有两根导线的激活标签。将F表示成布尔电路意味着电路中肯定不止一个布尔门,由于每个布尔门的求值的实现逻辑相似,为了简便起见,接下来我只描述一个布尔门的求值过程,并且假设这个布尔门为AND门。
这个异或门共有两根输入导线,一根输出导线。P1拥有一根输入导线,其输入为x_0,x_1。P2拥有一根输入导线,其输入为y_0,y_1。P1和P2输入域都为{0,1}。导线的输出z0,z1,其值域也为{0,1}。对于AND门,真值表为:
P1 | P2 | 输出 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
为了不透露真实的导线值,P1为电路C的每一个输入都生成一个导线标签,为每一个输出也都生成一个标签。设P1的两个导线标签为\(k_i^0,k_i^1\)分别与输入值0,1对应。设P2的导线标签为\(k_j^0,k_j^1\)分别与输入值0,1对应。设输出导线的标签为\(k_t^0,k_t^1\)分别与输出值0,1对应。P1按照真值表的顺序用输入导线标签对输出导线标签加密,生成查找表:
\[T_{G}=\left(\begin{array}{l} \mathrm{Enc}_{k_{i}^{0}, k_{j}^{0}}\left(k_{t}^{0}\right) \\ \mathrm{Enc}_{k_{i}^{0}, k_{j}^{1}}\left(k_{t}^{0}\right) \\ \mathrm{Enc}_{k_{i}^{1}, k_{j}^{0}}\left(k_{t}^{0}\right) \\ \mathrm{Enc}_{k_{i}^{1}, k_{j}^{1}}\left(k_{t}^{1}\right) \end{array}\right) \]接下来P1对查找表\(T_G\)进行置换,生成乱码表\(T_G'\):
\[T_{G}’=\left(\begin{array}{l} \mathrm{Enc}_{k_{i}^{0}, k_{j}^{1}}\left(k_{t}^{0}\right) \\ \mathrm{Enc}_{k_{i}^{1}, k_{j}^{0}}\left(k_{t}^{0}\right) \\ \mathrm{Enc}_{k_{i}^{1}, k_{j}^{1}}\left(k_{t}^{1}\right) \\ \mathrm{Enc}_{k_{i}^{0}, k_{j}^{0}}\left(k_{t}^{0}\right) \end{array}\right) \]以及解码表D:
输出导线标签 | 导线值 |
---|---|
\(k_t^0\) | 0 |
\(k_t^1\) | 1 |
接下来Alice将自己的激活标签、乱码表和解码表发送给P2。P2在收到解码表和乱码表后,根据自己的选择比特,采用2选1-OT从P1那里获得自己的激活标签。之后P2根据置换标识,对乱码表中的某一行解密得到输出导线值得激活标签,再根据解码表,得到对应的输出导线值后,将输出导线值发送给P1,双方共同获得了导线输出值。
3.1.2 GC协议的执行过程
针对一个AND门的GC协议执行过程可以简化的描述如下(不涉及具体的实现描述),协议涉及的OT会在3.5节描述,加密函数H在第4节描述。
协议执行之前的准备:
参数:
- 布尔电路c
- 安全参数k
生成乱码电路:
生成导线标签。P1对C的每一条输入导线生成导线标签和置换标识,对输出导线生成导线标签,P1的导线标签记为\((k_a^0,p_a^0),(k_a^1,p_a^1)\),P2的导线标签记为\((k_b^0,p_b^0),(k_b^1,p_b^1)\),输出导线标签记为\(k_c^0,k_c^1\)
构造乱码电路。\(G(x,y)=x\&y\)
构造乱码表。G的输入值为\(v_a,v_b\in \{0,1\}\)对于每一个输入组合计算:
\[e_{v_{a}, v_{b}}=H\left(k_{a}^{v_{a}}\|k_{b}^{v_{b}}\right) \oplus k_{c}^{G\left(v_{a}, v_{b}\right)} \]根据置换标识将\(e_{v_a,v_b}\)放置在\(<p_a,p_b>\)上
输出解码表:
- \(k_t^0\rightarrow 0\),\(k_t^1\rightarrow 1\)
协议执行过程:
参数:
- 参与方P1,P2。其输入分别是\(x\in \{0,1\}^n\),\(y\in \{0,1\}^n\)
- 布尔电路C
协议:
P1执行上述协议执行前的准备阶段,将自己的激活标签\(k_a^0\)、乱码表\(T\)和解码表\(D\)发送给P2
P2根据自己的选择比特\(b\),与P1之间执行2选1-OT协议,OT协议执行完毕后,P2获得自己的激活标签\(k_b^1\)
P2根据双方激活标签上附加的标识比特对乱码表解密,得到导线输出的激活标签\(k_c^0\)
\[w_{c}=H\left(k_{a}\|k_{b}\right) \oplus e_{p_{a}, p_{b}} \]P2对照解码表获得输出明文值0,并将输出明文值发送给P1,双方将0作为协议的输出
3.1.3 协议分析
-
协议的正确性
对于AND门,若P1的输入为0,P2的输入为1,则最终结果应当为0.
假设\(p_a=0,p_b=1\),那么在协议中 \(e_{0, 1}=H\left(k_{a}^{0}\|k_{b}^{1}\right) \oplus k_{c}^{0}\),这是P2收到的最终解密的乱码表中的一项。P2执行解密的操作为
\[w_{c}=H\left(k_{a}^0\|k_{b}^1\right) \oplus e_{0, 1}=H\left(k_{a}^0\|k_{b}^1\right) \oplus H\left(k_{a}^{0}\|k_{b}^{1}\right) \oplus k_{c}^{0}=k_c^0 \]根据解码表\(k_c^0\)对应0,因此最终输出为0。正确性满足。
-
协议的安全性
在协议执行过程中,P1发送的为导线的激活标签,并不是导线值且P2不知道导线标签与导线值的对应关系,因此P2无法得知P1输入的导线值。在OT协议中P1只提供输入导线标签,不接收任何输出,因此P1无法得知P2的激活标签,也就无法得知P2的输入导线值。安全性满足。
除此之外,我认为还有两个问题需要解释。
-
为什么需要标识置换
我认为置换是GC的灵魂。假若没有置换,若P2知晓P1是按真值表的顺序(0,0),(0,1),(1,0),(1,1)来制作乱码表。那么当P2解密完成后,P2根据输出激活标签在乱码表中处于哪一行,P2能推测出乱码表每一项的输出。例如最终的激活标签对应的导线值为1,P2知道了乱码表上面三行对应导线值的分别是0,0,0即使P2并不能解密乱码表的中的其他项。这就违反了安全性准则。
-
当P2拿到输出1以后,P2拥有输入1,那么P2不久能推测出P1的输入为1吗
P2得到输出1,自己拥有输入1,P2在不知道C是AND门的情况下是无法得知P1的输入为1,除非P2知晓乱码表中的每一项。即使P2知晓计算电路为AND门,对于MPC来说,这也不是MPC所关心的,因为MPC并不组织参与方从输出中推测出其他参与方输入信息。
3.2 GMW协议
GMW协议大致执行过程:
1.对于P1的输入x,P1与P2执行(2,2)秘密共享,P2获得随机数\(r_x\),P1获得\(x \oplus r_x\).对于P2的输入y,P2与P1执行(2,2)秘密共享,P1获得随机数\(r_y\),P2获得\(y\oplus r_y\)
2.对于AND门,P1为P2的四种可能的输入组合构建一张秘密输入表。
具体构造方法:
令\(S=S_{s_{i}^{1}, s_{j}^{1}}\left(s_{i}^{2}, s_{j}^{2}\right)=\left(s_{i}^{1} \oplus s_{i}^{2}\right) \wedge\left(s_{j}^{1} \oplus s_{j}^{2}\right)\),P1再随机选择一个比特\(r\in \{0,1\}\),则秘密输入表\(T_G\)为
\[T_{G}=\left(\begin{array}{l} r \oplus S(0,0) \\ r \oplus S(0,1) \\ r \oplus S(1,0) \\ r \oplus S(1,1) \end{array}\right) \]然后P1将\(T_G\)的四行作为OT输入发送方,P2将自己拥有的两个秘密份额作为OT输入接收方,P1与P2执行4选1-OT协议,之后P1将r作为输出导线值的一个秘密份额,P2将从4选1-OT中接收到的作为输出导线值的另一个秘密份额,双方执行(2,2)秘密共享重建导线输出值。
GMW协议主要采用(2,2)秘密共享完成MPC。GMW协议中两个参与方可以在不发生任何交互的条件下对NOT和XOR门求值----对NOT门求值,P1只需要反转自己的秘密份额。要对输入为x和y的XOR门求值,两个参与方直接将自己的所用的秘密两个秘密份额异或,然后输入XOR门即可:\((x\oplus r_x\oplus r_y)\oplus(y\oplus r_y\oplus r_x)=x\oplus y\)。
3.3 BGW协议
BGW协议是首批支持多个参与方计算的MPC协议之一,BGW协议强烈依赖于Shamir的秘密共享方案的同态特性。协议的执行过程大致为:
- 加法门。输入导线\(a\)和\(b\),输出导线\(c\),每个参与方都持有两个秘密份额\([a]\)和\([b]\),共同目标是获得求和的秘密份额\([a+b]\)。每个参与方只需要将自己的拥有的两个秘密份额\([a]\)和\([b]\)相加即可获得\([a+b]\)。
证明:假设共享\(a\)和\(b\)时使用的多项式分别为\(p_a,p_b\).那么实际上各个参与方共同持有了多项式\(p_{c}(x) \stackrel{\text { def }}{=} p_{a}(x)+p_{b}(x)\)。那么每个参与方就可以持有的秘密份额为就可以构成a+b秘密值\(p_c(0)=p_a(0)+p_b(0)=a+b\)
2.乘法门。与加法门相同,每个参与方将自己拥有的两个秘密份额相乘,得到\([a\cdot b]\)。但是由于乘法构造的多项式\(p_c(x)=p_a(x)\cdot p_b(x)\)的度最多为2t超过了t,因此需要实行降阶。
降阶操作:
-
2t+1个参与方\(P_i\)生成\(p_c(i)\)的t阶秘密共享。
-
各个参与方在本地计算\([p_c(0)]=\sum_{i=1}^{2 t+1} \lambda_{i}[p_c(i)]\),\(\lambda_{i}\)为对应的拉格朗日系数。
每个人在拿到\([c]\)后都将其发送给其他参与方用于重建c
3.4 GESS协议
在描述GESS协议之前需要明确一些定义
1对1-G门函数:\(G:\{0,1\}^{2} \mapsto\{00,01,10,11\}\)其中\(G(0,0)=00, G(0,1)=01, G(1,0)=10, G(1,1)=11\)
\(D_S\):秘密值所在域
\(S_{ij}\):可能的输出秘密值,分别对应(注意不是等于)于输出导线\(G(i,j)\)
\(R_i\):随机字符串,分别与第一条导线的明文值\(i\)相对应
3.4.1 协议主要思想
GESS的构造与GC协议类似,但是不需要使用乱码表。GESS本质上是一个秘密共享方案,布尔门所有可能的输出是秘密共享方案中要被分享的秘密值,这些秘密值被分享到输入导线上,参与方通过输入导线的秘密份额重建出电路的输出值。其基本思想是P1拥有两个与自己输入相关联的秘密值R0,R1并将其中一个激活标签发给P2。P2的两个秘密份额sh20,sh21由P1构造,值得注意的是P2的秘密份额有两个数据块。GESS协议的输出并不由P1或P2求得而是由布尔门计算,P1和P2只需要提供其拥有的输入导线的秘密份额即可,这与GC不同。构造方法为\(sh20=(R_0\oplus S_{00},R_1\oplus S_{10})\)\(sh21=(R_0\oplus S_{01},R_1\oplus S_{11})\)。P2拥有使用自己选择比特与P1执行2选1-OT协议完成自己激活标签的选定。假设P1的激活标签为sh10=R0,P2的激活标签为sh20,那么对于异或门最终输出为\(R_0\oplus (R_0\oplus S_{00})=S_{00}\) 。GESS同样需要标识置换,置换方法为:P1在R0后附加一个标识比特0,在R1后附加一个标识比特1,告知P2在使用R0重建输出激活标签时采用P2激活标签左侧数据块,在使用R1重建输出激活标签时采用P2激活标签右侧数据块。之后P1在生成一个随机比特r,如果r=1则反转R1和R0的标识比特,并交换sh20和sh21的两个数据块的顺序。
整个协议的主要思想可由下图概述:
3.4.2 协议执行过程
参数:
- 两个参与方P1,P2
- 功能函数F,布尔电路C
电路生成:
- P1随机选择两个字符串\(R_0,R_1 \in D_s\).让\(R_0\)与0相关联,\(R_1\)与1相关联
- P1生成四个秘密值\(S_{00},S_{01},S_{10},S_{11}\)分别与\(G(0,0),G(0,1),G(1,0),G(1,1)\)相对应
- P1为P2构建两个激活标签:\(sh20=(R_0\oplus S_{00},R_1\oplus S_{10})\),\(sh21=(R_0\oplus S_{01},R_1\oplus S_{11})\)
- P1执行标识置换
协议:
- P1将自己的激活标签发送给P2
- P1(发送方)将\(sh20,sh21\)作为输入,P2(接收方)将自己的选择比特作为输入,双方执行2选1-OT协议。P2获得自己的激活标签
- P2根据置换标识计算\(S=sh1i\oplus sh2i\),将S发送给P1
3.4.3 协议分析
P1生成电路标签,并将自己的激活标签发送给P2,由于P2无法获得P1的激活标签与P1导线值的对应关系因此P2无法获得P1的输入信息。P1与P2执行2选1-OT协议,P1没有接受任何输出,因此P1无法获得P2的任何信息。P2只拥有一对秘密份额,所以P2只能解密一个导线输出值,因此P2没有获得任何额外的导线输出信息。
上述协议中由于P2导线的秘密份额为输出导线的两倍,因此构造方案是十分低效的。所以有了GESS的改进方案,以减少秘密份额的增长量。方案的主要思想是在OR和AND门中第二条输入导线的秘密份额中左侧和右侧的两对数据块中一定有一对是相等的(OR:S10=S11.AND: S00=S01),如果输出导线秘密值满足则个性质,就可以利用这一点可以降低秘密份额长度,关键在于将第二条导线的秘密份额看作是4个秘密份额,只有一个秘密份额与其他三个秘密份额不相等。GESS的XOR门的秘密份额生成方式也很简单:令S0,S1表示输出导线秘密值,则sh10=R,sh11=S0\(\oplus\)S1\(\oplus\)R,sh20=S0\(\oplus\)R,sh21=S1\(\oplus\)R,构造输出秘密值时只需要将两个秘密份额异或。例如sh10\(\oplus\)sh21=R\(\oplus\) S1\(\oplus\) R=S1,等价于计算(0,1)$\rightarrow $1。
为了简单描述协议构造过程,假设4个输出秘密值各包含3个数据块,只有第二个数据块不相等,而第一个和第三个数据块相等。
-
P1构造第一根导线秘密份额。sh10=(R1,R2,R3),sh11=(R1,R2‘,R3).其中\(R_i\)都是随机选择的长为k的比特串
-
P1构造输出导线秘密份额。\(S00=(t_1,t_2^{00},t_3)\) ,\(S01=(t_1,t_2^{01},t_3)\),\(S10=(t_1,t_2^{10},t_3)\),\(S11=(t_1,t_2^{11},t_3)\)其中\(t_1,t_2^{ij},t_3\)都是随机生成的长为k的比特串。
-
P1构造第二根导线秘密份额。\(sh20=(R1\oplus t_1,R2\oplus t_2^{00},R2'\oplus t_2^{10},R3\oplus t_3)\)\(sh21=(R1\oplus t_1,R2\oplus t_2^{01},R2'\oplus t_2^{11},R3\oplus t_3)\)
-
标识置换。应用相同的随机置换\(\pi\)重新排列第二条输入导线的四个列,并在第一条输入导线的每个数据块后方附加2个比特的信息告知求值方应该使用第二条导线上的秘密份额的哪个数据块来重建秘密值。
整个协议的主要思想可由下图概述:
3.5 OT协议
OT协议作为MPC可以说是最基础,最基本的协议。虽然不属于MPC协议的一种,但由于其重要性,我在本节中简单的描述了基于公钥的OT协议和OT扩展协议,并在第四节中给出了基于公钥的2选1-OT实现,OT的基本概念以及描述已经在2.3节中的不经意传输部分有所叙述。
3.5.1 基于公钥的OT协议
-
协议执行过程
参数:
- 两个参与方:发送方S,接收方R。S拥有两个秘密值\(x_0,x_1 \in \{0,1\}^n\),R拥有一个选择比特\(b\in \{0,1\}\)
协议:
- R生成一个公私钥对\((sk,pk)\),从公钥空间中随机选择一个公钥\(pk'\).如果b=0,R将\((pk,pk')\)发送给S,否则将\((pk',pk)\)发送给S
- S收到\((pk_0,pk_1)\),将\((e_0,e_1)=(Enc_{pk_0}(x_0),Enc_{pk_1}(x_1))\)发送给R
- R用\(sk\)解密\((e_0,e_1)\),选择其中的有效密文作为OT协议输出
-
协议分析
协议依赖于公钥密码学。由于R只有一个公私钥对,所以R只能解密两个密文中的一个,因此R无法获得S的另一个输入的信息。S只能看到R发送的两个公钥,因此S无法以超过1/2的预测出R的私钥对应哪一个公钥,也就就无法获得R的选择比特信息。此协议无法抵御恶意R方的攻击,因为R完全可以生成两个公私钥对,S无法验证另一个公钥是由R随机选择的还是由R生成的。
3.5.2 OT扩展协议
OT扩展协议的目标是用k个OT协议实现m个OT协议,其中m>>k. Ishai等人提出的OT扩展协议可以在半诚实攻击者的攻击下实现m个2选1-OT协议。
-
协议执行过程
参数:
- 两个参与方:发送方S,接收方R。R拥有一个选择比特串\(r\in \{0,1\}^m\)
- k个2选1-OT协议
协议:
-
R选择随机生成两个\(m\times k\)的矩阵t和u(都是m行,k列),且满足
\[\boldsymbol{t}_{j} \oplus \boldsymbol{u}_{j}=r_{j} \cdot 1^{k} \stackrel{\text { def }}{=}\left\{\begin{array}{ll} 1^{k} & \text { if } r_{j}=1 \\ 0^{k} & \text { if } r_{j}=0 \end{array}\right. \] -
S选择一个随机的比特串\(s\in \{0,1\}^k\)。
-
在第\(i\)个(总共k个)2选1-OT协议中,S发送\(s_i\)作为第\(i\)个2选1-OT协议的选择比特串,R将T和U的第\(i\)列\(t_i,u_i\)作为第\(i\)个2选1-OT协议的输入,S获得第\(i\)个2选1-OT协议的输出\(q_i\in \{t_i,u_i\}\),并且将\(q_i\)按列按顺序拼凑成一个m行,k列的矩阵\(Q\)。\(Q\)的每一行\(Q_j\)具有如下规律:
\[\boldsymbol{q}_{j}=\boldsymbol{t}_{j} \oplus\left[r_{j} \cdot s\right]=\left\{\begin{array}{ll} \boldsymbol{t}_{j} & \text { if } r_{j}=0 \\ \boldsymbol{t}_{j} \oplus s & \text { if } r_{j}=1 \end{array}\right. \] -
针对\(q\)的每一行\(q_j\),S都计算2个随机字符串\(S_{j1}=H(q_j),S_{j2}=H(q_j\oplus s)\)
针对\(t\)的每一行\(t_j\),R都计算1个字符串\(S_t=H(t_j)\)
H是一个随机预言机
-
S此时若想传输秘密\(s_0,s_1\)。S将\(Enc(s_0)=S_{j1}\oplus s_0,Enc(s_1)=S_{j2}\oplus s_1\)发送给R
-
R利用\(S_t\)计算\(s_0=Enc(s_0)\oplus S_t,s_1=Enc(s_1)\oplus S_t\)选择其中有效的一个作为输出
-
协议分析
协议使用的k个2选1-OT协议仅在步骤3中使用,传递了一个\(m\times k\)的矩阵。能从k个OT协议扩展到m个OT协议的关键在于第3步中的\(q_j\)。\(q_j\)只能等于\(t_j\)(\(r_j=0\)时)或者\(t_j\oplus s\)(\(r_j=1\)时),由于R无法获得s的任何信息,因此R只能知道\(q_j=t_j\)的\(q_j\),而S发送的\(q_j\)可能为两个\(q_j\)中的任意一个。即使R知道当\(r_j=0\)时,\(q_j=t_j\)即此时R知道\(q_j\)是什么,但是对于S来说既可能直接发送\(q_j\)也可能发送\(q_j\oplus s\)因此对于R来说接收到的字符串是随机的。因此m行矩阵的每一行都生成了一个2选1-OT协议。
4. 个人实现
代码在当前目录的Code文件夹下,实现语言为python,GC对应GC_thread.py, GESS初始协议对应GESS_primitive.py,GESS降低秘密份额协议对应GESS_advanced.py,OT对应OT_pk.py。
4.1 GC
我的GC实现需要指出的几点是
-
采用了双线程,以线程间通信的方式模拟了Alice和Bob的交互,只实现了一个XOR门。
-
加密函数H的实现采用了Bellare等人于2013年提出的双密钥加密方案。H被定义为:
\[H(A\Vert B)=\pi(K\Vert T)[1:k]\oplus K \]A和B是输入导线的激活标签,A||B意味着A和B的串联(同理\(K||T\)),\(\pi\)是具有固定密钥的AES加密,\(k\)是安全参数([1:k]意味着取比特串的高k位),\(T\)是置换标识,\(K\leftarrow 2A+4B\)其中\(2A\)并不意味着A数乘2,而是在\(GF(2^k)\)中,\(2A\)被定义为\(2A=A\times (0^{k-2}10)\),其中\(\times\)的含义是\(GF(2^k)\)中的数乘运算。同理\(4B=B\times (0^{k-3}100)\)
-
我没有采用标准的OT协议,而是采用黑盒的方式,在1988年,Impagliazzo和Rudich就已经证明了不能使用黑盒的构造方法从一个单项函数来实现 OT,这并不是安全的OT协议构造方式。但是为了简便和专注于GC的实现,我认为采用黑盒实现的OT在这样的情况下是合理的。
我的OT构造方式为:\((1-b)\cdot a_0 + b\cdot a_1 = a_b\),其中\(a_0,a_1\)是发送方输入,\(b\)是选择比特,\(a_b\)是协议输出。
-
参数选择:\(k=80\),AES的密钥为b'1234567812345678'
实现结果:
input: Alice 0,Bob 0. output: 0
input: Alice 1,Bob 0. output: 1
4.2 GESS
我实现的GESS中采用的OT与GC中OT一致。我同时实现了GESS最初的方案和GESS降低秘密份额的方案。
门函数G定义为\(G(0,0)=00, G(0,1)=01, G(1,0)=10, G(1,1)=11\)。没有采用多线程通信的方式,只是简单的按照协议执行的顺序,由Alice和Bob分别计算协议需要的值,最后一起交互。构造输出导线秘密标签时,也偷了一点懒,直接采用输出导线明文值作为标签,省去了生成解码表的步骤。
GESS最初方案运行结果:
input: Alice 0,Bob 0. output: 00
input: Alice 1,Bob 0. output: 10
GESS降低秘密份额的方案运行结果
input: Alice 0,Bob 0. output: 00
input: Alice 1,Bob 0. output: 10
4.3 OT
实现了基于公钥的OT协议,公钥加密体制是RSA,正确解密的标准是明文后面附加有2个bit长度0。
5. 总结以及个人感受
MPC旨在秘密分享数据上完成密文计算。GC协议中实现的激活导线值的秘密共享的方法是让输入一方拥有两个可能的导线标签,另一方拥有激活标签。GMW则是让各个参与方直接持有激活导线值的加法秘密份额。BGW直接采用Shamir秘密共享分享各自的输入。GESS采用直接在导线上秘密进行秘密共享,而不是参与方之间。从效率,参与方数量,支持的电路类型来看,这四个协议的对比如下:
协议 | 支持的参与方数量 | 协议执行的轮数 | 支持的电路类型 |
---|---|---|---|
GC | 两方 | 常数 | 布尔电路 |
GMW | 多方 | 电路深度 | 布尔电路或算数电路 |
BGW | 多方 | 电路深度 | 布尔电路或算数电路 |
GESS | 两方 | 常数 | 布尔方程式 |
从安全性角度来说,他们都是在半诚实攻击者的攻击下是安全的,在恶意攻击者的攻击下是不安全的。抵御恶意攻击者攻击的协议有基于GC的切分选择,基于任意半诚实安全协议的GMW编译器,基与预处理的BDOZ&SPDZ协议,基于BMR的可认证乱码协议,此外零知识证明也可以将半诚实安全协议转化为恶意安全协议。在实现技术方面有FreeXor技术将GESS的XOR门技术引入到乱码电路,半门技术和乱码行缩减技术的混合使用能够将乱码表的密文数量降低至一个,采用固定密钥的AES构造的密码学置换可以有效减少加密函数的开销,此外专用功能函数的设计也能极大的减小开销,也运用如ABY,Obliv-C,EMP等编程工具可以很方便的构造隐私保护应用程序。
从完成的最终目标来看,完全同态加密似乎与MPC具有类似的功能但是在查资料的图中发现,很多文献都注明“MPC与完全同台加密并不是一类,甚至是完全不同的领域”,针对这个观点我没有深入去调研,没搞懂为什么是这样。许多实现技术和优化技术,恶意MPC协议我也都没有仔细去了解过,在完成这个调研报告后我打算去阅读相关文献。MPC是一个令人兴奋的领域,相对于传统的密码学,MPC带给我的感受是不只有密码学本身的严谨证明还让我看到了密码技术的应用竟然能创造出如此巨大的可能性,最令我感到惊奇的是两个互不信任的参与方竟然能共同完成一个计算,而且双方都愿意相信这个计算结果,计算过程中也没有泄露个人的输入信息。我也看到MPC在联邦学习,安全聚合方面的应用已经投入实战,但是MPC的效率方面依旧是一个大问题,真正投入实战的MPC应用并不多,尤其在面临恶意攻击者的情况下性能损失巨大,因此我认为在未来除了考虑通过实现MPC时的优化来提升性能,开发新的通用MPC协议摆脱专用协议的特殊性也是至关重要的。
我很遗憾在大三下才接触MPC,如果能早一点接触,我在想我未来的发展方向会不会因为MPC而改变。
References
[1]Yao, A. C. (1982, November). Protocols for secure computations. In 23rd annual symposium on foundations of computer science (sfcs 1982) (pp. 160-164). IEEE.
[2]Beimel, A., & Chor, B. (1992, August). Universally ideal secret sharing schemes. In Annual International Cryptology Conference (pp. 183-195). Springer, Berlin, Heidelberg.
[3]Goldwasser, S., & Micali, S. (1984). Probabilistic encryption. Journal of computer and system sciences, 28(2), 270-299.
[4]Beaver, D., Micali, S., & Rogaway, P. (1990, April). The round complexity of secure protocols. In Proceedings of the twenty-second annual ACM symposium on Theory of computing (pp. 503-513).
[5]Goldreich, O. (2004). Foundations of Cryptography, Volume 2. Cambridge: Cambridge university press.
[6]Ben-Or, M., Goldwasser, S., & Wigderson, A. (2019). Completeness theorems for non-cryptographic fault-tolerant distributed computation. In Providing Sound Foundations for Cryptography: On the Work of Shafi Goldwasser and Silvio Micali (pp. 351-371).
[7]Kolesnikov, V. (2005, December). Gate evaluation secret sharing and secure one-round two-party computation. In International Conference on the Theory and Application of Cryptology and Information Security (pp. 136-155). Springer, Berlin, Heidelberg.
[8]Ishai, Y., Kilian, J., Nissim, K., & Petrank, E. (2003, August). Extending oblivious transfers efficiently. In Annual International Cryptology Conference (pp. 145-161). Springer, Berlin, Heidelberg.
[9]Bellare, M., Hoang, V. T., Keelveedhi, S., & Rogaway, P. (2013, May). Efficient garbling from a fixed-key blockcipher. In 2013 IEEE Symposium on Security and Privacy (pp. 478-492). IEEE.
标签:P2,协议,P1,MPC,导线,初识,oplus,OT 来源: https://www.cnblogs.com/hsa0x7f/p/16477310.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。