具体实施方式
下面结合附图,对本说明书提供的方案进行描述。
图1为本说明书披露的一个实施例的同态加密传输的实施场景示意图。在图1中,示出了双方进行同态加密和数据传输的过程。在这个过程中,首先,第一端P1对其私有数据X(x1,x2,x3…)进行同态加密,得到加密数据E(X),即包括E(x1),E(x2),E(x3)…。然后第一端P1将加密数据E(x1),E(x2),E(x3)等传输给第二端P2。
第二端具有私有数据Y(y1,y2,y3…)。在接收到第一端传输的加密数据E(X)之后,第二端基于加密数据E(X)和其私有数据Y进行进一步运算,运算逻辑表示为函数f。根据同态加密和同态运算的原理:
F(E(x1),E(x2),E(x3)…,Y)=F(E(X),Y)=E(f(X,Y))
其中F是与函数f对应的同态运算函数,F=Homof,使得解密出来的明文对应函数f运算。
因此,第二端P2运算得到加密的运算结果E(f(X,Y)),并将该结果返回给第一端P1。第一端P1对接收到的运算结果进行解密,可以得到f(X,Y)的值。如此,第二端P2无需也无法知道第一端的私有数据X的值,而可以直接基于加密的数据E(X)进行所需的运算。而第一端P1则可以在不知道第二端P2的私有数据Y的情况下,直接获得与Y有关的计算结果f(X,Y),这使得第一端和第二端双方都无需知道对方的私有数据,就可以进行数据的运算。
然而,经过发明人的观察和研究,在实际的同态加密传输过程中,有可能一方,例如P1端,向对方P2发送的不是约定的同态加密算法的正常数据结构的密文E(X),而是特殊构造明文的密文,或者特殊构造的其他串,在此记为E(X’),以此试图窃取P2的私有数据Y的信息。而P2对来自P1的数据E(X’)和其本地私有数据Y进行函数运算之后,得到的计算结果是密文形式,也就是E(f(X’,Y)),没有P1方的秘钥,P2无法从该密文形式中判断计算结果是否符合约定,是否在正常范围。
下面结合具体例子描述正常同态加密和同态加密欺诈的过程。
图2a示出正常同态加密的具体例子。在该例子中,P1一端具有私有数据X(x1=3,x2=5)。P1对私有数据进行同态加密,并将加密后的数据E(x1),E(x2)传输给第二端P2。
第二端P2具有私有数据Y(y1=2,y2=1)。在接收到第一端P1传输的加密数据之后,第二端基于加密数据E(X)和其私有数据Y进行进一步运算,假定运算逻辑f可以表示为:
f(X,Y)=x1*y1+x2*y2
那么P2就可以基于E(X)和Y进行计算,得到:
E(f(X,Y))=E(x1*y1+x2*y2)=E(11)
于是,第二端P2将运算得到的加密结果E(11)返回给第一端P1。第一端P1解密就得到可以f(X,Y)=11。在该常规同态加密传输过程中,P1方只会知道运算结果f(X,Y),而无法知道Y的具体值。
然而,通过构造特殊明文或字段,却有可能窃取到P2的私有数据Y。图2b示出同态加密欺诈的具体例子。与图2a类似地,P1一端具有私有数据X(x1=3,x2=5)。但是在传输的时候,P1并不是如图2a一样诚实地将同态加密数据E(x1),E(x2)传输给第二端P2,而是在其中添加了构造数据100和10000,将伪造数据E(x1+100)和E(x2+10000)传输给P2。
P2接收到P1传输的密文数据之后,照常进行运算,但是实际运算过程为:
E(f(100+x1,10000+x2,y1,y2))
=E(x1*y1+x2*y2+100*y1+10000*y2) (式1)
=E(10211)
之后,P2如常地将该结果返回给P1,P1通过解密得到f(X’,Y)=10211。此时,如果P1已经通过图2a的过程知道f(X,Y)=11,或者P1预先知道f(X,Y)的正常结果不会超过百位,那么根据构造数据100和10000的设置方式,从式(1)就可以知道,百位对应的数字应该为y1,万位对应的数字应该为y2。于是,P1就可以推断出,y1=2,y2=1。如此,P1通过构造数据,窃取到P2端的私有数据y1和y2。
如前所述,由于P2的计算结果E(f)本身是密文形式,因此P2很难判断计算结果是否正常。而P1方传输过来的数据E(X)也是加密形式,若要判断E(X)是否为正常数据,也需要很大的附加计算量和附加通信。基于这样的考虑,在本说明书的实施例中,P1和P2预先约定计算结果的正常范围。在此基础上,P2在进行运算时,根据预先约定的范围生成随机项,使得该随机项对于正常范围内的运算结果没有影响,但是对于超出正常范围的运算结果进行混淆,从而防止P1通过构造特殊数据窃取P2的私有数据。下面描述该构思的具体实现方式。
图3示出根据一个实施例的数据加密方法的流程图。该方法由接收加密数据并进行数据运算的一方执行,例如图1和图2中的第二端P2。如图3所示,该加密方法包括,步骤S31,从对端接收第一数据;步骤S33,基于与对端预先约定的结果范围,生成随机项R,所述随机项R为随机数r与约定常数c的乘积,约定常数c大于结果范围的最大值与最小值的差;步骤S35,基于第一数据、本地私有的第二数据,以及上述随机项R进行同态运算,以生成加密结果;步骤S37,将加密结果返回给对端。下面描述图3中各个步骤的执行方式。
可以理解,图3的方法用于在数据传输的双方之间进行数据处理和加密,数据传输的双方可以称为第一端和第二端,其中第一端提供加密数据,并请求获得基于该加密数据进行进一步运算的运算加密结果,例如图1、图2中的P1方;第二端接收加密数据,并基于该加密数据进行进一步运算,以得到运算加密结果返回给第一端;第二端例如是图1和图2中的P2方。图3流程图中的方法步骤由第二端P2执行。
在执行该方法之前,通信双方,即第一端P1和第二端P2,需要约定,运算加密结果的正常结果范围。一般地,出于安全需要,P1和P2可以在加密传输过程开始之前,通过与加密传输的通信方式不同的方式来约定该结果范围。不失一般性地,结果范围可以表示为[a,b],其中a表示结果最小值,b表示结果最大值。
在第一端和第二端约定好运算加密结果的正常结果范围的情况下,第二端即可以采用图3所示方法进行数据加密。
首先,在步骤31,从对端接收第一数据。在图4的示意中,即P2从第一端P1接收数据。该接收的数据在此被称为第一数据。然而,在本步骤中,并不知晓第一数据是第一端P1按照约定,对其私有数据进行同态加密的正常加密数据,还是添加了特殊构造数据的密文数据。例如,第一端P1的私有数据X包括x1和x2,那么从第一端接收的第一数据E(X)可以表示为c1=E(x1+p1),c2=E(x2+p2),这里并不知晓p1和p2的值。在p1和p2均为0的情况下,第一数据c1和c2为按照约定进行同态加密的诚实数据;如果p1和/或p2不为0,那么第一数据则为进行了特殊构造的伪造数据。
在接收到上述第一数据之后,在步骤33,基于与对端预先约定的结果范围,生成随机项R,所述随机项R为随机数r与约定常数c的乘积,预设常数c大于结果范围的最大值与最小值的差;在步骤35,基于步骤31接收的第一数据,本地私有的第二数据,以及步骤33生成的随机项R,进行进一步同态运算,得到加密结果,用于返回给第一端P1。
下面结合预先约定的结果范围的不同情况,描述步骤33和35的执行。
在第一实施例中,约定的结果范围的最小值为0,因此,该结果范围可以表示为[0,b]。
在第一实施例的一个例子中,常数c可以被设置为任意大于b的值,例如较为简单的,c被设置为c=b+1。比如,如果约定结果范围为[0,99],那么c可以被设置为100;如果约定结果范围为[0,63],那么c可以设置为64。
在第一实施例的另一例子中,考虑结果范围的最大值b的位数,假定b是n位的自然数,那么不管b值具体为何,都将常数c设定为10^n。然后生成一随机数r。如此,在将常数c与随机数r相乘得到随机项后,随机项的高位对应于随机数r,低位的n位均为0。比如,在上面的例子中,不管M为99还是63,都是一个2位自然数,那么在这样的情况下,都将c设置为10^2=100。于是,将常数100与随机数r相乘之后得到的随机项R中,后面的2位,即低位的2位必然均为0。比如r=2356,那么随机项为235600,低2位均为0。
在第一实施例的另一例子中,结果范围以二进制表示,其中结果最大值b可以表示为2^n。此时可以将常数c设置为,在二进制表示下的2^(n+1),如此使得,在将随机数与常数c相乘得到的随机项的二进制表示中,低位的n个位均为0。
需要理解的是,由于结果范围是通信的两端预先约定的,常数c也可以是两端预先设置或约定的,例如,在约定结果范围的同时,设置或约定上述常数c。
如此,在第一实施例中,按照前述的常数c和随机数r,生成随机项R=r*c。
接着,在步骤35,基于从第一端接收的第一数据,第二端本地私有的第二数据,以及步骤33生成的随机项R,进行同态运算。
在一个实施例中,可以首先基于第一数据以及本地私有的第二数据,进行第一同态运算,得到第一运算结果。在这个过程中,第二端P2并不对从P1接收到的第一数据E(X)进行判断和区分,照常地结合本地私有的数据(在此称为第二数据,对应于图4中的数据Y)进行同态运算,得到第一运算结果,即E(f(X,Y))。然后将第一运算结果与上述随机项结合运算,即进行进一步同态运算,得到加密结果。在第一实施例中,该进一步同态运算即为第一运算结果和随机项R的同态相加加密,从而得到如下加密结果:
E(f(X,Y)+R)
然而,加密结果的运算过程并不限于以上实施例。下面以f(X,Y)=x1*y1+x2*y2为例进行描述。
在如上述实施例描述分别进行第一同态运算和第二同态运算的情况下,首先运算E(x1*y1+x2*y2),得到第一运算结果,然后进行第二同态运算,得到E(x1*y1+x2*y2+R)=E(f(X,Y)+R)。
在另一实施例中,也可以直接对第一数据、第二数据和随机项进行同态运算,而不区分上述第一同态运算过程和第二同态运算过程,或者采用不同的同态运算顺序。
例如,在一个例子中,可以首先计算E(x1*y1),然后计算E(x1*y1+R),再计算E(x1*y1+R+x2*y2)=E(f(X,Y)+R)。当然也可以首先计算E(x2*y2),然后计算E(x2*y2+R),再计算E(x2*y2+R+x1*y1)=E(f(X,Y)+R)。
或者,在一个例子中,也可以直接计算E(x1*y1+x2*y2+R),从而直接得到加密结果E(f(X,Y)+R)。
不管采用怎样的同态运算顺序,最终得到混淆有随机项的加密结果E(f(X,Y)+R)。
可以理解,如果第一端P1发送的是正常的同态加密数据E(X),那么f(X,Y)的运算结果应该在约定的结果范围之内。在第一实施例中,f(X,Y)<b。而随机项R=r*c,其中c必然大于b。因此,随机项R实际上混淆了超出b的部分,而对小于b的部分没有影响。特别是,根据前述的若干例子,如果b为n位数,随机项R可以被设计为,高位随机(对应随机数r),低位的n位为0,如此使得,如果f(X,Y)在正常范围b之内,那么可以从f(X,Y)+R结果的后n位中恢复f(X,Y);而超出n位的部分,则被随机项R的高位混淆和覆盖。
更一般地,在第二实施例中,约定的结果范围的最小值为a,最大值为b,因此,该结果范围可以表示为[a,b],其中a,b是任意整数,例如[-99,98],[12,58],等等。实际上,第一实施例可以认为是a=0的特殊例子。
由于f(X,Y)约定的结果范围在a和b之间,即a<f(X,Y)<b,那么在第二实施例中,可以构造第二运算函数g(X,Y)=f(X,Y)-a,那么显然,第二运算函数的正常结果范围为[0,b-a]。将第二运算函数作为要处理的运算函数,问题再次转化为第一实施例中范围最小值为0的情况。
类似地,设置常数c使其大于b-a。例如,在一个例子中,将常数c设置为:c=b-a+1。在另一例子中,如果b-a的结果为n位数,则将常数c设置为10^n。
比如,如果针对f(X,Y)约定的结果范围为[12,58],那么构造的第二运算函数g(X,Y)=f(X,Y)-12的结果范围为[0,46]。可以将常数c设置为任意大于46的值。例如,可以将常数c设为47;或者,更简便地,将其设置为100。
如前所述,常数c可以是通信两端预先设置或约定的,例如,在约定结果范围的同时,设置或约定上述常数c。
在已经设置或约定上述常数c的基础上,在步骤33中,生成一随机数r。将以上设置的常数c与随机数r的乘积作为随机项R。
接着,在步骤35,基于第一数据、本地私有的第二数据,以及生成的随机项R,进行同态运算,得到加密结果。在一个示例中,该同态运算包括,首先对第一数据和第二数据进行同态运算,得到第一运算结果;然后将第一运算结果减去结果范围的最小值a,得到与第二运算函数对应的第二运算结果;之后将该第二运算结果和随机项R进行同态相加加密,从而得到如下加密结果:
E(g(X,Y)+R)=E(f(X,Y)-a+R)=E(f(X,Y)-a+r*c)
与第一实施例中的描述类似的,加密结果的运算过程并不限于以上示例。在其他示例中,也可以直接对第一数据、第二数据和随机项进行同态运算,而不区分上述第一运算结果和第二运算结果,或者采用不同的同态运算顺序。具体过程不再赘述。
不管采用怎样的同态运算顺序,最终得到混淆有随机项的加密结果E(g(X,Y)+R)。
如果第一端P1发送的是正常的同态加密数据E(X),那么f(X,Y)的运算结果应该在约定的结果范围[a,b]之内,相应地,g(X,Y)=f(X,Y)-a应该在[0,b-a]之内。而随机项R=r*c,其中c必然大于b-a。因此,随机项R实际上混淆了g(X,Y)超出b-a的部分,而对小于b-a的部分没有影响。特别是,在某些具体例子中,如果b-a为n位数,随机项R可以被设计为,高位随机(对应随机数r),低位的n位为0,如此使得,如果g(X,Y)在正常范围b-a之内,那么可以从g(X,Y)+R结果的后n位中恢复g(X,Y);而超出n位的部分,则被随机项R的高位混淆和覆盖。
如此,第二端通过在结果中加入特殊构造的随机项R,生成加密结果。该加密结果对于约定结果范围的数据没有影响,但是会混淆超出约定结果范围的数据。接着,在步骤37,第二端将这样的加密结果返回给对端,即第一端。
接下来描述,第一端对接收到的加密结果进行解密的过程。
图4示出根据一个实施例的数据解密的方法流程图,可以理解,该方法步骤由与图3方法的执行端相对的一端来执行。例如,在图3由第二端P2执行的情况下,图4的方法由第一端P1执行。如图4所示,该方法包括:步骤41,接收根据图3的方法进行同态加密的加密结果;步骤43,对所述加密结果进行同态解密,得到解密结果;步骤45,获取解密结果对所述约定常数c取模的余数;步骤47,基于所述余数确定运算结果的值。下面描述上述各个步骤的执行过程。
如前所述,在图3的步骤39中,第二端将加密结果返回给对端,即第一端;那么相对应地,在步骤41,第一端从第二端接收到上述加密结果。可以理解,该加密结果是根据图3的方法,掺杂了随机项R的加密结果。
下面仍然与前述第一实施例和第二实施例对应地描述后续步骤的执行方式。
在第一实施例中,约定的结果范围可以表示为[0,b],相应地,第二端发送的加密结果可以表示为E(f(X,Y)+R),其中R为随机项。
接着,在步骤43,对上述加密结果进行同态解密,得到解密结果,即得到f(X,Y)+R的值d。
如前所述,随机项R可以表示为R=r*c,其中r为随机数,c为约定常数,且c>b。因此解密结果d可以表示为:
d=f(X,Y)+R=f(X,Y)+r*c
基于此,在步骤45,获取解密结果d对约定常数c取模的余数。
由于f(X,Y)的约定范围为[0,b],因此,如果第一端发送的是正常同态加密数据E(X),那么基于此的计算结果f(X,Y)<=b;又有:c>b,那么,f(X,Y)<c。
因此,如果用解密结果d除以约定常数c,必然得出商为r,余数即为不足c的部分f(X,Y)。
在一个具体例子中,约定常数c被设置为10^n。此时,步骤45中对约定常数c取模的方式变得非常简单,即获取解密结果d中最低的n位,即为取模之后的余数。
在另一具体例子中,约定常数c被设置为2^(n+1),并且解密结果和随机项均以二进制表示。由于约定常数c为设置为2^(n+1),在随机项R的二进制表示中,从低位向高位排列的前n位均为0。在这样的情况下,步骤45中对约定常数c取模的方式即为,获取解密结果d的二进制表示中从低位向高位排列的前n位,作为余数。
如前所述,正常运算的f(X,Y)必然小于c,因此,在步骤47,可以将该余数确定为运算结果f(X,Y)的值。
在第二实施例中,约定的结果范围可以表示为[a,b],相应地,第二端发送的加密结果可以表示为E(g(X,Y)+R)=E(f(X,Y)-a+R),其中R为随机项。
类似的,在步骤43,对上述加密结果进行同态解密,得到解密结果,即得到g(X,Y)+R的值d。
在这里,随机项R可以表示为R=r*c,其中r为随机数,c为约定常数,且c>b-a。因此解密结果d可以表示为:
d=g(X,Y)+R=g(X,Y)+r*c
与第一实施例类似的,在步骤45,获取解密结果d对约定常数c取模的余数。
由于f(X,Y)的约定范围为[a,b],因此,如果第一端发送的是正常同态加密数据E(X),那么基于此的计算结果a<=f(X,Y)<=b;
于是有0<=g(X,Y)<=b-a;
另一方面又有:c>b-a,那么,g(X,Y)<c。
因此,如果用解密结果d除以约定常数c,必然得出商为r,g(X,Y)由于不足c,即作为d除以c的余数。
与前述类似的,如果约定常数c被设置为10^n,那么可以通过获取解密结果d中最低的n位得到取模之后的余数。如果约定常数c被设置为2^(n+1),并且解密结果和随机项均以二进制表示,那么可以获取解密结果d的二进制表示中从低位向高位排列的前n位作为余数。
接下来,在步骤47,基于上述余数确定运算结果的值。具体地,在该第二实施例中,步骤47进一步包括,首先基于余数确定中间运算结果g(X,Y)的值。如上所述,可以将步骤45中确定出的余数作为中间运算结果g(X,Y)的值。然后,将中间运算结果加上结果范围的最小值a,即可得到运算结果f(X,Y)的值,即f(X,Y)=g(X,Y)+a。
下面结合一个具体例子描述加密和解密的完整过程。图5示出采用图3和图4的加密和解密方法进行同态加密传输的过程的例子。
假定第一端P1和第二端P2预先约定,正常的结果范围为2位数,且约定常数c为100。然后第一端P1向第二端P2发送加密数据E(X’),即E(x1+b1)和E(x2+b2)。例如,当b1=100,b2=10000,即为图2a所示的窃取数据的情况。
第二端P2正常计算E(f(X’,Y))后,还生成随机项R,例如随机数r取2356,那么随机项R=r*c=235600。第二端将该随机项R添加到加密结果中,并将该加密结果E(f(X’,Y)+R)返回给第一端P1。
在与图2a和2b例子中X,Y取值相同的情况下,f(X,Y)=11。P1通过对加密结果进行解密得到解密结果d,其中结果d可以分解为:
d=f(X’,Y)+R=x1*y1+x2*y2+100*y1+10000*y2+R
=f(X,Y)+100*y1+10000*y2+R
=11+10211+235600
=245811
在该结果d中,仍然可以通过最后2位提取出正常的f(X,Y)的值;但是,设计用于窃取P2方私有数据y1和y2的100*y1+10000*y2的结果被R混淆。P1无法再像图2b所示一样,通过百位数字定出y1,通过万位定出y2。
通过以上过程可以看到,第一端P1和第二端P2预先约定正常的结果范围,和预定常数c。第二端P2在加密结果中基于约定的结果范围和预定常数引入了特殊构造的随机项,使得该随机项对于正常结果范围的运算结果没有影响,对于超出正常结果范围的数据进行混淆。如果第一端P1发送的是正常的同态加密数据,那么第二端P2运算之后的运算结果应该在约定的结果范围。那么第一端P1可以从加密结果中恢复出运算结果;如果第一端P1发送的是不诚实的特殊构造的加密数据,那么运算结果将会超出正常结果范围,而这样的超出正常结果范围的部分会被随机项混淆,无法获知其真实值,因而P1无法通过超出结果范围的部分窃取P2的私有数据。如此,在不增加附加通信的情况下,防止第一端窃取第二端的私有数据。
根据另一方面的实施例,还提供了数据加密和数据解密的装置。图6示出根据一个实施例的数据加密装置的示意性框图。如图6所示,数据加密装置60包括:接收单元61,配置为从对端接收第一数据;随机生成单元63,配置为基于与所述对端预先约定的结果范围,生成随机项R,所述结果范围包括结果最小值a和结果最大值b,所述随机项R为随机数r与约定常数c的乘积,所述约定常数c大于所述结果最大值b与结果最小值a的差值;运算单元65,配置为基于所述第一数据、本地私有的第二数据,以及所述随机项,进行同态运算,得到加密结果;发送单元67,配置为将所述加密结果返回给所述对端。
在一个实施例中,运算单元包括(未示出):第一运算模块,配置为基于所述第一数据和所述第二数据,进行第一同态运算,得到第一运算结果;第二运算模块,配置为基于所述第一运算结果和所述随机项,进行第二同态运算,得到加密结果。
进一步地,在一个实施例中,上述第二运算模块配置为:获取所述第一运算结果与所述结果最小值a的差值作为第二运算结果;对所述第二运算结果与所述随机项进行同态求和加密,从而生成所述加密结果。
根据一个实施例,结果最小值a为0,结果最大值b为n位自然数;约定常数c为10^n。此时,随机生成单元65所生成的所述随机项R中从高位向低位排列的后n位均为0,其中n为自然数。
根据一个实施例,结果最小值a为0,结果最大值b为2^n,约定常数c为2^(n+1),并且所述随机项以二进制表示。此时,随机生成单元65生成的随机项R的二进制表示中,从高位向低位排列的后n位均为0,其中n为自然数。
在一个实施例中,约定常数c取值为Δ+1,其中Δ为所述结果最大值b与结果最小值a的差值。
图7示出根据一个实施例的数据解密装置的示意性框图。如图7所示,数据解密装置70包括:接收单元71,配置为从图6的数据加密装置60接收同态加密的加密结果;解密单元73,配置为对所述加密结果进行同态解密,得到解密结果;取模单元75,配置为获取解密结果对所述约定常数c取模的余数;确定单元77,配置为基于所述余数确定所述运算结果的值。
在一个实施例中,确定单元77配置为:确定运算结果的值为所述余数的值加上所述结果最小值a。
根据一个实施例,约定常数c被设置为10^n。此时,取模单元75配置为,获取所述解密结果中从高位向低位排列的后n位,作为所述余数。
根据一个实施例,解密结果和随机项均以二进制表示,随机项的二进制表示中,从高位向低位排列的后n位均为0。此时,取模单元75配置为,获取所述解密结果的二进制表示中从高位向低位排列的后n位,作为所述余数。
根据另一方面的实施例,还提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行结合图3和图4所描述的方法。
根据再一方面的实施例,还提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现结合图3和图4所述的方法。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。