安全计算实现方法概览

安全计算这个领域虽然很小众,但其实理论界很早就开始关注它了。研究计算理论的学者们四十多年当中已经提出了很多种实现安全计算的方法。总的来说,大致可归为两类:一类是基于噪音的,另一类不是基于噪音的。当然也有人认为基于噪音的不应算在安全计算当中,但这就纯粹是抠字眼的文字游戏了,我们这里先不管这些,为方便以后的叙述,暂且把“保护数据隐私的多方计算方法”都归入到安全计算当中。

基于噪音的安全计算方法,最主要代表是目前很火的差分隐私(differential privacy)。这类方法的思想是,对计算过程用噪音干扰,让原始数据淹没在噪音中,使别有用心者无法从得到的结果反推原始数据。这就好像我们拿到一张打了马赛克的图片,虽然可能可以猜出马赛克后面大概长啥样,但很难知道马赛克后面的所有细节。

有一点值得注意:这个干扰既可以是数据源,也可以是模型参数和输出。也就是说,参与者既可以对自己的原始数据加噪音使得原始数据从来没在计算过程中出现过,也可以在模型训练的时候改变通过改变模型参数影响输出结果,也可以直接在输出暴露前在输出上加噪音从而使得从计算结果无法反推输入。比如我们要计算一个函数 f(x_1, x_2, dots, x_n, 	heta) ,那么对输入进行干扰后得到的结果便是 f(x_1 + r_1, x_2+r_2, dots, x_n+r_n, 	heta) ,对参数进行干扰后得到的结果为 f(x_1, x_2, dots, x_n, 	heta + r_{	heta}) ,对输出进行干扰后的结果是 f(x_1, x_2, dots, x_n, 	heta) + r 。

这种方法的优点是效率高(毕竟只需要生成服从特定分布的随机数即可),缺点是最后得到的结果不够准确,而且在复杂的计算任务中结果会和无噪音的结果相差很大导致结果无法使用。

非噪音方法一般是通过密码学方法将数据编码或加密,得到一些奇怪的数字,而且这些奇怪的数字有一些神奇的性质,比如看上去很随机但其实保留了原始数据的线性关系,或者顺序明明被打乱但人们却能从中很容易找到与原始数据的映射关系。如果将计算过程比作炒菜,那数据就是炒菜的原料,输出就是最后做出来的美味佳肴。而实现安全计算方法,就好像是让厨师闭着眼睛炒菜一般。

这一类方法主要包括三种:混淆电路(Garbled Circuit)、同态加密(Homomorphic Encryption)和密钥分享(Secret Sharing)。这些方法一般是在源头上就把数据加密或编码了,计算操作方看到的都是密文,因此只要特定的假设条件满足,这类方法在计算过程中是不会泄露信息的。比如计算函数 f(x_1, x_2, dots, x_n, 	heta) 的时候,实际操作的是 f(hat{x_1}, hat{x_2}, dots, hat{x_n}, 	heta) (这里 hat{x}_i是 x_i 的密文)。相比于前一类基于噪音的方法,这种方法的优点是不会对计算过程加干扰,因此我们最终得到的是准确值,且有密码学理论加持,安全性有保障,缺点则是由于使用了很多密码学方法,整个过程中无论是计算量还是通讯量都非常庞大,对于一些复杂的任务(如训练几十上百层的CNN等),短时间内可能无法完成。而且对于密码学基础薄弱的程序猿来说,要实现前一类基于噪音的方法没啥难度,但要实现后一类方法则还是要费不少功夫的。

总之,不同的安全计算的方法在效率、安全性和可扩展性上各有取舍,需根据具体应用场景选择相应的方法。

原文地址:https://www.cnblogs.com/hzcya1995/p/13312758.html