HOME
悄悄地找到共同点-隐私交集

为什么要隐私交集

安全多方计算技术是现在国家极为重视的技术,在数据要素市场的建设中也扮演了非常重要的角色。运用安全多方计算算法,可以实现数据不出库前提下做到数据价值传递,是一种统筹数据资源的重要手段。在安全多方计算的家族中,隐私交集是非常重要的一个部分,也是目前为止使用最为广泛的算法之一。

什么是隐私交集

所谓隐私交集,就是在不暴露隐私的情况下求出两个集合的交集。怎么才能不暴露隐私呢?首先可以确定,我们想要的数据的“交集”不属于隐私的部分,在此可以认为除了“交集部分”的信息都是“隐私信息”。

回头看我们的标题——“悄悄地发现共同点”,我们可以从实际生活中找到一个隐私交集的例子。假设现在小明和小红在进行相亲,两人之前是没有任何的交集的陌生人,小明担心双方会尴尬,希望找些话题。

最好的话题当然就是两人之间的共同爱好,比如美食、电影等,小明决定从一个相对他来说比较好切入的点——美食,进行进一步沟通。小明不知道小红喜欢吃什么,但又希望尽可能避开雷区(比如著名的甜、咸豆腐脑之争,小明毕竟只是想要找一个共同话题而不是掀起“门派”间的冲突)。

最稳妥的办法是直接问小红“你喜欢吃什么”,小红把自己喜欢吃的东西都说一遍,小明从里面挑几个自己也喜欢吃的东西然后展开话题。但小红也有和小明一样的顾虑,把自己喜欢吃的东西都告诉小明也可能会引起激烈的冲突。

在这种情况下最稳妥的办法就是隐私交集,双方都不告诉对方自己所有喜欢的美食是什么,最后双方却能知道两个人共同喜欢的美食是什么。

怎么做

简单算法

说到这里,可能就有人会好奇了,那该怎么去做这个问题呢?

最简单的一个做法是双方约定一个方法,比如双方记录自己喜欢的美食的汉字总共多少笔,然后交换笔画,之后双方看看笔画是不是一样多,如果一样多的话那就就说明我们喜欢的美食是一个东西。

看到这里你可能会说了,等等,可是很多美食的笔画是一样多的呀,比如面条和苹果都是16笔。那这个时候你可能就需要修改你的算法了,比如说每个字多少笔。

在计算机中,苹果和香蕉这些食物你可以认为是字符串,而这里的算法就是哈希函数。上面提到的算法中,面条和苹果作为输入,输出都是16,这就是哈希碰撞。哈希碰撞是简单算法会出现的第一个问题,但是其问题不仅仅这一点,现在的密码学算法已经足够强大,哈希碰撞发生的概率其实不是很高,最为重要的是安全性问题。

我们知道其实美食的种类听起来很多,但又不是很多,如果小明知道了小红有一个喜欢的食物总共24笔,其实他自己去网上搜一下食物的名称,很快就能发现,比如香蕉,就是24笔,那么小明就知道了小红是喜欢吃香蕉的。这就是简单算法的暴力破解问题。随着计算机运算能力的增强,暴力破解也成为了需要防备的攻破方式之一。比如现实生活中,两个人想要看号码簿的交集,如果只是简单使用哈希函数计算然后进行比较,因为手机号只有11位,对于现在的计算机来说在可接受时间内进行破解也并非难事。

双重加密

简单算法既然不够安全,那么该用什么样的办法规避这种不安全的问题?其实之前的算法中只有一方进行了加密,且加密的方法双方都是知道的,这样确实会存在暴力破解的危险,那么如果让双方同时进行加密可以吗?

比如双方事先准备一张图片,双方事先约定如果喜欢吃苹果呢就把图片顺时针旋转10度,香蕉的话就是顺时针旋转20度等等,对所有的美食都对应着一个相应的旋转角度。

然后小明先把图片按照自己喜欢的食物按照约定好的规则进行旋转,但这个时候小明不能直接把图片发送给小红,因为这样的话小红知道原始图片,又知道各个食物对应的角度,那她立刻就知道了小明喜欢的食物是什么。

所以小明会自己偷偷定一个旋转,比如逆时针旋转20度,在第一次根据食物对图片进行旋转后,再偷偷的按照自己的规则去旋转一次。

因为小红并不知道小明自己偷偷定下的规则中具体是旋转多少度,所以这个时候小红就算拿到了图片也不知道具体对应的是什么食物,因为这个时候不论什么食物都是有可能的。

小红看到小明的做法,感觉小明很聪明,也学小明偷偷定了一个自己的旋转角度,比如顺时针旋转10度。拿到了小明发给自己的图片以后就按照自己定下的角度再旋转一次。

同样的,小红也把图片按照自己自己喜欢的食物对应的角度旋转一下,再按照自己偷偷定下的角度(顺时针旋转10度)旋转一下,然后发给小明,小明也将这个图片按照自己偷偷定下的角度(逆时针旋转20度)进行旋转。

然后两个人就直接比较旋转后的图片,如果图片一模一样那就说明两个人喜欢吃的食物是一样的,否则就说明两个人喜欢吃的食物是不一样的。

通过两次加密的方式,我们就杜绝了穷举破解的问题,因为双方都不知道对方的秘密旋转角度是多少。

非对称加密

刚刚的算法乍一听看似有点道理,但是实际上是有一点问题的,如果稍微观察一下就会发现,在最后比较的时候其实小红或者小明是拿到了两个人手里最后的结果的。

假设小明拿到了小红手里的图片,我们先回忆一下小红手里的图片是怎么构成的。首先是小明根据自己的食物选择旋转的角度,然后再按照自己偷偷定下的角度进行旋转,最后小红再按照自己偷偷定下的角度进行旋转。

那么小明其实已知三次旋转中的两次角度是什么、图片的初始状态是什么,此时小明就可以很容易地推断出小红的秘密旋转角度是什么(通过逆向旋转),得到小红的秘密旋转角度后通过自己手上的另一张图片就可以很容易知道小红喜欢吃的食物是什么了。

之前提出的算法其实是基于对称加密的一个双重加密方法(这里不称为算法因为实际上这个方法并没有保护任何隐私),因为对称加密的局限性,故双重加密总会有一个问题,即最后获取结果后比较结果时的信息泄露问题。

这个问题有三种解决办法。

(1) 第一种是有一个居中调节方,调节方来比较最后的结果。

因为调节方并不知道双方的秘密角度,故调节方没有办法获知双方具体喜欢的食物是什么,但是居中调节方只要愿意与任何一方进行合作,那么另外一方的数据会立刻暴露,无疑是有风险的,其次如果有居中协调方那么整个算法无疑不再是分布式的了。

(2) 第二种是在最后一步比较结果的时候使用隐私比较的技术进行比较,即保护双方数据的情况下进行比较是否相等。

但是这样会存在两个问题:首先无法确认再引入一个新的算法去解决问题,效率上是否会有问题;其次,如果两者结果相等的话,双方都能获取对方的秘密角度,在下次进行比较的时候又需要重新生成一个新的秘密角度,这也会增加每次比较时的工作量。

(3) 第三种是使用非对称加密的方式进行比较。通过非对称加密,我们可以使用最简单的办法完成这个问题。

还是刚刚的场景,如果小明和小红都有各自的公钥,相对应的,也有一份私钥(私钥在这里其实没有起到作用,但是为了让各位更好理解,所以在这里还是需要生成一份私钥的)。非对称加密下,如果使用公钥对数据进行加密,那么加密后的数据是只能通过对应的私钥进行解密的。

通过这种方式我们就可以规避之前的双重加密方法的问题,在算法的最后即使小明或者小红获得了两重加密的结果,但是因为加密的结果只能通过私钥解密,故无法反推出小红喜欢的食物是什么。

总结

通过上述的描述我们可以知道交集算法最简单即为明文计算,之后使用简单算法可以保护一点隐私,但是会存在暴力破解的可能,双重加密可以解决暴力破解的可能,但是由于对称加密的局限性,最后要么丢失安全性,要么会丢失分布式的特性(且不够安全),非对称加密的算法则可以克服以上的所有缺点。

如果你熟悉密码学,一定知道大名鼎鼎的RSA算法就是使用非对称加密进行运算的,其中存在大量的模指运算,故效率较低,想要完成大规模数据的运算还需要对算法进一步的升级。

作者简介

刘毅恒(一个鲜为人知的知名程序员)

来自数据网格实验室BitXMesh团队