用于在不受信任的计算机上执行私人程序的系统和处理器的制作方法

文档序号:15309793发布日期:2018-08-31 21:36阅读:186来源:国知局
本申请要求2015年7月21日提交的美国申请14/804,713的优先权,其全部内容在此参考并入。发明领域本公开的发明涉及计算安全领域。
背景技术
::在远程计算机程序执行中的安全性是一场持续的战斗,特别是最近云网络和扩展的企业网络的激增,允许用户无拘无束地接入到计算机的大型网络。在多个计算机上的程序执行的组合能力和速度是有利的,但也可能具有被窥视的风险。任何的或所有的远程计算机都可能处在恶意用户或攻击者的控制下,泄漏珍贵的保密信息。因此,需要一种在不受信任的一个或多个计算机上执行程序的方法和系统,这样,保持所执行的程序和数据的私密性,免受对所述不受信任的计算机具有完全访问能力的攻击者的入侵。本发明针对以上的和其它重要的需求。技术实现要素:本发明提供用于执行计算机程序的方法,所述方法包括:将计算机程序划分成一系列运算,所述计算机程序位于被连接到至少一个其它计算机的受信任的计算机上;将所述一系列运算中的每个运算连同伴随指令一起发送到所述至少一个其它计算机,所述伴随指令用来计算相应的运算的结果,并且将所述结果转发到另一个计算机;以及在所述受信任的计算机处,接收所述计算机程序的计算结果。本发明还提供用于执行计算机程序的系统。所述系统可包括通信地连接到至少一个其它计算机的至少一个受信任计算机。所述至少一个受信任计算机中的第一受信任计算机具有被存储在其上的计算机指令,所述计算机指令在被执行期间使得所述系统进行包括程序执行过程的运算。所述过程可包括:将所述第一受信任的计算机上的计算机程序划分成一系列运算;将所述一系列运算中的每个运算连同伴随指令一起发送到所述至少一个其它计算机,其中所述伴随指令用来计算相应运算的结果,并且将所述结果转发到另一个计算机;以及在所述第一受信任的计算机处,接收所述计算机程序的计算结果。上述总体说明和以下的具体实施方式仅仅是示例性和说明性的,并不是对由所附权利要求限定的本发明的限制。本领域技术人员在查看如这里提供的本发明的详细说明后将明白本发明的其它方面。附图说明结合附图阅读上述
发明内容以及以下的具体实施方式,将有助于更好的理解。为了说明本发明,在附图上显示本发明的示例性实施例;然而,本发明不限于所公开的具体的方法、组成和设备。另外,附图并不一定按比例画出。在附图中:图1示出了用于划分联网的计算机上的程序的本发明的实施例;图2示出了用于分离的设备驱动器运算的本发明的实施例;图3示出了用于代码和数据的碎片的、对称密钥加密和解密运算的本发明的实施例;图4示出了用于混淆碎片的本发明的实施例;图5示出了用于分割电路门运算的本发明的实施例;图6示出了用于分割另一个电路门运算的本发明的实施例;图7示出了用于使用额外的混淆层对电路门运算进行分割的本发明的实施例;图8示出了用于在计算机网络上分割任意的门运算的电路的本发明的实施例;图9示出了用于分割带有附加的加密运算的本发明的实施例;图10示出了典型的设备驱动器运算;图11示出了关于分离的设备驱动器运算的本发明的实施例;图12示出了用于分割数学运算的本发明的实施例;图13示出了用于分割另一个数学运算的本发明的实施例;图14示出了用于分割转换加密函数的本发明的实施例;图15示出了用于分割另一个转换加密函数的本发明的实施例;图16示出了用于分割加密的比较运算的本发明的实施例;图17示出了用于分割另一个加密的比较运算的本发明的实施例;图18示出了用于分割数学的混淆转换函数的本发明的实施例;以及图19示出了用于分割另一个数学的混淆转换函数的本发明的实施例。具体实施方式通过结合组成本公开的一部分的附图和例子,参考以下的具体实施方式,可以更容易理解本发明。应当看到,本发明不限于这里描述和/或示出的具体的设备、方法、应用、条件或参数,以及这里使用的术语仅仅为了示例性地描述特定的实施例,而不意在限制所要求保护的发明。另外,正如在说明书及权利要求书中所使用的,单数形式的“一”或“一个”包括多数,以及对特定的数字值的引用至少包括该特定的数值,除非上下文有明确的相反表述。正如在这里使用的,术语“多个”是指多于一个的。当表示一个数值范围时,另一个实施例包括从一个特定的数值和/或到另一个特定的数值。类似地,当通过使用“大约”作为修饰词表示数值是近似时,应当理解,特定的数值会形成另一个实施例。所有的范围都是包括本数的和可组合的(combinative)。将会看到,文中为了清楚起见在不同的实施例的上下文中描述的本发明的某些特性,也可以在单个实施例中被组合而提供。相反,为了简洁起见在单个实施例的上下文中描述的本发明的各种特性,也可以分开地或以任何子组合(subcombination)形式被提供。而且,对在范围中阐述的数值的引用包括在该范围内的每个数值。这里公开的方案包括用于在被连接到至少一个其它计算机的受信任的计算机上执行计算机程序的方法和能够执行所述方法的系统。所述方法包括:将计算机程序划分成一系列运算;将所述一系列运算中的每个运算发送到所述至少一个其它计算机,每个运算具有伴随指令,所述伴随指令让接收所述运算的各个计算机计算所述运算,然后将该计算的结果转发到另一个计算机;以及在所述受信任的计算机处接收所述计算机程序的计算结果。加密和混淆可被用来为所述方法增加安全性。受信任的计算机是已知没有被攻击者侵害的计算机,并且可能需要所述至少一个其它计算机提供计算资源或其它资源。在非限制性例子中,所述至少一个其它计算机可以是受信任的或不受信任的,是企业网络的一部分、云的一部分、移动设备,通常是多个计算机的一部分或是被通信地连接到受信任计算机的、但不包括受信任的计算机的、任何其它的计算机或计算机组。关于“云”,所述云可以是受信任的或不受信任的,跨越多个管理域,跨越多个商业上的不同设施,或是技术上熟知的任何组合或其它情境。计算机可以通过有线连接(电的或光的)、无线连接和/或允许计算机通信数据的任何类型的连接被联网在一起。计算机还可以包括虚拟机或虚拟机组。将所述计算机程序划分成一系列运算和将所述一系列运算中的每个运算连同伴随指令一起发送到所述至少一个计算机可被称为“分割(shredding)”,每个运算被称为“碎片(shred)”。分割过程将程序转换成一系列碎片,其中每个碎片在所述至少一个计算机上执行一部分程序,并且与其它碎片通信,这样,全体碎片执行完整的计算机程序。在一个实施例中,分割过程通过随机选择计算机的方式将所述碎片放置在联网的计算机上,这样,每个计算机执行中它的碎片中指定的部分计算,然后将所述计算的其余部分转发到下一个计算机。每个计算机只知道它从哪里接收碎片,碎片内应该计算什么东西,以及它的碎片的结果转发到什么地方。如果联网的计算机的数目足够大,则可能的攻击者不能同时监视所有的计算机并把所述分割的计算接合在一起。图1示出了在受信任的计算机和云计算机上通过使用分割过程的实施例而执行的示例性程序。程序100包含四部分:输入、函数“f”、函数“g”和输出。在受信任的计算机上执行的分割器程序分析用于这个程序的二进制可执行性(binaryexecutable),发现所述四个部分,因此产生四个碎片,它们也是二进制可执行形式。输入和输出运算分别在受信任的计算机1(tc1)110和受信任的计算机4(tc4)140上被执行。tc1110和tc4140由分割器选择,因为它们被连接到需要的输入和输出设备。函数f和g在计算上是昂贵的,因此分别在云计算机2(cc2)120和云计算机3(cc3)130上执行。cc2120和cc3130是由分割器从可用的机器库中随机地选择的。tc1110接收输入,并且将所述输入赋值给变量x,然后将它转发到cc2120。cc2120接收变量x,并计算函数“f(x)”,将所述结果赋值到变量y,然后将它转发到cc3130。cc3130接收变量y,并且计算函数“g(x)”,将所述结果赋值到变量z,然后将它转发到tc4140。tc4140接收变量z并将它输出。正如在图1上可看到的,所述一系列运算中的某些运算可能需要来自受信任的计算机的输入和/或输出(i/o)交互。由于缺乏i/o设备或受信任的i/o(为了安全起见,只有受信任的计算机可以看到来自i/o设备的未加密数据),在执行碎片的计算机上,可以实施专门的“分离的(split)”设备驱动器。分离的设备驱动器实际上是两个驱动器,每个计算机上有一个驱动器,其中每个驱动器执行通常的设备驱动器的工作的一半。因为驱动器的两个半个部分都作为用户过程而执行,它们不需要对执行碎片的计算机和所述受信任的计算机两者的操作系统进行修改。以下是说明分离的设备驱动器可以如何被实施和被使用的示例性实施例。在一个实施例中,如果在某个计算机上对于运算或碎片的结果进行计算的期间,所述运算需要来自被连接到第一受信任的计算机的设备的输入,则所述某个计算机可以:在所述某个计算机上的程序驱动器处生成输入请求;将来自程序驱动器的输入请求传递到网络驱动器;将所述输入请求经由网络驱动器发送到所述第一受信任的计算机;在网络驱动器处从所述第一受信任的计算机接收所述设备的响应;以及将所述响应从所述网络驱动器传递到所述程序驱动器,供计算使用。所接收的响应可以被加密以用来增加安全性。在一个实施例中,如果在某个计算机上对于运算或碎片的结果进行计算的期间,所述运算需要来自被连接到第一受信任的计算机的设备的输入,则所述第一受信任的计算机可以:在所述第一受信任的计算机的网络驱动器处从所述某个计算机接收对所述设备的输入的请求;将所述请求从网络驱动器传递到所述设备的输入驱动器;将所述设备的响应从输入驱动器传递到网络驱动器;并且将所述响应经由网络驱动器发送到所述某个计算机。所述第一受信任的计算机可以在将所述设备的响应从所述输入驱动器传递到所述网络驱动器之前对所述响应加密,以增加安全性。在一个实施例中,如果在某个计算机上对于运算的结果进行计算期间,所述运算需要从被连接到第一受信任的计算机的设备输出,则所述某个计算机可以:在所述某个计算机上的程序驱动器处生成输出请求;将来自程序驱动器的所述输出请求传递到网络驱动器;将所述输出请求经由网络驱动器发送到所述第一受信任的计算机;在网络驱动器处从所述第一受信任的计算机接收所述设备的状态;以及将所述状态从网络驱动器传递到程序驱动器,供计算使用。所述输出请求可包括加密的数据。在一个实施例中,如果在某个计算机上对于运算的结果进行计算期间,所述运算需要从被连接到第一受信任的计算机的设备输出,则所述第一受信任的计算机可以:在所述第一受信任的计算机上的网络驱动器处,从所述某个计算机接收用于向所述设备输出的请求;将所述请求从网络驱动器传递到用于所述设备的输出驱动器;将来自所述设备的状态从输出驱动器传递到网络驱动器;以及将所述状态经由网络驱动器发送到所述某个计算机。所述请求可包括加密的数据,并且所述第一受信任的计算机在将所述请求从网络驱动器传递到输出驱动器之前可能需要解密该数据。在一个实施例中,如果在某个计算机上对于运算的结果进行计算期间,所述运算需要来自被连接到第一受信任的计算机的设备的输入,则收集该输入的方法可包括:在所述某个计算机上的程序驱动器处生成输入请求;将所述输入请求从程序驱动器传递到第一网络驱动器;将所述输入请求经由第一网络驱动器发送到所述第一受信任的计算机;在所述第一受信任的计算机上的第二网络驱动器处从所述某个计算机接收所述输入请求;将所述输入请求从第二网络驱动器传递到用于所述设备的输入驱动器;将来自所述设备的响应从所述输入驱动器传递到第二网络驱动器;将所述响应经由第二网络驱动器发送到所述某个计算机;在第一网络驱动器处,从第一受信任的计算机接收所述设备的响应;以及将所述响应从第一网络驱动器传递到程序驱动器,供计算使用。为了增加安全性,所述方法还可以包括在将所述响应从输入驱动器传递到第二网络驱动器之前加密来自所述设备的响应。因此,从第一受信任的计算机接收的响应可以被加密。在一个实施例中,如果在某个计算机上对于运算的结果进行计算期间,所述运算需要从被连接到第一受信任的计算机的设备输出,则执行该输出的方法可包括:在所述某个计算机上的程序驱动器处生成输出请求;将来自程序驱动器的所述输出请求传递到第一网络驱动器;将所述输出请求经由第一网络驱动器发送到所述第一受信任的计算机;在所述第一受信任的计算机上的第二网络驱动器处从所述某个计算机接收所述输出请求;将所述输出请求从第二网络驱动器传递到用于所述设备的输出驱动器;将来自所述设备的状态从输出驱动器传递到第二网络驱动器;将所述状态经由第二网络驱动器发送到所述某个计算机;在第一网络驱动器处从所述第一受信任的计算机接收所述状态;以及将所述状态从第一网络驱动器传递到程序驱动器,供计算使用。为了增加安全性,所述输出请求可包括加密的数据,然后该加密的数据需要在将所述输出请求从第二网络驱动器传递到输出驱动器之前被解密。可以几个层级上使用加密技术从而增加安全性。在所述受信任的计算机与所述至少一个其它计算机之间的所有的网络连接都可以被加密。这样的网络加密可以通过使用例如传输层安全性(transportlayersecurity,tls)或任何其它适用的加密方案而被实施。图2示出了分离的设备驱动器的实施方案和运算的高层级实施例,虽然未明确地示出,但它可能涉及到用于网络通信的tls加密。在云计算机1(cc1)200上的分离的设备驱动器包含两个部分:与程序连接的驱动器以及与网络连接的驱动器。同样地,在受信任的计算机1(tc1)210上的分离的设备驱动器包括两个部分:与网络连接的驱动器(网络接口1212),以及与输入设备连接的驱动器(输入设备驱动器1214)。cc1200通过利用分离的设备驱动器体系而执行“x=in()”输入运算。对于所述输入运算,与所述程序连接的驱动器生成输入请求202。该输入请求202被传递到与网络连接的驱动器,以用于加密和传输到tc1210。网络接口1212接收所述请求,并且把它传递到输入设备驱动器1214。当从该输入设备(输入设备1220)接收到响应时,所述响应由输入设备驱动器1214传递到网络接口1212。网络接口1212通过使用tls加密所述响应,并且将响应222传输到cc1200。在cc1200上的网络驱动器将tls解密的响应222转发到程序接口驱动器,程序接口驱动器又将它转发到等待程序。所述程序将接收的输入赋值给变量x,并继续执行。图2上还示出了如何通过在云计算机4(cc4)230与受信任的计算机4(tc4)240之间使用分离的设备驱动器而执行输出。用于输出的分离的设备驱动器的运算类似于输入运算,除了计算机接收的是状态消息252而不是来自设备的输入。所述一系列运算中的每个运算或每个碎片都可以被加密。每个碎片可以通过使用对称密钥加密方案(诸如先进的加密标准(aes)伽罗瓦计数器模式(gcm))或任何其它适用的方案,而被加密。对称密钥加密使用所述至少一个其它计算机的共享密钥,这样,每个碎片通过使用不同的密钥而被加密。这样的方案允许碎片仅仅在碎片所计划的其它计算机上进行解密,但将程序的其余部分隐藏不让任何其它计算机知道。所述一系列运算中的每个运算的每个数据值可以被加密。加密数据值可以通过使用诸如aesgcm的对称密钥方案,诸如rsa的公共密钥方案(public-keyscheme),或任何其它适用的方案,而被执行。这样的加密在所述受信任的计算机和所述至少一个其它计算机上被执行。如果使用对称密钥方案,则所使用的私钥(secretkey)是在数据的发送者与接收者之间的链路的共享的密钥。如果使用公共密钥方案,则所述发送者使用接收者的公共密钥用于加密,而接收者使用它的私钥用于解密。这样的方案使得所述至少一个其它计算机能够解密它所需要的、用于计算的数据,但隐藏所有的其它的数据不让所述至少一个其它计算机知道。图3示出了在图1的示例性程序中用于代码和数据的碎片的对称密钥加密和解密运算的实施例。图3,像图2一样,没有明确地示出通信数据包的tls加密和解密。在程序的计算中涉及到的四个计算机,受信任的计算机1(tc1)310、云计算机2(cc2)320、云计算机3(cc3)330和受信任的计算机4(tc4)340,分别具有密钥k1、k2、k3和k4,它们是受信任的计算机0(tc0)300所已知的。分割的程序代码在分割运算期间通过使用共享的密钥k1、k2、k3和k4,在tc0300上被加密。例如,在tc0300上的语句“in’=enc(k1,in)”表示对于in的代码通过使用密钥k1进行加密,生成加密的代码in’。在tc1310上的对应的解密运算是“in=dec(k1,in’)”,这个解密产生用于所述“in”运算的代码。因为tc1310仅仅知道密钥k1,tc1310不能解密所述加密的程序的任何其它部分,试图通过使用密钥k1来解密代码的某些其它部分将不能生成有效的代码。这个加密和解密过程,通过使用发送给碎片用于计算的每个计算机的密钥,对所有的碎片重复进行,每个计算机只被允许访问它意图计算的碎片。在计算机之间的通信链路也具有仅仅由数据的发送者和接收者知道的共享的密钥。在这种情形下,用于通信链路的共享密钥是k12、k23和k34。例如,共享的密钥k12被tc1310使用来将输入x成密文x’,以及x’通过使用密钥k12在cc2320上被解密,产生x。这个过程从计算机到计算机地被使用,以确保攻击者不能在网络上拦截未加密的文本。为了附加的安全性,应当使用混淆(obfuscation),所述混淆包括数据混淆、代码混淆或同时包括二者。混淆可以涉及到修改在每个碎片内的代码和/或数据,以隐藏原先的代码和数据不让在其它计算机处的攻击者得知。代码混淆使用混淆变换来隐藏原先的程序的逻辑,不让完全看到碎片的代码以及在碎片执行期间的指令和数据的攻击者得知该逻辑。数据混淆则变换所述数据,从而使分割的代码在混淆的数据值上执行,以使得攻击者很难恢复未混淆的数据值;蒙蔽(blinding)是数据混淆的一种。伴随着分割的混淆涉及在将所述一系列运算中的每个运算发送到各个其它的计算机之前混淆每个运算,以及反混淆(unobfuscating)所接收的、计算机程序的计算的结果。混淆的方法取决于分割的层级,并且分割可以在至少四个不同的层级上执行:门级、硬件单元级、指令级、加密方案级以及允许将程序分解为单元的任何其它方案。图4显示在四个计算机上执行程序“z=a*x+y”的混淆的例子。混淆的目的是隐藏输入a、x和y的数值以及输出z的数值以防止被云计算机2(cc2)410和云计算机3(cc3)420上的攻击者得知。受信任的计算机1(tc1)400引入三个随机数值r、s和t,它们分别被用作混淆输入a、x和y的数值的一次性密码本(one-timepad)。用于混淆的运算依赖于如何使用变量。例如,变量a与x相乘,因此混淆运算用它们的密码本值(padvalue)r和s乘以a和x,而变量y是加数,这样,混淆运算加上一次性密码本值t。cc2410和cc3420通过使用被混淆的数值a’、x’和y’而执行计算,分别计算b’和c’。cc3420通过被除以r’和s’而对于b’执行反混淆,并且受信任的计算机4(tc4)430通过减去密问t而对数值c’执行反混淆。这些过程确保攻击者永远不能得到所涉及的变量的实际的数值。门级分割是最精细的分割层级,并且提供完美的保密性,因为只看到单个其它计算机的攻击者不可能了解该计算或恢复该计算原始的输入或输出。然而,它是最慢的分割层级,并且无法提供在其它计算机上执行i/o运算的能力。在这个层级上,程序被划分成包含and、or、nand、nor和not门的电路,并且所述not门可被转换成带有相等的输入的nand门,以确保每个门运算具有两个操作数。这样,程序的一系列的运算被划分成电路门运算,每个电路门运算具有运算符、第一操作数和第二操作数。在一个实施例中,门运算电路中的每个门在两个其它计算机上被混淆并被分割。对于每个门运算,该过程涉及到受信任的计算机用第一随机值混淆第一操作数和用第二随机值混淆第二操作数。然后,被混淆的操作数连同用于第一计算机的指令一起被发送到第一计算机,所述指令使第一计算机通过使用被混淆的操作数计算多个运算的多个结果,并且将所述多个结果发送到第二计算机。受信任的计算机向第二计算机发送指令:根据运算符、第一随机值和第二数据值,从所述多个结果中选择一个结果;用第三随机值混淆所述选择的结果;以及将所述选择的结果发送到不同的计算机,其可以是受信任的计算机或另一个计算机。图5示出了在两个其它计算机上,即在云计算机1(cc1)510和云计算机2(cc2)520上,分割门计算的示例性实施例。在这个例子中,门运算“g=a&b”是要被执行的当前的分割。像图4一样,这个实施例使用一次性密码本,但使用随机值r、s和u。受信任的计算机(tc)500如下生成被混淆的程序以执行“g=a&b”。首先,tc500选择两个随机比特,分别用来混淆a和b。然后它计算“c=a^r”和“d=b^s”,其中所述“^”运算符表示xor运算。tc500然后将c和d发送到cc1510。cc1510计算四个临时值:e1=c&d;e2=c&!d;e3=c|!d;和e4=c|d。cc1510然后将{e1,e2,e3,e4}发送到cc2520。cc2520根据r和s的数值执行以下的程序中的一个程序,并且使用随机比特u来混淆结果:如果{r=0,s=0},则f=e1^u;如果{r=0,s=1},则f=e2^u;如果{r=1,s=0},则f=!e3^u;以及如果f{r=1,s=1};则f=!e4^u。cc2520然后将f发送到tc500。tc500通过计算“g=f^u”,而反混淆所述结果。在图5的示例性实施例中,tc500计算用于混淆所述数据的三个xor运算,而cc1510和cc2520执行计算。无论是cc1510还是cc2520都不知道输入数据、输出数据或计算,因为cc1510执行四个通用运算而cc2520选择正确的运算。虽然似乎and的计算或计算的结果在cc2520处被暴露,但细心的查验表明计算结果和数据都是被隐藏的。在cc2520处的程序仅仅是使{e1,e2,e3,e4}中一个数值通过或拒绝,它是由分割器程序根据只有分割器程序自己知道的r、s和u的随机值而生成的。而且,cc2520不会知道它正在计算and还是or运算,因为如图6所示,在cc1510处对变量名称的如下置换可以使得cc2520计算“aorb”:e4=c&d;e3=c&!d;e2=c|!d;e1=c|d。用于计算“g=a|b”的图6,除了在cc2620处执行的计算以外,在其它所有方面都与图5相同。类似地,nand或nor运算可以通过在cc2520处加上额外的not运算而被计算。如上所述,单个比特的not运算可以使用具有相等输入的nand运算。使用一个随机比特r以隐藏输入和使用另一个随机比特u以隐藏输出的类似的方法可被用来混淆存储单个比特的随后的电路。因此,任何电路均可以通过在tc500上引入一次性密码本(包括被使用来隐藏输入和输出的所述比特的所有的随机值)并生成两个碎片以在该一次性密码本下执行所述电路而被混淆。只要这两个碎片不是同时对攻击者可见的,这个方案就是安全的。如果电路被使用多次,则在图5-6上所示的一次性密码本方法是不安全的,因为:(1)在cc2(520、620)处可看见的数值{e1,e2,e3,e4}在cc1(510、610)处对于输入变量c和d的四种组合具有特定的模式(pattern);以及(2)用于and运算的数值{e1,e2,e3,e4}的模式与用于or运算的数值{e1,e2,e3,e4}的模式是不同的。在cc2(520、620)处收集和分析所述四个数值的攻击者可以确定所述运算。为了对抗这一点,可以引入另外的四个随机比特t1、t2、t3和t4来混淆{e1,e2,e3,e4}的数值。图7示出了使用这些新的比特的计算。图7与图5相同,但使用{t1,t2,t3,t4}用于额外的混淆。在这个例子中,受信任的计算机(tc)700混淆c和d,并且将它们发送到云计算机1(cc1)710,云计算机1(cc1)710以与图5-6中相同的方式计算{e1,e2,e3,e4}。然而,e1现在是与t1进行xor运算,e2与t2进行xor运算,e3与t3进行xor运算以及e4与t4进行xor运算,从而混淆{e1,e2,e3,e4}的数值。通常,云计算机2(cc2)720或处理第二碎片的计算机,使特定e的数值的通过或者拒绝,这取决于进行计算的所述运算以及随机比特r、s、u、t1、t2、t3和t4的数值,如以下的表格中显示的。表1:混淆的电路-门运算选择{r,s}andnandornor{r=0,s=0}f=e1^(t1^u)f=!e1^(t1^u)f=e4^(t4^u)f=!e4^(t4^u){r=0,s=1}f=e2^(t2^u)f=!e2^(t2^u)f=e3^(t3^u)f=!e3^(t3^u){r=1,s=0}f=!e3^(t3^u)f=e3^(t3^u)f=!e2^(t2^u)f=e2^(t2^u){r=1,s=1}f=!e4^(t4^u)f=e4^(t4^u)f=!e1^(t1^u)f=e1^(t1^u)在图7上,cc2720选择在and所在列下的一个计算,因为运算是“g=a&b”。然后,cc2720将f发送到tc700,其中tc700对它进行反混淆,得到最后的结果。对所述四个运算(and、nand、or、nor)中的每个运算的{e1,e2,e3,e4}的四个数值的分析表明,对于所述四个运算的每个运算,出现完全相同的16个模式(对于{t1,t2,t3,t4}的所述16个数值)。因此,在cc2720处的攻击者不能使用这些模式来确定所述运算。然而,有某些信息泄漏,因为看到cc2720处程序的攻击者可以确定r和s的数值是否相等。用于混淆两个输入比特的and、nand、or或nor运算的这个方案使用包含七个比特(r、s、t1、t2、t3、t4、u)的随机密钥来生成两个碎片。第一碎片总是执行相同的布尔运算,第二碎片选择正确的运算,并且在所述两个碎片之间的中间值的通信被混淆。混淆和计算任何的任意电路的这一过程可以在图8上看到。图8中的每个矩形代表一个计算机。初始输入从计算机800(标记为“发送输入”)被发送到第一计算机810(标记为“计算1”),其中第一碎片计算所述运算,并且将所述运算发送到第二计算机820(标记为“选择1”),其中第二碎片选择正确的运算。所述过程继续进行(例如,在计算机830与840处,分别标记为“计算2”和“选择2”,然后回到计算1810,或另一个选定的计算机)直至电路的结果被计算出并被发送到计算机850(标记为“接收输出”)为止。硬件单元级分割比起门级分割提供较少的隐私性,但能以较快的速度执行。这个层级的分割将程序划分成包括执行特定功能的硬件单元运算的电路。示例包括整数加法、整数乘法、整数比较、和浮点乘法,它们是通用计算机上的标准硬件单元。在这种模式中,所述一系列运算是数学运算,每个数学运算具有运算符、第一操作数和第二操作数。在其它计算机处的攻击者可以看见被执行的运算的类型,但猜测不出具体的运算。例如,在其它计算机处的攻击者可以看见整数加法被执行,但不能看见操作数或结果的未加密的数值。最后,像门级分割一样,硬件单元级分割不提供在其它计算机上执行i/o运算的能力。指令级分割将程序划分成指令,这样,每个碎片执行指令的子集。指令的示例包括x86机器指令和java虚拟机(jvm)字节代码。像硬件单元级分割一样,这些指令涉及到数学运算。然而,与硬件单元级分割不同的是,指令级分割兼容通过使用上述的分离的设备驱动器而执行i/o运算的程序。在一个实施例中,所述程序被划分成的所述一系列运算中的每个数学运算在两个计算机上被混淆以及被分割。对于每个数学运算,所述过程涉及到所述受信任的计算机用第一随机值混淆第一操作数以及用第二随机值混淆第二操作数。然后,被混淆的操作数连同指令一起被发送到第一计算机,所述指令指示第一计算机通过使用运算符、第一操作数和第二操作数计算运算的第一结果。第一计算机还从第二计算机接收数值,通过使用运算符、第一结果和所述数值,计算运算的第二结果,并且将所述第二结果发送到不同的计算机,它可以是受信任的计算机或另一个计算机。第二计算机获知被使用来混淆所述运算符和最终结果的所述随机值,并且使用这个知识来计算被发送到第一计算机的所述数值。在涉及到加法运算的某些实施例中,所述接收的数值是第三随机值减去第一随机值与第二随机值的和值后的结果。下面描述的图12示出了一个这样的实施例。在涉及到乘法运算的某些实施例中,所述接收的数值是第三随机值被除以第一随机值与第二随机值的乘积后的结果。下面描述的图13示出了一个这样的实施例。某些实施例可能需要将运算从乘法混淆方案转换到加法混淆方案,反之亦然。下面描述的图18显示从乘法混淆方案转换到加法混淆方案的实施例,以及下面描述的图19显示从加法混淆方案转换到乘法混淆方案的实施例。混淆所需要的随机值可以通过以下的方法被生成。程序所执行的循环被计数,以使得由在循环i所执行的指令定义的变量被函数“key(i)”蒙蔽(blind)。函数“key(i)”生成“不太大也不太小的”随机浮点值,以便限制浮点计算时的舍入误差。所述随机浮点值也是非零值,以防止在计算期间出现被零除的运算。函数“key”通过使用用于生成随机数‘i’的随机值的快速流密码(诸如salsa20)而被实施。两个秘密种子(secretseed)被用于所述流密码:一个种子用于生成加法蒙蔽值,另一个不同的种子用于生成乘法蒙蔽值。因为在程序中的每个指令是加法或是乘法,但不会同时是二者,所述执行的结果通过使用所述两个种子中的一个种子而被蒙蔽。如果在一个方案中被蒙蔽的指令的结果在相对的方案的一个运算中被使用,则使用变换运算以改变方案。在图12-13示出的例子中,tc(1200,1230,1300和1330)和cc3(1220和1320)会知道两个种子,而cc2(1210和1310)不会知道任何种子。在图18-19示出的例子中,tc(1800,1840,1900和1940)和cc3(1820和1920)会知道两个种子,cc2(1810和1910)不会知道任何种子,而cc4(1830和1930)只会知道乘法种子。在加密方案级被执行的分割通过使用依赖于在数据上执行的运算的、同态加密方案,加密所述一系列运算中的每个运算的每个数据值。加法运算通过使用加法同态加密(ahe)方案(诸如paillier)被加密,以及乘法运算通过使用乘法同态加密(mhe)方案(诸如elgamal)被加密。当在一个方案中被加密的数据需要通过使用不兼容的运算进行运算时,可以使用转换加密函数来将ahe数据值转换成mhe数据值,以及将mhe数据值转换成ahe数据值。为了增加安全性,这些转换函数可以被分割,通过将转换加密函数划分成一系列运算以及将所述转换加密函数的每个运算连同伴随指令一起发送到至少一个其它计算机,所述伴随指令用来计算各个运算的结果,并将所述结果转发到另一个计算机。下面描述的图14示出了从paillier到elgamal的分割的转换加密函数的实施例,以及下面描述的图15示出了从elgamal到paillier的分割的转换加密函数的实施例。有可能比较两个被加密的整数。下面描述的图16示出了使用paillier加密的、分割的比较函数的实施例,以及下面描述的图17示出了使用elgamal加密的、分割的比较函数的实施例。图9示出了通过使用elgamal和paillier加密方案来执行“z=a*x+b”的示例性实施例。受信任的计算机1(tc1)900使用elgamal加密a和x值,并使用paillier加密b值。函数“eg()”是指用elgamal加密,而函数“ep()”是指用paillier加密。云计算机2(cc2)910以mhe加密的数值计算“a*x”的乘法,产生mhe加密的数值y’。cc2910然后结合云计算机3(cc3)920使用分割的转换函数“gp1()”、“gp2()”和“gp3()”,将elgamal加密的数值y’转换成paillier加密的数值y”,并且通过乘以ahe加密的数值进行“b+y”相加。受信任的计算机4(tc4)930然后接收paillier加密的数值z’,并且通过使用解密paillier函数“dp()”解密它,得到解。分割的转换函数“gp1()”,“gp2()”,和“gp3()”在下面参照图15更详细地描述。如前所述,分离的设备驱动器使得碎片中的输入和输出运算能够在其它计算机上执行。作为附加的安全层,最好允许碎片只对来自i/o设备的加密的数据进行运算,这样,只有受信任的计算机可以看见来自i/o设备的未加密的数据。图10示出了在单个计算机上运行的典型的设备驱动器交互的示例性运算;而相反,图11示出了在受信任的计算机与云计算机之间的分离的设备驱动器交互的详细的示例性运算。图10示出了在单个计算机上进行的典型的设备驱动器交互的示例性运算。图10上显示的示例性应用(应用1000),从键盘(键盘硬件1020)请求输入,并且将该输入输出到控制台或屏幕(控制台硬件1040)。所述过程需要图10上标记的八个步骤。在步骤1,所述应用从计算机核心中的核心键盘设备驱动器(kk)1010请求一个字符。在步骤2,kk1010从键盘硬件1020请求一个字符。在步骤3,键盘硬件1020接收到输入,并且用一个字符响应kk1010。在步骤4,kk1010将该字符传递到所述应用以完成输入操作。在步骤5,所述应用开始输出运算,并且将该字符发送到计算机核心中的核心控制台设备驱动器(kc)1030。在步骤6,kc1030将该字符发送到控制台硬件1040。在步骤7,控制台硬件1040打印该字符,并将状态发送到kc1030。在步骤8,kc1030将状态传递到应用1000。在这个阶段,输出操作已完成,并且应用1000知道输出的状态,例如,它是否被打印到控制台屏幕、错误等等。图11示出了在受信任的计算机(tc)1102与执行与图10相同的功能的云计算机(cc)1104之间的分离的设备驱动器的实施例的运行。执行碎片1100需要来自键盘硬件1160的输入(步骤1-12),然后将该输入输出到控制台硬件1162(步骤13-24)。因为为了安全性cc1104必须从受信任的计算机获取输入并向受信任的计算机输出(这里,受信任的计算机是tc1102),设备驱动器在cc1104与tc1102之间被分割。图11的输入部分如下。在步骤1,执行碎片1100从在用户模式下的分离的键盘设备驱动器(用户模式键盘设备驱动器(ccumk)1110)请求一个字符。在步骤2,ccumk1110使用核心网络设备驱动器(cckn)1120来请求该字符。在步骤3,cckn1120与在tc上的核心网络设备驱动器(tckn)1130通信。在步骤4,tckn1130从用户模式键盘设备驱动器(tcumk)1140请求一个字符。在步骤5,tcumk1140从核心键盘设备驱动器(tckk)1150请求一个字符。在步骤6,tckn1130从键盘硬件1160请求一个字符。在步骤7,键盘硬件1160接收到输入,并且用一个字符响应tckk1150。在步骤8,tckk1150将该字符发送到tcumk1140。在步骤9,tcumk1140加密所接收的字符,并将它发送到tckn1130。在步骤10,tckn1130将加密的字符发送到cckn1120。在步骤11,cckn1120将加密的字符发送到ccumk1110。在步骤12,ccumk1110将加密的字符传递到执行碎片1100,完成输入运算。图11的输出部分为如下,并假设执行碎片1100已经从步骤1-12的处理过程接收到加密的字符。在步骤13,执行碎片1100开始输出运算,将加密的字符发送到用户模式下的分离的控制台设备驱动器(用户模式控制台设备驱动器(ccumc)1112)。在步骤14,ccumc1112使用cckn1120来发送加密的字符。在步骤15,cckn1120与tckn1130通信。在步骤16,tckn1130将加密的字符发送到用户模式控制台设备驱动器(tcumc)1142。在步骤17,tcumc1142解密所述字符,并将未加密的字符发送到核心控制台设备驱动器(tckc)1152。在步骤18,tckc1152将未加密的字符发送到控制台硬件1162。在步骤19,控制台硬件1162打印所述字符,并将状态发送到tckc1152。在步骤20,tckc1152将所述状态发送到tcumc1142。在步骤21,tcumc1142将所述状态发送到tckn1130。在步骤22,tckn1130将所述状态发送到cckn1120。在步骤23,cckn1120将所述状态发送到ccumc1112。在步骤24,ccumc1112将所述状态发送到执行碎片1100。在这个阶段,输出操作已完成,并且执行碎片1100知道输出的状态,例如,它是否被打印到控制台屏幕、错误等等。不同于所述分离的驱动器,图10中的应用1000与图11中的执行碎片1100之间的不同点还在于,执行碎片1100是在加密的数据上运算,因此其可以在被攻击者观察到的计算机上执行,此处就是cc1104。用于加密和解密所述数据的密钥仅仅可在tc1102上得到,它在tcumk1140和tcumc1142中使用该密钥。如前所述,代码混淆可被使用来隐藏原始程序的逻辑,并且可以结合数据混淆一起被使用。数据混淆可以通过使用图12-13而更好地理解,代码混淆可包括但不限于,运算码替换(opcodesubstitution)、函数合并(functionmerging)、控制流平坦化(controlflowflattening)和诱饵码(decoycode),包括不透明谓词(opaquepredicate)。图12示出了通过使用数据混淆而计算和值“g=a+b”的实施例。受信任的计算机1(tc1)1200选择两个随机数,r和s,分别混淆a和b。tc11200计算“a+r”和“b+s”,并且将结果分别赋值给变量c和d。tc11200然后将(c,d)发送到云计算机2(cc2)1210。cc21210计算和值“e=c+d”,并且请求由云计算机3(cc3)1220进行蒙蔽。cc31220被给予随机值r和s以及第三随机值u的信息,u用于蒙蔽所述最后的结果。cc31220计算“u–r–s”的数值,将它赋值到变量h,并将变量h发送到cc21210。cc21210从cc31220接收数值h,计算“e+h”,将该结果赋值到变量f,并且将它发送到受信任的计算机4(tc4)1230。tc41230然后通过计算“f–u”反蒙蔽(unblind)所述结果,完成所述运算。因此tc1200和1230使用三个随机数r、s和u作为用于混淆输入数据(a和b)和输出数据(g)的密钥,而两个云计算机1210和1220计算实际的和值。没有一个云计算机知道输入或输出数据。图13示出了通过使用数据混淆计算乘积“g=a*b”的实施例。受信任的计算机1(tc1)1300选择两个随机数,r和s,分别混淆a和b。tc11300计算“a*r”和“b*s”,并且将结果分别赋值给变量c和d。tc11300然后将(c,d)发送到云计算机2(cc2)1310。cc21310计算乘积“e=c*d”,并且请求由云计算机3(cc3)1320进行蒙蔽。cc31320被给予随机值r和s以及第三随机值u的信息,u被使用来蒙蔽最后的结果。cc31320计算“u/(r*s)”的数值,将它赋值到变量h,并将变量h发送到cc21310。cc21310从cc31320接收数值h,计算“e*h”,将结果赋值到变量f,并将它发送到受信任的计算机4(tc4)1330。tc41330然后通过计算“f/u”反蒙蔽所述结果,完成运算。这样,tc1300和1330使用三个随机值r、s和u,作为用于混淆输入数据(a和b)和输出数据(g)的密钥,而所述两个云计算机1310和1320计算实际的乘积。没有一个云计算机知道所述输入或输出数据。运算码替换包括用随机运算码替换真实运算码,阻遏碎片的静态反汇编(staticdisassembly)。对于被划分成一系列包括运算码的运算的程序,可以创建替换映射表,所述替换映射表将程序运算码映射到运算码的随机置换;所述替换映射表然后被使用来将所述一系列的运算码转换为运算码的随机置换,并且所述替换映射表被发送到远程计算机,以便在由各个其它计算机在进行反混淆时使用。反混淆可以通过在持有替换映射表的远程计算机处,从其它计算机接收对应于替换映射表的一部分的索引号,和从远程计算机向所述其它计算机发送所述替换映射表的一部分,而被执行。可以对称地看到,其它计算机可以:将对应于替换映射表的一部分的索引号发送到所述远程计算机,从所述远程计算机接收所述替换映射表的一部分,以及通过使用所述替换映射表,将运算码的随机置换转换成原始的所述一系列运算码。在一个实施例中,带有替换映射表的运算码替换可以结合java程序被使用。java字节代码具有256个运算码,其中的51个运算码(范围为203-253)没有被定义。替换映射表被引入以将原始的256运算码映射为运算码的随机置换。替换映射表能被生成碎片的计算机以及远程计算机获知,但它不能被通过使用置换的运算码来执行碎片的其它计算机获知。不使用的运算码253被所述混淆的程序作为getmap指令使用。getmap指令取32比特的索引号作为操作数,所述操作数被执行碎片的所述其它计算机发送到所述远程计算机。所述远程计算机返回256字节的结果,该结果包含要被用于该特定的碎片的替换映射表。getmap指令被插入在碎片的开始位置,并且在碎片内插入用户指定的次数。为了安全起见,应当有大量的getmap指令来阻遏使用相同的映射表的大段代码的统计分析。为了性能最佳化,在循环内只应当有少量的getmap指令。函数合并将不相干的函数组合为单个函数。所述不相干的函数每个具有参数并且在该单个函数内保持各自的行为。为了实施这样的方案,所述单个函数取所有的不相干函数的参数加上附加参数,选择执行哪个行为。如果不相干函数的数目较大,则有点相干的函数的组都可被合并,从而每组有一个单独的合并函数。平展平坦化,也被称为“chenxification”,它将函数转换到无限循环中。为了退出循环,添加了执行等同于原始函数的行为的switch语句。诱饵码被用来增加攻击者需要分析的代码数量。这可以通过将诱饵码插入到计算机程序而完成。诱饵码可包括带有许多微小突变的计算机程序的原始代码。这些微小突变创建不可静态检测的误差,并且微小突变的数目可以是用户指定的。诱饵码可以是不透明谓词方案的一部分。这样的方案通过使目标语句依赖于不透明谓词而阻遏对函数的静态分析,所述不透明谓词是容易建立和执行,但很难分析的谓词。不透明谓词可以利用阵列失真(arrayaliasing),其中有三种类型的谓词:总是真、总是假和有时真。总是真谓词在“if(如果)”分支中执行原始代码,而在“else(其它)”分支中执行诱饵码。总是假谓词在“if(如果)”分支中执行诱饵码,而在“else(其它)”分支中执行原始代码。有时真谓词在两个分支中执行原先的代码和原先的代码的混淆版本。如前所述,图14-17示出了使用paillier和elgamal加密的实施例。对于图14-17中的实施例,除另有说明外,以下的假设成立。使用公共密钥n对消息m进行paillier加密被定义为ep(m)=(n+1)mrnmodn2,,其中r是小于公共密钥n的随机非零整数,并且与n互为质数。使用私钥(b,u)对密文c进行paillier解密被定义为dp(c)=u((cbmodn2-1)/n)modn。使用公共密钥(n,g,q,h)对消息m进行elgamal加密被定义为eg(m)=(grmodn,mhrmodn),,其中r是小于n的随机非零整数。使用私钥x对密文(e,c)进行elgamal解密被定义为dg(e,c)=eq-xcmodn。图14示出了从paillier加密到elgamal加密的分割的转换加密函数的实施例。对密文从paillier解密并加密成elgamal被定义为:pg(c)=letm=u((cbmodn2-1)/n)modnin(grmodn,mhrmodn)函数“pg(c)”可以通过使用以下的过程而被分割成“pg1(c)”、“pg2(a,c)”和“pg3(w)”。数值b1与b2被随机地选择,这样,b1与b2的和值等于b(b1+b2=b)。数值u1与u2被随机地选择,这样,u1与u2的乘积等于umodn(u1*u2=umodn)。所述函数被定义为如下:pg1(c)=cb1modn2pg2(a,c)=letb=u2((acb2modn2)-1)/n)modnin(grmodn,bhrmodn)pg3(w)=u1wmodn组合所述函数将产生函数“pg_shred(c)”:pg_shred(c)=leta=pg1(c)let(v,w)=pg2(a,c)letz=pg3(w)in(v,z)在图14中,受信任的计算机1(tc1)1400用公共密钥pk加密消息m成为paillier密文c,然后将它发送到云计算机2(cc2)1410。cc21410计算“pg1(c)”,并将结果赋值到a,然后将a和c发送到云计算机3(cc3)1420。cc31420计算“pg2(a,c)”,并将结果赋值到(v,w),然后将它发送回cc21410。cc21410计算“pg3(w)”,并将结果赋值到‘z’,然后将(v,z)发送到受信任的计算机4(tc4)1430。tc41430接收现在为elgamal加密形式的密文(v,z),并且用私钥sk解密它,以揭示消息m。无论cc21410还是cc31420都不知道所有的随机选择的数值b1、b2、u1和u2。在图14中,公共密钥pk被用于替换n,以及私钥‘sk’被用于替换x。图15示出了从elgamal到paillier的分割的转换加密函数的实施例。从elgamal解密密文c并加密成paillier被定义为:gp(e,c)=letm=eq-xcmodnin(n+1)mrnmodn2函数“gp(e,c)”可以通过以下的过程而被分割成“gp1(e)”、“gp2(f)”和“gp3(v,c)”。数值x1和x2被随机地选择,以使得x1与x2的乘积等于“q–x”(x1*x2=q–x)。所述函数被定义为如下:gp1(e)=ex1modngp2(f)=leta=fx2modnin(n+1)amodn2gp3(v,c)=letw=vcmodn2inwrnmodn2组合所述函数产生函数“gp_shred(e,c)”:gp_shred(e,c)=letf=gp1(e)letv=gp2(f)ingp3(v,c)在图15中,受信任的计算机1(tc1)1500用公共密钥pk加密消息m为elgamal密文(e,c),然后将它发送到云计算机2(cc2)1510。cc21510计算“gp1(e)”,并将结果赋值到f,然后将f发送到云计算机3(cc3)1520。cc31520计算“gp2(f)”,并将结果赋值到v,然后将它发送回cc21510。cc21510计算“gp3(v,c)”,并将结果赋值到z,然后将z发送到受信任的计算机4(tc4)1530。tc41530现在接收paillier加密形式的密文z,并且用私钥sk解密它,以便揭示消息m。无论cc21510还是cc31520都不知道这两个随机选择的数值x1和x2。在图15中,公共密钥pk被用于替换(n,g,q,h),以及私钥sk被用于替换(b,u)。图16示出了使用paillier加密的分割的比较函数的实施例。如果两个整数(二者都小于n/2,其中n是公共密钥)在paillier方案中被加密,则在它们之间的顺序比较被定义为:cp(c1,c2)=letc3=invertc2modn2letc=c1c3modn2letd=u((cbmodn2-1)/n)modninifd=0theneqelseifd<n/2thengtelselt其中“eq”是指“c1=c2”,“gt”是指“c1>c2”,以及“lt”是指“c1<c2”。应当指出,c是在c1与c2之间的加密的差值,以及d是在c1与c2之间的解密的差值。函数“cp(c1,c2)”可以通过使用以下的过程而被分割成“cp1(c1,c2)”、“cp2(a,c)”和“cp3(b)”。数值b1与b2被随机地选择,这样,b1与b2的和值等于b(b1+b2=b)。数值u1与u2被随机地选择,这样,u1与u2的乘积等于umodn(u1*u2=umodn)。所述函数被定义如下:cp1(c1,c2)=letc3=invertc2modn2letc=c1c3modn2leta=cb1modn2in(a,c)cp2(a,c)=letb=u2((acb2modn2)-1)/n)modnincp3(b)cp3(b)=letd=u1bmodninifd=0theneqelseifd<n/2thengtelselt组合所述函数将产生函数“cp_shred(c1,c2)”:cp_shred(c1,c2)=let(a,c)=cp1(c1,c2)letb=cp2(a,c)incp3(b)在图16中,受信任的计算机1(tc1)1600用公共密钥pk加密消息m1成paillier密文c1,以及用公共密钥pk加密消息m2成paillier密文c2。tc11600然后将(c1,c2)发送到云计算机2(cc2)1610。cc21610计算“cp1(c1,c2)”,并将结果赋值到(a,c),然后将(a,c)发送到云计算机3(cc3)1620。cc31620计算“cp2(a,c)”,并将结果赋值到b,然后将它发送到云计算机4(cc4)1630。cc41630计算“cp3(b)”,并将结果赋值到z,然后将z发送到cc21610。cc21610接收z,以及执行条件语句,以确定“eq”、“gt”或“lt”,然后它们被用于进一步的计算。没有哪个云计算机知道所有的随机选择的数值b1、b2、u1和u2。在图16中,公共密钥pk被用于替换n。图17显示通过使用elgamal加密的分割的比较函数的实施例。如果两个整数(二者都小于n/2,其中n是公共密钥)以elgamal方案被加密,则在它们之间的顺序比较被规定为如下:cg((e1,c1),(e2,c2))=letp1=gp(e1,c1)letp2=gp(e2,c2)incp(p1,p2)其中“gp()”是在图15上规定的elgamal到paillier转换函数,以及“cp()”是在图16上规定的paillier比较函数。函数“cg((e1,c1),(e2,c2))”可以被分割为如下:cg_shred((e1,c1),(e2,c2))=letp1=gp_shred(e1,c1)letp2=gp_shred(e2,c2)incp_shred(p1,p2)在图17中,受信任的计算机1(tc1)1700用公共密钥pk加密消息m1成elgamal密文(e1,c1),用公共密钥pk加密消息m2成elgamal密文(e2,c2)。tc11700然后将(e1,c1)和(e2,c2)发送到云计算机2(cc2)1710。cc21710计算“gp1(e1)”,并将结果赋值到f1,以及计算“gp1(e2)”,并将结果赋值到f2,然后将f1和f2发送到云计算机3(cc3)1720。cc31720计算“gp2(f1)”,并将结果赋值到v1,以及计算“gp2(f2)”,并将结果赋值到v2,然后将v1和v2发送回cc21710。cc21710计算“gp3(v1,c1)”,并将结果赋值到p1,以及计算“gp3(v2,c2)”,并将结果赋值到p2。cc21710计算“cp1(p1,p2)”,并将结果赋值到(a,c),然后将(a,c)发送到云计算机3(cc3)1720。cc31720计算“cp2(a,c)”,并将结果赋值到b,然后将它发送到云计算机4(cc4)1730。cc41730计算“cp3(b)”,并将结果赋值到z,然后将z发送到cc21710。cc21710接收z,并且执行条件语句,以确定“eq”、“gt”或“lt”,然后它们被用于进一步的计算。没有哪个云计算机知道所有的随机选择的数值。在图17中,公共密钥pk被用于替换(n,g,q,h)。如前所述,分割和混淆数学运算的某些实施例可能需要将运算从乘法混淆方案转换到加法混淆方案,反之亦然。图18-19示出了这些转换函数的两个示例性实施例。图18示出了从乘法混淆方案转换到加法混淆方案的实施例。在这个示例性实施例中,所述程序用随机数r执行a的乘法蒙蔽,但需要用随机数s执行a的加法蒙蔽。为了安全性,转换过程被分割。首先,受信任的计算机1(tc1)1800和受信任的计算机5(tc5)1840选择两个随机数r和s,用来蒙蔽a。tc11800计算“a*r”,并将结果赋值到变量c,然后将它发送到云计算机2(cc2)1810。cc21810向云计算机3(cc3)1820请求乘法到加法蒙蔽。cc31820能获知随机值r和s,以及计算“r*s”,并将乘积赋值到变量h,然后将h发送到cc21810。cc21810从cc31820接收数值h,计算“c+h”,并将结果赋值到变量e,然后将它发送到云计算机4(cc4)1830。cc41830然后通过计算“e/r”而反蒙蔽所述乘积,并将结果赋值到变量f,然后将f发送到tc51840。最后,tc51840接收a的加法蒙蔽值,它等于“a+s”。变量a可以通过从f中减去s而被恢复。图19示出了从加法混淆方案转换到乘法混淆方案的实施例。所述过程基本上是图18所述的过程的逆过程。应当指出,为了保持随机种子不散布到多于所必需的计算机,箭头沿着与图18的路径的相反的路径。这样,对于任一种转换,只有tc(1800、1840、1900和1940)与cc3(1820和1920)知道两种种子,cc2(1810和1910)将不知道任何种子,以及cc4(1830和1930)将只知道乘法种子。在图19的示例性实施例中,所述程序用随机数s执行a的加法蒙蔽,但需要用随机数r进行a的乘法蒙蔽。为了安全性,转换过程被分割。首先,受信任的计算机1(tc1)1900和受信任的计算机5(tc5)1940选择两个随机数r和s,用来蒙蔽a。tc51940计算“a+s”,并将结果赋值到变量c,然后将它发送到云计算机4(cc4)1930。cc41930然后通过计算“c*r”来蒙蔽所述和值,并将结果赋值到变量e,然后将它发送到云计算机2(cc2)1910。cc21910向云计算机3(cc3)1920请求加法到乘法蒙蔽。cc31920获知随机值r和s,以及计算“r*s”,并将乘积赋值到变量h,然后将h发送到cc21910。cc21910从cc31920接收数值h,计算“e–h”,并将结果赋值到变量f,然后将它发送到tc11900。最后,tc11900接收a的乘法蒙蔽的数值,它等于“a*r”。变量a可以通过计算“f/r”而被恢复。如图18-19所示,使用了对从一个蒙蔽方案到另一个蒙蔽方案的转换的分割,这样,控制单个云计算机的攻击者不能计算出未加密的数值。在分割的转换期间,乘法密钥r被暴露给cc4(1830和1930),但在这个计算机处的攻击者只看见a的加法蒙蔽的数值。类似地,虽然在cc2(1810和1910)处的攻击者看见a的乘法蒙蔽的数值,但无法获取到乘法蒙蔽密钥“r”,从而不能计算出a。虽然两个密钥r和s都在cc3(1820和1920)处被暴露,但这个计算机只计算乘积“r*s”,以及在cc3(1820和1920)处的黑客根本不能看到a的加法蒙蔽的或乘法蒙蔽的数值。以上的方法和过程(方法i)能有效地对抗具有对单个其它计算机的根访问权的攻击者记录和分析所执行的程序、存储器中的数据和硬盘中的文件以观看隐私信息(威胁等级i)。然而,方法i不能有效地对抗可以修改在单个其它计算机上的所述执行的程序、存储器和文件以破坏执行的攻击者(威胁等级ii)。考虑到这一点,以上方法可被扩展使得每个碎片在多个其它计算机上被执行(方法ii)。来自多个其它计算机的中间数据结果将被检验其一致性,以及如果检测到不一致,则计算被中止。只要攻击者没有获得执行一个特定碎片的所有的其它计算机的控制权,方法ii就能够阻遏来自攻击者的威胁等级ii的攻击。再者,无论方法i还是方法ii都不能有效地对抗控制网络中的所有的其它计算机的攻击者(威胁级别iii)。方法ii可以被扩展成使得被选择用于执行单个程序的另外的计算机跨越多个管理域或多个商业上不同的设施(方法iii)。例如,所述另外的计算机可以从不同的公共云供应商,诸如google、amazon和/或microsoft进行选择。只要攻击者没有获得被选择用于程序的所有的域或设施的控制权,方法iii就能够阻遏来自攻击者的威胁等级iii的攻击。由以上的方法和过程所提供的隐私性是由计算和数据的分割造成的。混淆和加密运算将使执行延迟性增加额外开销,但性能恶化的主要来源是计算机之间的网络通信延迟。因此,减小在所涉及的各种计算机之间发送的消息的数目以及消息的大小非常重要。在本文中阐述或描述的每个专利、专利申请和出版物的公开内容整体地在此并入以供参考。本领域技术人员将会看到,对于本发明的优选实施例可以做出许多改变和修改,并且这些改变和修改可以在不背离本发明的精神的情况下做出。因此,所附权利要求旨在覆盖落入本发明的真实精神和范围内的所有的这样的等价变例。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1