安全双方计算
由于1. 隐私数据需要得到保护 2. 大数据计算可以得到更有用的结果,在这两个条件下得到隐私大数据结果。比如:百万富翁问题。
OT 不经意传输协议
- 作用:发送者发送一些数据给接收者,发送者不知道接收者接受的是哪个发送出去的数据,接收者只能得到想要的一个数据。
- 单向函数指的是计算无法可逆的函数。陷门单向函数指在有陷门t情况下可以求逆单项函数f-1。即便是单向函数也会泄露x某些位的信息。比如:RSA会泄露X的雅可比符号。hard-core predict是具有难以推测位信息的单向函数,记为B(x)。
假设发送者有数据 X0 ,X1,接受者需要Xb(b=0/1)。
布尔电路
任何函数 f(x,y) 计算可以使用布尔电路(与或非门)转化为电路计算。
比如比较两个数字大小,但是两个数字为Alice,Bob私有。
不失一般性,假设x,y都是n位数字,因此可以按位比较两数字x,y大小。
如:x = 30~10~ =11101~2~,y = 31~10~ =11101~2~,从高到低比较每位的大小,直至有一个不同,如果同一位上的xi == yi,那就比较下一位。
每一个门电路有一个对应的真值表。每个与、或门都有三根线x,y,z,每根输入线都有两个可能的输入:0/1。
与门 | x | y | z=x与y | 或门 | x | y | z=x或y | 非门 | x | x- |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |||
0 | 1 | 0 | 0 | 1 | 1 | |||||
1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | |||
1 | 1 | 1 | 1 | 1 | 1 |
- 在混淆电路之前,我们再一次定义如何计算函数f(x,y) = f(f1,f2) 。函数的类型分为概率性函数以及确定型函数(这里都是指多项式时间函数)。如果两个输出是相等的,将其记为f=(f1)。
- 给定一个协议安全地执行确定函数,就可以构造安全执行概率性函数的协议。
因为概率性函数的定义就是在未知随机数r之前是一个概率函数,当知道输入的随机数r后就自然的可以确定计算出其输出。 - 通过实现一个安全执行输出相同的确定性函数的协议来构造安全执行概率性函数的协议。
假设需要计算的概率性函数是f(x,y)=f(f1,f2),定义一个新的输出相同的确定性函数f((x,r),(y,s))=f( f1(+)r || f2(+)s ),记输出output=u || w,玩家1与玩家2可以分别计算自己的输出结果,如玩家1计算f1 =f1(+) r,同时由于随机掩码r因此玩家1无法得到玩家2的输出,反之亦然。
yao电路(混淆电路)
- Alice首先将整个计算函数 f(x,y)【指的是上文中的一个新的输出相同的确定性函数】 转换为电路C,计算 f(x,y) 等价于计算电路 C,电路C有多个门。针对位运算(与或非)组成的算法(如比较操作或AES加密)效率是较高的。
- 单个门的混淆计算:假设双方分别持有与门的一个输入a,b,计算输出结果c。在这里假设加密函数具有难以区分特性,比如E(a),E(b)无法区分哪个对应于明文a,此外要求基于密钥 k 加密后的密文不会由其他密钥 k’ 解密,(即难以找到另一个密钥加密同样的明文后的密文会落在密钥 k 加密密文集合中),同时可以快速验证某密文是否由给定的密钥k加密。
使用“锁箱”做比喻,每个门是四个相似的双锁箱,每个双锁箱使用两个钥匙才能打开,一旦确定两个钥匙,那么四个箱子只有一个才能打开(输入的两个钥匙类似于真值表的输入),箱子内放的是输出对应的钥匙。 - 每根线输入的可能为0,1,分别选择密钥k0,k1表示,因此一共四种输入,根据输入密钥可以确定对应的输出密钥:kg(a,b)c。主要操作是对真值表加密和混淆。
混淆表 | x | y | z | 重新排列z的输出表 |
---|---|---|---|---|
k0a | k0b | c0 = c(0,0) = k0a[k0b[kg(0,0)c]] | c3 | |
k0a | k1b | c1 = c(0,1) =k0a[k1b[kg(0,1)c]] | c1 | |
k1a | k0b | c2 = c(1,0) =k1a[k0b[kg(1,0)c]] | c0 | |
k1a | k1b | c3 = c(1,1) =k1a[k1b[kg(1,1)c]] | c2 |
- Alice将加密后的真值表 c重新排列后发给Bob;
- Alice将自己的ka发给Bob,Alice将Bob的kb使用OT传输过去;
- Bob解密真值表(两次解密),只有一个最终打开kc,也就是上表中只有一行被正确解密(使用密钥可以快速验证 c 是否由ka,kb加密),kg(a,b)c使用输出表得到最终结果,输出表形如:(0,k0c;1,k1c)。
电路C的混淆电路计算记为G( C),包括每个门的混淆表以及最后的输出表。
安全性证明
1. yao的G( C)可以正确计算出函数f(按照预定功能分配输出)。
- 因为使用的加密函数具有密文难以区分、密钥对应的密文不会由其他密钥解密、密文对于确定的密钥可以快速验证是否由该密钥加密的特性。因此可以证明 yao的G( C)可以正确计算出函数 f。
- Proof: 首先验证单个门的正确性。输入a,b,输出 c。观察下表,使用反证法证明,即至少存在两个ci,cj可以由给定的ka与kb 解密。c是正确结果满足两个解密条件:1,c使用ka验证属于ka的密文集合;2 D( c)使用kb验证属于kb的密文集合。
- 如果ci = ka[kb[kg(a,b)c]] ,那么cj = ka[k1-b[kg(a,1-b)c]],满足条件1 。
- D(ci) = kb[kg(a,b)c]属于kb的密文集合,但是D(cj) = k1-b[kg(a,1-b)c],由于密钥对应的密文不会由其他密钥解密的特性,即D(cj) 不会落入属于kb的密文集合,不满足条件2。
- 由于每个门都以可忽略的概率得到正确结果,整个电路C从下向上计算得到的最终输出结果也以可忽略的概率得到正确结果。这里的可忽略概率是指可能无法正确解密得到输出,也有可能是不止一个输出。第一种概率使用没有解密偏差的加密方案即可。对于第二种则是不断地重构混淆电路直至输出没有这种错误。
门的混淆表 | x | y | z | 混淆输出 |
---|---|---|---|---|
k0a | k0b | c0 = c(0,0) = k0a[k0b[kg(0,0)c]] | c3 | |
k0a | k1b | c1 = c(0,1) =k0a[k1b[kg(0,1)c]] | c1 | |
k1a | k0b | c2 = c(1,0) =k1a[k0b[kg(1,0)c]] | c0 | |
k1a | k1b | c3 = c(1,1) =k1a[k1b[kg(1,1)c]] | c2 |
2 除了输出,不能学到其他知识。
- Alice是恶意的。
模拟器S1查看Alice的视图:Alice的输入x,生成的密钥与G( C),执行的OT协议,最后的输出f(x, y)。
首先模拟器S1使用随机磁带 r 生成密钥,模拟器S1使用OT协议传输Bob需要的密钥,模拟的OT协议与真实Alice执行的OT协议是计算上不可区分的(因为OT的安全性)。
其次,真实协议执行最后的输出是messageBob->Alice,由于安全性证明1(电路输出 = 函数输出)以及OT协议的安全,因此messageBob->Alice就是视图中得到的f(x, y)。
因此,Alice是无法得到更多的知识。 - Bob是恶意的。
查看Bob真实的视图:Alice发过来的G( C),Alice的输入密钥,通过OT传过来的Bob的输入密钥,计算最终的结果f(x,y)。
模拟器S2根据Bob的输入输出(y,f(x,y))模拟整个视图。因为Bob不知道x,因此无法生成真实的G( C),而且不知道Alice对应的输入密钥具体对应。但是,加密条目是可以获得的。 关键是模拟一个与真实的G( C)无法区分的G’( C)
1) 模拟一个与真实的G( C)无法区分的G’( C):
电路C的混淆电路计算记为G( C),包括每个门的混淆表以及最后的输出表。
混淆表与真实的不同之处在于输出仅设置一个密钥kc。
混淆表 | a | b | c | 混淆输出 |
---|---|---|---|---|
k0a | k0b | c0 = c(0,0) = k0a[k0b[kc]] | c3 | |
k0a | k1b | c1 = c(0,1) =k0a[k1b[kc]] | c1 | |
k1a | k0b | c2 = c(1,0) =k1a[k0b[kc]] | c0 | |
k1a | k1b | c3 = c(1,1) =k1a[k1b[kc]] | c2 |
输出表: f(x,y)是可以直接从Bob真实的视图中看到(也就是模拟器的输入),不失一般性,假设输出长度为n,则分别记做Z1,,Zn。构造n个输出线的密钥输出表如下形式,通过输出表,始终得到的输出密钥为ki,即可以得到正确的输出Zi。
Zi | kci | k’ci |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
2) 模拟接收到的密钥:分别是Alice的输入密钥,通过OT传过来的Bob的输入密钥。
Alice的输入密钥模拟器S2使用随机磁带r得到K1,,Kn。Bob的输入密钥使用模拟的SOT2模拟真实的OT协议(根据OT安全性证明:通过模拟器SOT2得到的Bob的输入密钥与真实的情况无法区分)。
此时,模拟视图S2(y,f(x,y))= {G’( C),Ka1,,Kan,OTb1 ,,OTbn};真实的视图是view = {G( C),Kaa1,,Kaan,OTb1 ,,OTbn}
3) 将G( C)逐步转化为G’( C)。
记Hi(x,y)是前i个门的真值表按照模拟规律转变,模拟规律就是根据G( C)已知某个门的输出线的密钥kw(真正输出对应的密钥,假设此时对应的位是0),因此加密时不再对k’w加密,因为只有kw才能正确解密出最后的输出结果Z。这一步与模拟器S2构造G’( C)类似,因此有H|C|(x,y) =c G’( C)。
Hi-1(x,y)与Hi(x,y)之间的区别第i个门的混淆表的输出加密密钥:前者的输出密钥等价于 G( C),而后者是 Hi(x,y)。
AND | x | y | w : Hi-1(x,y) = G( C) | w : Hi(x,y) |
---|---|---|---|---|
k0x | k0y | c0 = c(0,0) = k0x[k0y[k0w]] | c0 = c(0,0) = k0x[k0y[k0w]] | |
k0x | k1y | c1 = c(0,1) =k0x[k1y[k0w]] | c1 = c(0,1) =k0x[k1y[k0w]] | |
k1x | k0y | c2 = c(1,0) =k1x[k0y[k0w]] | c2 = c(1,0) =k1x[k0y[k0w]] | |
k1x | k1y | c3 = c(1,1) =k1x[k1y[k1w]] | c3 = c(1,1) =k1x[k1y[k0w]] |
观察上表,区别点在于第四行的k1y的对于不同明文{ k1w,k0w}的加密是否是难以区分的。因为使用的加密函数具有密文难以区分的特性,也就是说无法区分Hi-1(x,y)与Hi(x,y)。
观察更一般的区分,任意一个真实门与构造门的对比(假设输入a,b是有效的):
x | y | G( C) | G’( C) |
---|---|---|---|
kax | kby | c(a,b) = kax [kby [kg(a,b)w]] | c(a,b) = kax [kby [kg(a,b)w]] |
kax | k1-by | c(a,1-b) = kax [k1-by [kg(a,1-b)w]] | c(a,1-b) = kax [k1-by [kg(a,b)w]] |
k1-ax | kby | c(1-a,b) = k1-ax [kby [kg(1-a,b)w]] | c(1-a,b) = k1-ax [kby [kg(a,b)w]] |
k1-ax | k1-by | c(1-a,1-b) = k1-ax [k1-by [kg(1-a,1-b)w]] | c(1-a,1-b) = k1-ax [k1-by [kg(a,b)w]] |
根据上表,第二、三。四行的加密不同点分别是k1-by,kby,这三行如同上例无法区分。由此,按照这种方法生成的H|C|(x,y) 【=c G’( C)】是无法与H0(x,y)区分的。
H|C|(x,y)与 G’( C)之间的区别在于H|C|(x,y)所使用的加密密钥都是Alice所选择的,而G’( C)所选的密钥都是基于随机tape得到的,但是解密之后的结果都是一样的,因为解密之后的输出密钥都对应于真正输出。也就是,H0(x,y) ~= G( C) ~= H|C|(x,y) ~=c G’( C)。