到目前为止,我们讨论了在私钥、公钥背景下,保证通信保密的安全性和关于消息真实性认证的安全性的算法。下面我们要讨论关于计算的安全性的算法。
双方安全计算(Secure 2-Party Computation)
作为一个motivating example,我们考虑姚期智在1986年提出的百万富翁问题(Yao's Millionare's Problem)。有两个百万富翁\(A,B\),他们手上分别有\(\$x\)和\(\$ y\)的财产。他们想要比较谁的财产更多,却不想暴露自己手上财产的具体数量。
这个问题可以理解为一个关于计算的安全性的问题。双方想要在保护\(x,y\)的信息的前提下,计算函数\(f(x,y)=\mathbb{1}[x>y]\)。所以直观上,关于百万富翁问题的一个安全的算法应当保证在双方都能正确计算得到\(f(x,y)\)以后,不泄露除了\(f(x,y)\)以外的任何信息(这一信息量应当恰好是1 bit)。例如,双方都公开自己的财产然后比较大小就是一个绝对糟糕的算法,因为它们把信息都暴露完了。
另一个与此类似的问题是Private Set Intersection,双方手上分别有一个私密的集合\(X,Y\),双方想要安全地共享互相集合的交集\(S=X\cap Y\),但不想暴露交集以外的信息。这是一个关于安全计算\(f(X,Y)=X\cap Y\)的问题。
我们可以把上述这类问题抽象成为“双方安全计算问题”:两个对象\(A,B\)分别掌握二进制串\(x,y\),对于一个公开的函数\(f\),两人想要经过几轮交互然后能分别在自己的设备上输出\(f(x,y)\),但不暴露除此以外的任何信息。(注意在上述定义中,我们认为\(f\)是公开的。事实上,\(f\)也可以是私密的,比如由参与计算的一方来提供这个\(f\)。为了做到这一点,只需把\(f(x,y)\)定义为某个通用图灵机\(F\)上的\(F(f,x,y)\),这样只需提供函数\(f\)的一方输入这个参数给通用图灵机,就可以实现\(f\)的私密化了。)
多方安全计算(Secure Multi-Party Computation)
上述问题可以拓展到多方的情形。假设有\(n\)个对象\(A_1,\cdots,A_n\)分别掌握各自的信息\(x_i\),对于一个公开的函数\(f\),众人想要在不暴露自己的其它任何信息的前提下计算\(f(x_1,\cdots,x_n)\)。
对于这个情形,有两种定义问题的方式。一种方式是,众人在经过多轮交互以后,每个人都输出\(z=f(x_1,\cdots,x_n)\);另一种方式是,每个人输出不同的结果\(z_i=f_i(x_1,\cdots,x_n)\)。显然,后面那种定义方式包含了前面那种定义方式,但事实上通过第一种定义方式我们也可以给出第二种定义方式的一种实现:我们假设每个用户\(A_i\)手上除了有信息\(x_i\)以外,还有一个随机串\(r_i\)。定义\(f((x_1,r_1),\cdots,(x_n,r_n))=(f_1(x_1,\cdots,x_n)\oplus r_1,\cdots,f_n(x_1,\cdots,x_n)\oplus r_n)\)。如果每个用户都输出\(z=f((x_1,r_1),\cdots,(x_n,r_n))\),那么\(A_i\)根据\(f\)的结果只能根据自己手上的随机串\(r_i\)还原出信息\(f_i(x_1,\cdots,x_n)\),而不能还原出其它任何信息(以大于negligible的概率),这相当于是每个用户输出了一个不同的结果\(z_i\)。
在下一节课中,我们会给出一个具体的多方安全计算协议。
关于adversary
一个重要的问题是,在多方安全计算中,我们应当假设敌手拥有怎样的能力呢?在传统的加密和认证的背景下,我们假设通信双方是好人,敌手在中间试图窃取、篡改好友双方的通信。但在安全计算中,参与计算的其它人可能也不是好人,他们试图利用这一交互、计算的过程窃取我们手上的信息。因此,关于敌手最强的假设就是敌手与除了我以外的所有参与计算的人勾结。基于这样的假设我们能给出安全性最强的多方安全计算方案,但这样的方案通常效率不高。所以有时我们会弱化假设,弱化为“在\(n\)个人中有不超过\(t\)个敌手”等等。