CN115529120A - 一种保密计算系统 - Google Patents
一种保密计算系统 Download PDFInfo
- Publication number
- CN115529120A CN115529120A CN202211078106.4A CN202211078106A CN115529120A CN 115529120 A CN115529120 A CN 115529120A CN 202211078106 A CN202211078106 A CN 202211078106A CN 115529120 A CN115529120 A CN 115529120A
- Authority
- CN
- China
- Prior art keywords
- ciphertext
- component
- plaintext
- calculation
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/008—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols involving homomorphic encryption
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/32—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
- H04L9/3236—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials using cryptographic hash functions
- H04L9/3242—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials using cryptographic hash functions involving keyed hash functions, e.g. message authentication codes [MACs], CBC-MAC or HMAC
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/32—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
- H04L9/3247—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving digital signatures
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Power Engineering (AREA)
- Financial Or Insurance-Related Operations Such As Payment And Settlement (AREA)
Abstract
保密计算系统包括普通密码组件或构件、核心密码组件或构件,其中普通密码组件或构件采用同态加密算法对数据加密及密文运算;普通密码组件或构件没有解密密文数的密钥;核心密码组件或构件对密文数进行整理,针对密文数进行复杂计算以及在获得授权后将密文数解密并安全返回给合法用户;针对密文数的整理包括改变或调整加密、解密及密文运算采用的参数、加密密钥以及同态加密算法;针对密文数的复杂计算是指基于密文数进行有限次数的加、乘运算无法得到期望结果的计算或无法完成的计算;在放大因子之外引入浮动因子,实现近似浮点数运算的密文运算;将密码运算上下文及加密参数包含在密文数数据对象中,程序员按通常方式使用数据编写程序。
Description
技术领域
本发明属于密码技术领域,特别是一种保密计算系统。
背景技术
自Google提出联邦学习后,面向机器学习的隐私计算技术在近几年获得迅速发展。隐私计算在保证客户、用户敏感信息不被泄露的情况下,通过加密计算、差分计算、多方协同计算实现各种计算模型(如人工神经网络模型)、预测模型的训练,实现针对数据的分析处理等。同态加密技术是隐私计算最常用的保密计算技术,同态加密技术基于同态加密算法,能实现密文数运算和明文数运算之间的同态:针对密文数的加、乘法运算结果对应于相应明文数进行同样运算(加、乘法)后的加密结果,比如,x和y为两个明文数,X、Y为它们加密后对应的密文数,即X=Enc(x),Y=Enc(y),为Enc()加密,则有:
X+Y=Enc(x)+Enc(y)=Enc(x+y)(加同态),
X×Y=Enc(x)×Enc(y)=Enc(x×y)(乘同态)
注意,这里针对密文数的“+”、“y”不是通常的针对“数”的加、乘,只是符号借用(下同)。除了针对单一明文数(即单个明文数)的加密及密文运算,目前的同态加密算法常常针对明文向量进行加密及同态密文运算。
假如有明文向量x=(x1,x2,…,xn),y=(y1,y2,…,yn),对其加密后的密文分别为为X=Enc(x1,x2,…,xn),Y=Enc(y1,y2,…,yn),则有:
X+Y=Enc(x)+Enc(y)=Enc(x1+y1,x2+y2,…,xn+yn)(向量加同态),
X×Y=Enc(x)×Enc(y)=Enc(x1×y1,x2×y2,…,xn×yn)(向量乘同态)。
这里需要注意的是,(1)明文向量加密后的密文不一定是向量,对向量加密通常是将一个向量映射为多项式环中的一个多项式,加密的结果(密文)也通常是多项式环中的一个多项式;(2)这里的向量乘,与通常的向量点乘(内积)不同,这里的向量乘运算采用的是向量各对应元素(分量)的乘运算。
同态加密算法分为部分同态加密算法和全同态加密算法,部分同态加密算法只能实现加或乘运算的同态(如Paillier、RSA),而全同态加密算法能同时实现加、乘运算的同态(如BGV、BFV、CKKS)(通常,有加法同态,就能实现减法同态)。从计算结果的准确度的角度,有近似同态加密算法(得到近似结果,如CKKS)和精确同态加密算法(得到精确结果,如BGV、BFV)。在很多应用场合,比如模型训练、数据预测,近似同态加密算法就足够,简单且效果好。除了用于诸如模型训练、数据分析等隐私计算,同态加密技术还可以用于其他很多应用场合、场景,比如,SaaS云计算应用,企业内部应用(如财务系统)。
目前的隐私计算,用于计算的数据是由客户或用户以加密数据的形式提供的,利用密文数据进行计算如模型训练往往是由专门的隐私计算平台或服务商提供,为了保证用户数据安全,利用密文数据进行计算、处理的一方(隐私计算平台或服务提高商)不应该拥有解密密钥(同态加密算法的私钥),不应具有解密数据的能力,即利用密文数据进行计算、处理的一方应完全基于加密数据(密文数)进行计算。但这种仅仅使用密文数进行运算、计算的方式也存在一定的问题,因为密文数进行乘运算会导致数据加密引入的(LWE)噪声变大,密文数也会不断地增大,而且目前的同态加密算法通常只支持整数加密及运算,带小数的数要通过放大转换为整数,近似同态加密算法为了提高精度即便整数也要放大,这导致密文数很大,而密文乘运算将这种放大效果进一步放大,这会导致计算效率低,资源消耗增加,使得近似同态加密算法的误差增大、计算精度降低,因此,同态加密通常会通过设定密文(运算)层级(level)的数量(即运算深度)来限制乘的次数,一个密文数每进行一次乘运算,其密文层级将减少一级(即其允许的乘运算次数将减一),同时通过密文层级转(切)换处理,如bootstrapping、模数切换(modulus switching)、重伸缩(rescale),来降低密文乘运算带了的噪声增加(密文数refreshing),来减少放大对密文数乘运算的倍增影响,但这又带了一个问题,如果需要进行乘的次数很多很多怎么办?甚至无限如递归计算怎办?总不能无限增大密文数据的密文层级的数量吧?
目前的同态加密算法只能或设计为只能进行整数同态密文运算,而现实中要计算、处理的数大多是带有小数的实数,因此,目前针对实数同态密文运算常用的做法是通过将实数乘以一个放大因子γ(scaling factor,也称缩放因子,但它通常取值远远大于1,因此通常也称为放大因子或扩张倍数,放大因子γ在CKKS中使用的符号是Δ),然后对乘积取整,然后再对取整结果加密,从而将针对实数的运算转换为针对整数的运算,即将针对实数的同态密文运算转换为针对整数的同态密文运算(对于包含小数部分的实数,乘以放大因子也使得小数部分有足够的有效数字得以保留),而对于近似同态加密算法,也需要通过将待加密的数(即便是整数)乘以一个放大因子来提高密文运算的精度。在计算机技术中,这种做法实际上是将浮点数的运算转换成了定点数的运算,而这个放大因子实际上决定、确定了定点数小数点的位置。但这种做法在实际应用中仍然存在一定的问题,因为不同的数的数量级是不一样的,不同数量级的数要乘以同样的放大因子才能进行运算,而针对不同数量级的数,为来保证数据的加密结果、运算结果有足够的有效位数,则放大因子可能要非常地大(考虑到或兼顾到很小的数),这将导致参与计算的整数可能非常地大,导致计算效率很低;而为了保证计算效率,放大因子不能太大,而这又会导致很小的数丢失有效数字(位),甚至变为0,因此,不同数量级的数应该使用不同的放大因子,但这又带了问题,同态加密算法要求参与运算的数使用同样的放大因子,如果两个密文数加密时使用的放大因子不一样,则无法得到正确的密文运算结果(注意,模数与放大因子可能相关,放大因子γ不同,采用的模数也会存在不同,比如,CKKS算法中的qL=pLq0、ql=plq0,p与放大因子γ要几乎相等,即便模数相同,加、减运算的两个数的放大因子也必须一样才能运算),因此,两个采用不同放大因子的密文数要进行运算,必须先将二者的放大因子γ变为一致(对于加、减运算,这相当于小数点对齐),而基于密文数通常很难做这种调整。
还有,由于以上原因,一些常用函数,比如ex,sin(x),直接使用密文数计算(比如eX,sin(X)),效率低,且精度、有效位数无法保证。
还有,由于各种原因(比如数据来自不同的参与方、历史原因),参与保密计算的数据可能使用不同的同态加密算法、加密参数、公钥,这些使用不同的同态加密算法、加密参数、公钥加密的数据是不能直接进行密文运算的。
还有,普通程序人员不了解同态加密算法(理解算法有难度),不熟悉使用同态加密算法对数据进行加密的原理、步骤,不熟悉如何使用同态加密的密文数进行运算、计算,因此,很难做到正确、恰当地使用已有的同态加密库进行计算程序的编写,这给同态加密技术的应用带来障碍。
发明内容
本发明的目的是针对同态加密技术在实际应用中存在的问题,提出一种技术方案,以克服现有技术的不足。
针对本发明的目的所提出的技术方案是一种保密计算系统。
在本发明的描述中,若无特别说明,明文数是指采用同态加密算法加密前的数(据),以及对同态加密的密文数解密后得到的数(据),即它是待加密的原始数(据)和解密得到的最终数(据),不是为加密而编码的数(据)(比如多项式);只有一个明文数的数据称为单一明文数,由多个明文数构成的向量称为明文向量;单一明文数和明文向量统称为明文数(即若无特别说明,发明所述明文数同时包括单一明文数和明文向量);单一明文数加密后的密文称为单一密文数,明文向量加密后的密文称为向量密文数(注意,向量密文是指向量加密的结果,它不一定是向量,在“向量密文”后加一个“数”是为了强调它能像数一样运算);单一密文数和向量密文数统称为密文数;即本发明中明文数同时包括单一明文数和明文向量,密文数同时包括单一密文数和向量密文数;
采用同态加密算法对数据进行的加密(操作)简称为同态加密,数据加密时的运算称为加密运算,数据解密时的运算称为解密运算,基于同态加密算法针对密文数进行的加(减)、乘运算(代数运算)称为同态密文运算,简称密文运算(属于保密运算);加密运算、解密运算以及密文运算统称为密码运算;由一个或多个密文运算构成的针对密文数的计算过程称为密文计算;对数据进行加密运算生成密文数,并针对密文数进行一系列的密文运算以得到期望的计算结果、以及最终解密得到计算结果的整个过程称为保密计算(即保密计算是包括数据加密、密文运算、密文计算、数据解密等一系列处理的计算过程)。
若密文数为向量密文数,则本发明中针对密文数的加、乘运算之外的其他各种计算(其中包括复杂计算),既包括针对向量密文数中的被加密的每个明文元素进行同样计算的方式,也包括非针对向量密文数中的被加密的每个明文元素进行同样计算的方式(参见后面的实施例)。
本发明提出的保密计算系统具体如下。
所述保密计算系统包括普通密码组件或构件、核心密码组件或构件,其中:
普通密码组件或构件:采用同态加密算法对明文数进行加密以及针对密文数进行代数运算即密文运算(如针对密文数的加、乘运算);普通密码组件或构件没有用于解密密文数的密钥(私钥);
核心密码组件或构件:对密文数进行整理,针对密文数进行复杂计算,以及将密文数解密后安全返回给解密数据的使用者或拥有者;对密文数的整理针对的是如果不解密密文数得到其明文数,就很难或无法做到的针对密文数的改变或调整,其中包括改变或调整数据加密运算、数据解密运算及密文运算即密码运算所采用的密码运算上下文(如改变模数,如改变CKKS中的模数qL,改变或变更当前的模数ql,改变多项式环采用的多项式模比如XN+1,改变采用的同态加密算法等),改变或调整密码运算上下文之外的与密码运算有关的参数(如改变或调整放大因子γ,改变采用的加密密钥即公钥;在采用的同态加密方案中,若某个数选择的放大因子γ是固定的,则放大因子γ可以属于密码运算上下文,也可以不属于,但如果不固定,则不属于),以及改变或调整密文数的密文层级(比如,密文层级已用完,后续还需要进行密文数的乘运算,再比如,每进行一次乘运算,一个密文数的密文层级变化是从高变低,但现在要反过来将密文层级从低变到高,举个例子,递归计算yi+1=a×yi+b×ui中的yi,经过一定次数的递归计算后,需要提升其密文层级,而若算法不支持这么做,则通常无法做到,而采用本发明可以);核心密码组件或构件有用于解密密文数的密钥(私钥);用于解密密文数的密钥(私钥)被安全保护;核心密码组件或构件不以明文形式返回敏感数据,所述敏感数据包括从密文数解密得到的数据,以及利用从密文数解密得到的数据所计算得到的不允许以明文返回的数据(利用从密文数解密得到的数据所计算得到的数据中哪些属于不允许明文返回的数据,由实施者定);
所述明文数包括单一明文数和明文向量,所述密文数包括单一明文数加密后的密文即单一密文数和明文向量加密后的密文即向量密文数;
所述复杂计算是指由于受到密文数允许进行的乘运算的次数的限制即密文层级的限制而无法得到期望结果的计算(比如精度要求很高的eX、ln(X)、sin(X)等函数计算),或者利用密文数很难或无法完成的计算;所述很难或无法完成的计算是指由于受到同态加密算法本身或计算技术的限制(比如实际计算中由于计算、存储资源的限制,密文层级数不能无限增加、密文数不能无限增大)而无法在要求或规定的时间内基于密文数完成并得到期望结果的计算(比如无法满足计算精度要求,或因算法原因完全无法完成的计算);
所述密码运算上下文是指针对数据进行加密运算、解密运算及密文运算即密码运算所必需的共同参数的集合,所述共同参数的集合构成了密码运算的基本背景环境(放大因子,浮动因子的生成参数,它们可以属于也可以不属于密码运算上小文中的信息,它们可以属于密文数据对象包含的信息,而同态加密算法标识信息、密码运算采用的环如多项式环的构造参数、密码运算中使用的模数等属于密码运算上小文中的信息,而浮动因子、当前密文运算模数如CKKS的ql或层级、公钥、私钥不属于共同参数,因此不属于密码运算上下文);若所述保密计算系统同时支持不同的同态加密算法,则密码运算上下文还包括同态加密算法标识符,用于标识数据加密运算、解密运算及密文运算所采用的同态加密算法;若密码运算上下文中没有同态加密算法标识符,则(密码运算上下文)相应的同态加密算法为缺省的算法;
所述普通密码组件或构件、所述核心密码组件或构件中的所述组件为不能独立运行的系统部件(包括软件或硬件,如SDK、API或密码卡),所述构件为能独立运行的系统部件(如独立运行的程序,包含软硬件的密码服务器、密码机等);所述普通密码组件或构件和所述核心密码组件或构件位于相同或不同的运行场所(场地),若二者位于不同的运行场所(场地),则(当普通密码组件或构件需要调用核心密码组件或构件时)普通密码组件或构件通过网络与核心密码组件或构件进行数据交换(即便位于同一个场所,但位于或属于不同的计算设备中,也要通过网络进行数据交换);
对于所述普通密码组件或构件提交的对密文数进行整理的请求,所述核心密码组件或构件解密待整理的密文数,对解密得到的明文数按普通密码组件或构件的要求进行整理,然后采用同态加密算法对整理后的明文数重新进行加密,之后将重新加密得到的密文数返回;
对于所述普通密码组件或构件提交的针对(一个或多个)密文数进行复杂计算的请求,所述核心密码组件或构件解密密文数,利用解密得到的(一个或多个)明文数进行普通密码组件或构件所要求的复杂计算,然后采用同态加密算法对计算得到的结果进行加密,之后将加密得到的密文数返回;
对于解密返回密文数对应的明文数的请求(请求由普通密码组件或构件提交,或者由其他实体通过其他方式提交),所述核心密码组件或构件在确认请求获得解密数据的使用者或拥有者,以及/或者核心密码组件或构件的拥有者或管理者或控制者的授权后,解密密文数,将解密得到的明文数用解密数据的使用者或拥有者的数据加密密钥加密(通常是公钥,包括普通公钥或同态加密公钥,也可以是对称密钥),然后将加密得到的密文(解密得到的明文数重新加密后得到的密文)返回给解密数据的使用者或拥有者(通常是返回给普通密码组件或构件,然后由普通密码组件或构件返回给解密数据的使用者或拥有者,或者通过其他方式返回给解密数据的使用者或拥有者);之后,解密数据的使用者或拥有者使用数据解密密钥(通常是私钥,包括普通私钥或同态加密私钥,也可以是对称密钥)解密核心密码组件或构件返回的密文(即解密重新加密后的明文数),最终获得明文数(对返回给解密数据的使用者或拥有者的明文数进行加密所采用的密码算法没有特别限制)。
需要指出的是,密码运算上下文,即进行数据加密运算、数据解密运算及密文运算所必需的共同参数的集合,在具体实施中通常通过一个称为密码运算上下文或密码上下文或加密上下文等某某上下文的数据结构实现,用于存放密码运算中所需的各种共同参数(即所述密码运算上下文中的参数),因此,提到密码运算上下文应根据文字陈述、叙述的上下文确定所说的密码运算上下文是指密码运算所必需的各种共同参数,还是指具体的数据结构,在发明方案描述中是指进行数据加密运算、数据解密运算及密文运算所必需的共同参数的集合。
一个待加密处理的单一明文数(包括实数和复数,实数在计算机中对应整数和浮点数)被分解为一个浮动因子β(floating factor)与一个有效数位数的乘积(浮动因子β不是同态加密中的放大因子γ),所述有效数位数是指包含的有效数字有期望的位数的数即具有足够的有效数位的数(注意有效数字与有效数字的位数也即有效位数的差别,有效位数指有效数字位的个数);对于复数明文数,其实部和虚部的浮动因子相同(不同会调整多);浮动因子为正数(浮动因子可以大于1、小于1或为1);对有效数位数加密得到有效数位数(的)密文,有效数位数(的)密文与浮动因子一起构成了单一明文数的密文即单一密文数;
一个待加密的明文向量(实数或复数向量,向量整体作为一个数),其每个元素被分解为同一个浮动因子β与一个有效数位数的乘积,所有元素的有效数位数(按对应的明文元素的原有顺序排列)构成了一个有效数位数(明文)向量(即分解时,明文向量的每个元素的浮动因子都相同,浮动因子β乘以有效数位数向量就是原有明文向量,就像向量各元素的放大因子γ相同一样;注:取浮动因子是乘放大因子之前的处理);对有效数位数向量加密得到有效数位数向量的密文即(有效数位数向量的)向量密文数,有效数位数向量的密文即向量密文数与浮动因子一起构成了明文向量的密文即(明文向量的)向量密文数;
单一明文数的有效数位数和明文向量的有效数位数向量统称为(明文数的)有效数位数,单一明文数的有效数位数的密文即密文数和明文向量的有效数位数向量的密文即(有效数位数向量的)向量密文数统称为有效数位数的密文或有效数位数的密文数(即若无特别说明,本发明中所述明文数的有效数位数同时包括单一明文数的有效数位数和明文向量的有效数位数向量,有效数位数的密文同时包括单一明文数的有效数位数的密文即密文数和明文向量的有效数位数向量的密文即向量密文数);
浮动因子的选取应使得的采用同态加密算法按通常的方式针对有效数位数进行加密,加密得到的结果以及基于密文数的运算的结果(密文运算结果)满足对数据(加密、解密前后,密文运算前后)的有效位数、计算精度和计算效率要求(比如,待加密的有效数位数本身不能太大,有足够的精度和有效位数等,尤其对于近似同态加密算法更是如此);所述按通常的方式针对有效数位数进行加密是指没有引入浮动因子时对待加密的数进行加密所采用的加密方式(比如,对有效数位数加密时,仍需对待加密的有效数位数乘以放大因子γ);
当一个系统部件,其中包括普通密码组件或构件以及核心密码组件或构件,对一个明文数加密时,(系统部件,如普通密码组件或构件,或者核心密码组件或构件)先将待加密的明文数分解为一个浮动因子β与一个有效数位数的乘积,然后采用同态加密算法按通常的方式对有效数位数加密,得到有效数位数的密文(数)(有效数位数加密前,同样要乘以放大因子γ,浮动因子β不加密),然后将浮动因子和有效数位数的密文(数)组合形成明文数加密后的密文数;
当一个系统部件,其中包括核心密码组件或构件,对一个密文数进行解密时,(系统部件,如核心密码组件或构件)先解密密文数中的有效数位数的密文(数),得到对应的有效数位数(明文),然后将解密得到的有效数位数(明文)乘以密文数中给出的浮动因子β,从而得到密文数对应的明文数(注意,有效数位数是按通常的同态加密方式加密、解密的)。
注意,这里要加密的明文数可以是单一明文数或明文向量,要解密的密文数可以是单一密文数或向量密文数;若需要解密的密文数是一个向量密文数,则密文数中的有效数位数的密文是有效数位数向量的密文即(有效数位数向量的)向量密文数,对其解密得到的有效数位数(明文)是有效数位数(明文)向量,将密文数中给出的浮动因子β与解密得到的有效数位数(明文)向量相乘,得到的明文数是要解密的向量密文数对应的明文向量。
不同的数的浮动因子可以不同,浮动因子可以具有β=cqj的形式,其中q为大于1的正整数(q本身又可以是q=2n形式的数),j为整数(正、负或0),c为正常数(通常c=1),此时相邻可取的两个浮动因子之间相差q倍(大的除以小的),浮动因子也可以不采用β=cqj的这种形式,即相邻可取的两个浮动因子之间不存在固定的倍数关系。浮动因子β与放大因子γ不同,放大因子γ必须大于1,而浮动因子可以大于1、也可以小于1,也可以等于1。β=cqj中的q与放大因子γ也没有直接关系,q反映的是浮动因子的粒度,放大因子γ用于将浮点数转定点数、以及提高近似同态加密算法的精度。若限定有效数位数为整数,则浮动因子的引入将实数的同态加密和运算转换为针对整数的同态加密及运算,即对于精确同态加密算法,放大因子γ可以固定取1(即不用放大因子,当然此非必须)。
进行加、减运算的两个密文数(无论是单一密文数,还是向量密文数),不但放大因子γ要一样,而且浮动因子β也要一样,否则要进行相应调整。
当需要对一个密文数的浮动因子进行调整时,所述普通密码组件或构件将要调整的密文数提交到所述核心密码组件或构件;核心密码组件或构件解密密文数(先解密其中的有效数位数的密文,得到有效数位数的明文,然后将明文乘以浮动因子)得到明文数,然后自动调整明文数的浮动因子及对应的有效数位数(如何自动调整,取决于具体实施,自动调整的原则通常是保留尽可能多的有效位数),或者依据调整请求中指定的浮动因子或要求(比如,有效数位数的有效位数要求、有效数位数的范围限定等),调整明文数的浮动因子及对应的有效数位数,然后采用同态加密算法对调整后的有效数位数加密,将加密结果与调整后的浮动因子一起形成调整后的密文数,然后将调整后的密文数返回给普通密码组件或构件。
对一个密文数的浮动因子进行调整的同时,允许调整其密码运算上下文(如采用的同态加密算法、模数、多项式环的多项式模比如XN+1、层级数量)以及密码运算上下文之外的其他加密参数(如放大因子、当前密文运算模数、公钥、密文数的当前层级)。
以上所述浮动因子的调整,既包括将浮动因子调大,又包括将浮动因子调小,甚至允许将大于1的浮动因子调整为小于1,允许将小于1的浮动因子调整为大于1;但浮动因子调整,需要保证这个密文数对应的明文数的值不变(对于近似计算,在允许的误差范围内保持不变),因此,浮动因子调大,对应的有效数位数要变小(相应的倍数),浮动因子调小,对应的有效数位数要变大(相应的倍数)。
普通密码组件或构件在不借助核心密码组件或构件的情况下,(自己)将浮动因子调小的一种方式如下:
若需要将一个密文数的浮动因子减小d倍(d通常是大于1的整数),则将待调整的密文数的浮动因子减小d倍得到新的浮动因子,然后将待调整的密文数的有效数位数的密文与d的(同态加密)密文数相乘(此时d的浮动因子是1,依算法决定是否需要乘以放大因子γ,即γ是否为1),得到新的有效数位数的密文,或者,若(采用的)同态加密算法支持密文数乘明文数,则将待调整的密文数的有效数位数的密文与明文数d相乘,得到新的有效数位数的密文;新的浮动因子和新的有效数位数的密文一起构成了调整了浮动因子的密文数。
对于近似同态加密算法,这种自己调整浮动因子的方式,尤其是与密文数的有效数位数的密文与明文数d直接相乘的方式,会额外引入一定的误差,具体实施中到底是借助核心密码组件或构件进行浮动因子调整,还是由普通密码组件或构件自己调整,根据实际情况定,比如,当无法调用核心密码组件或构件进行调整时,只能由普通密码组件或构件自己调整,或者,当额外引入的误差在可接受的范围同时期望有较高的计算效率时,可以自己调整。
普通密码组件或构件在不借助核心密码组件或构件的情况下将浮动因子调大的一种方式如下:
若需要将一个密文数的浮动因子增大d倍(d通常是大于1的整数)且1/d在有效数位数的表示范围内(即1/d是允许的有效数位数,注意,此时1/d的浮动因子为1),则普通密码组件或构件将待调整的密文数的浮动因子增大d倍得到新的浮动因子,将待处理的密文数的有效数位数的密文乘以1/d经同态加密后的密文数(加密之前要乘以放大因子),得到新的有效数位数的密文,新的浮动因子和新的有效数位数的密文一起构成了调整了浮动因子的密文数。
当两个数的密文数相乘时,普通密码组件或构件将两个数的有效数位数的密文按同态加密算法相乘得到乘积的有效数位数的密文,将浮动因子相乘得到乘积的浮动因子(浮动因子相乘为明文数相乘);
当浮动因子相同的两个密文数相加时(包括加、减),普通密码组件或构件将两个数的有效数位数的密文按同态加密算法的加运算相加得到和的有效数位数的密文,浮动因子不变;
当浮动因子不同的两个密文数相加时(包括加、减),普通密码组件或构件借助核心密码组件或构件或者自己将两个密文数的浮动因子调整为一致,然后将调整后的浮动因子相同的两个密文数相加。
注意,以上调整、运算的密文数可以是单一密文数或向量密文数;若密文数为向量密文数,则这里的有效数位数的密文为有效数位数向量的密文即(有效数位数向量的)向量密文数。
对于浮点数运算,当两个阶码不同的浮点数相加时(包括加、减),固定的是将阶码小的浮点数的阶码调整为阶码较大的浮点数的阶码(向大调整),这样阶码小的浮点数将丢失有效数位(有效数字),因为浮点数的尾数即包含有效数字位的数会右移,会导致尾部数位丢失;对于本发明的方案,浮动因子不同的两个密文数相加时,将两个密文数中的较小的浮动因子调整为较大的浮动因子不是必须的,同样地,对于本发明的方案,若将两个密文数中的较小的浮动因子调整为较大的浮动因子,则调整后,原本浮动因子较小的密文数对应的有效数位数(明文)将相应地变小,这样会导致有效数字位丢失,相反地,在保证被加密的明文数不变的情况下,将两个密文数中的较大的浮动因子调整为较小的浮动因子更可取,则调整后,原本浮动因子较大的密文数对应的有效数位数(明文)将相应地变大(二者乘积不变,即被加密的数本身不变),能够不损失有效数字位,保留更多的有效数字位,计算精度也更高。
本发明的技术方案在通常的放大因子的基础上又引入了浮动因子,其中放大因子主要用于保证计算精度,同时兼顾被加密的数的有效位数(有效数位数的有效位数),但无法保证密文运算、密文计算结果的有效位数(即有效数字的位数),而浮动因子主要用于保证加密后的数(即密文数)、密文运算和密文计算结果有足够的有效位数(有足够的有效数字),从而取得近似于浮点数运算、计算的技术效果。引入浮动因子虽然会在某种程度上暴露被加密的数的绝对值的范围,但考虑到保密(隐私)计算的目的,这种信息暴露并不存在实质性危害,比如,假设运算、计算处理的是一个图片,这种信息暴露不会导致图片内容本身的泄露,而且在很多情况下要计算处理的数的范围预先是知道的。
若普通密码组件或构件需要核心密码组件或构件对一个密文数X进行整理,同时又不期望向核心密码组件或构件暴露密文数X所对应的明文数x,则普通密码组件或构件利用同态加密算法和同态密文运算将密文数X转换为Y,其中Y为x-x0的密文数(减时浮动因子需一致),即Y对应的明文数为y=x-x0,x0为普通密码组件或构件(在允许的范围内)随机选择的数或从随机选择的数中导出的数(x0不是同态加密算法中的噪声或误差,x0本身可为正、负或0),然后将密文数Y提交到核心密码组件或构件请求进行整理(如调整其浮动因子,改变其加密参数、采用的同态加密算法等);核心密码组件或构件解密Y得到Y对应的明文数y,然后使用密文数Y对应的明文数y完成普通密码组件或构件要求的整理,然后采用同态加密算法将整理得到结果加密,将加密后的整理结果返回给普通密码组件或构件;普通密码组件或构件采用同态加密算法和同态密文运算,将x0的同态加密密文数X0与核心密码组件或构件返回的密文数相加(加运算时浮动因子需一致),从而得到期望的针对密文数X的整理结果。
注意,若密文数为向量密文数,则相应地,以上所述随机选择的数或从随机选择的数中导出的数x0是一个明文向量。
若普通密码组件或构件需要核心密码组件或构件使用(一个或多个)密文数X完成复杂计算,同时又不期望向核心密码组件或构件暴露密文数X所对应的明文数x,则普通密码组件或构件利用同态加密算法和同态密文运算将密文数X转换为Y,其中Y为x+x0或x·x0的密文数(·为乘运算),即Y对应的明文数y为x+x0或x·x0,x0为普通密码组件或构件(在允许的范围内)随机选择的数或从随机选择的数中导出的数(注意,x0不是同态加密算法中的噪声或误差,x0本身可为正、负或0),然后将(一个或多个)密文数Y提交到核心密码组件或构件,请求完成指定的计算;核心密码组件或构件解密Y得到Y对应的明文数y,然后使用密文数Y对应的明文数y完成普通密码组件或构件指定的计算,然后采用同态加密算法将计算得到结果加密,将加密后的计算结果返回给普通密码组件或构件;普通密码组件或构件利用核心密码组件或构件返回的密文数以及x0,采用同态加密算法和同态密文运算,计算得到期望的计算结果(原本期望利用X进行计算的结果,通常是利用-x0或1/x0或它们对应的密文数,或x0的导出数或x0的导出数的密文数,消除引入x0对计算结果所产生的影响,这样做成立的前提条件是原本要进行的计算支持这么做,常见的代数计算、函数计算支持这么做)。
注意,若密文数为向量密文数,则相应地,以上所述随机选择的数或从随机选择的数中导出的数x0是一个明文向量,且此种变换计算方式通常只用于针对向量密文数中的被加密的每个明文元素进行同样复杂计算的情形。
这种通过分解、变换密文数X,请求核心密码组件或构件进行复杂计算的方式不是必须的,普通密码组件或构件可以直接将密文数X提交给核心密码组件或构件,由核心密码组件或构件解密密文数X得到其明文数x,利用明文数x完成复杂计算,然后采用同加密算法对利用明文数x计算得到的结果加密,返回加密后的结果,只有在密文数X对应的明文数x为非常敏感的数据,根据安全要求,不允许核心密码组件或构件接触到密文数X对应的明文数x时才有必要采用这种分解、变换的计算方式进行复杂计算。
对于复杂计算,若(针对明文数的)计算规则或函数不是核心密码组件或构件支持的常规的计算规则或函数,则所述核心密码组件或构件完成相应计算的方式包括:
针对明文数计算的程序代码作为可信代码(比如经数字签名后的可信代码)被核心密码组件或构件加载、调用,由可信代码完成相应的期望的计算(可信代码使用的是明文数,返回的是明文数或密文数);
或者,普通密码组件或构件提交复杂计算对应的计算规则或函数的描述式(表达式),核心密码组件或构件通过解析计算规则或函数的描述式,完成相应的期望的计算;
核心密码组件或构件支持的常规的计算规则或函数是指不提供额外的计算规则或函数描述式(表达式),不提供额外的程序代码,核心密码组件或构件就能完成相应计算的计算规则或函数(即自身原本就支持的计算规则或函数)。
对于以上所述保密计算系统,对解密返回密文数对应的明文数的请求进行授权的一种方式是通过授权数据;所述授权数据包含有要解密的密文数或密文数的散列值(哈希值、杂凑值),并由解密数据的使用者或拥有者,以及/或者核心密码组件或构件的拥有者或管理者或控制者数字签名(由解密数据的使用者或拥有者,以及核心密码组件或构件的拥有者或管理者或控制者同时分别数字签名,或者仅由解密数据的使用者或拥有者数字签名,或者仅由核心密码组件或构件的拥有者或管理者或控制者数字签名,具体哪种方式,与具体实施针对的应用场景、安全要求有关),所述数字签名包括公钥数字签名或对称密钥数字签名(如HMAC签名);
请求返回密文数对应的明文数的实体(用户、程序、机构),在请求返回密文数对应的明文数时,提交对应的用于获取密文数对应的明文数的授权数据;核心密码组件或构件通过验证授权数据的数字签名,验证授权数据的有效性;
若所述核心密码组件或构件没有预先保存解密数据的使用者或拥有者的用于数据加密(即对返回的明文数加密)的加密密钥,则所述授权数据中包含有用于对返回的数据(明文数)进行加密的公钥或者用于生成、导出加密密钥的数据(即密钥协商数据)。
对于以上所述保密计算系统,核心密码组件或构件维护有授权者列表,其中的信息包括授权者的标识信息,针对授权者的数字签名的签名验证密钥(公钥或对称密钥),授权的方式(比如,单个实体授权,还是多个实体联合授权),以及将密文数解密得到明文数后,对返回给解密数据的使用者或拥有者的明文数进行加密的加密密钥(公钥或对称密钥);所述授权者指能签发授权数据的实体,其中包括解密数据的使用者或拥有者,以及核心密码组件或构件的拥有者或管理者或控制者。
签发授权数据的系统或系统部件对签发的授权数据做日志记录。
向解密数据的使用者或拥有者返回密文数对应的明文数后(用解密数据的使用者或拥有者的密钥加密后的明文数),核心密码组件或构件对解密返回的明文数做日志记录,日志记录有授权数据和返回(给解密数据的使用者或拥有者)的明文数的散列值(哈希值、杂凑值)。
对于以上所述保密计算系统,若解密数据的使用者或拥有者持有对密文数进行解密的(同态加密算法的)私钥,则解密数据的使用者或拥有者使用自己持有的私钥对密文数(比如密文运算、密文计算的结果)进行解密。
对于以上所述保密计算系统,(程序中)用于存放一个密文数的数据对象称为密文数数据对象(ciphertext data object);密文数数据对象除了存放有密文数外,还存放有密码运算上下文以及密码运算上下文之外的与当前密文数加密及密文运算有关的参数,或存放有获取密码运算上下文的信息(如指向密码运算上下文的数据指针、标识符等)以及密码运算上下文之外的与当前密文数加密及密文运算有关的参数;所述密码运算上下文之外的与当前密文数加密及密文运算有关的参数包括公钥、放大因子、当前密文层级(level)、当前密文运算模数;若密文数加密引入了浮动因子,则用于生成密文数的浮动因子的参数属于密码运算上下文中的参数,或属于密码运算上下文之外的与当前密文数加密及密文运算有关的参数(取决于具体实施,比如它们是否是必需的共同参数);所述当前密文数指密文数数据对象中存放的密文数;
密文数数据对象经序列化后的序列化数据中有密文数对应的(即数据对象中存放或指向的)密码运算上下文或密码运算上下文生成参数;在通过反序列化重构密文数数据对象时,(反序列化重构密文数数据对象的程序)通过序列化数据中的密码运算上下文或密码运算上下文生成参数恢复或重构密文数数据对象(即密文数对应的)的密码运算上下文或获取密码运算上下文的信息(如指向密码运算上下文的数据指针、标识符等);
在进行密码运算时(包括数据加密运算、数据解密运算以及同态密文运算),进行密码运算的程序或系统部件(比如,普通密码组件或构件,核心密码组件与构件)通过密文数数据对象直接或间接获得进行密码运算所需的密码运算上下文以及密码运算上下文之外的与当前密文数加密及密文运算有关的参数;
所述密码运算上下文生成参数指用于生成或构造(或初始化)密码运算上下文的参数(也称为密码运算上下文构造参数)。
在计算编程技术中,将一个数据对象中存放的数据转化字节串用于存储、传送和重构称为数据对象的序列化,由此得到的数据称为数据对象的序列化数据;从序列化数据恢复、重构原有的数据对象称为反序列化;本发明针对数据对象的序列化、反序列化与通常的序列化、反序列化技术概念一致。
基于本发明的这种密文数数据对象,可以像通常调用函数或方法针对明文数进行计算处理一样调用相应的函数或方法针对密文数进行处理,像通常向调用函数或方法传递明文参数一样,向调用函数或方法传递密文参数(即包含要计算处理的密文数据以及存放处理结果的密文数数据对象),这使得程序的编写更符合编程人员的通常习惯;而针对加密数据进行运算、计算和处理的程序(函数、方法),仅依据密文数数据对象本身就能获得进行密码运算所需的密码运算上下文(其中包括采用的同态加密算法、各种加密参数等)以及密码运算上下文之外的与当前密文数加密及密文运算有关的参数,然后针对密文数进行运算、计算处理;而保存有解密密文数的密钥(私钥)的系统组件或构件,如核心密码组件或构件,可以仅仅利用密文数数据对象中的这些信息就能确定用于解密密文数的密钥(私钥),然后针对数据对象中的密文数进行解密;读取或接收序列化后的密文数数据对象的程序,依据读取或接收的密文数数据对象的序列化数据,不但能恢复出数据对象中存放的密文数,而且能恢复或重构同样的用于密码运算的密码运算上下文以及密码运算上下文之外的与当前密文数加密及密文运算有关的参数,用于后续的密码运算和计算。
对于以上所述密文数数据对象,可以进一步做到:
所述密文数数据对象包括整数类型的密文数数据对象和浮点数类型的密文数数据对象,分别简称整数密文数数据对象和浮点密文数数据对象;
对于整数类型的密文数数据对象,核心密码组件或构件在解密密文数后,对于解密得到的非整数明文数,将其绝对值就近取整(按四舍五入取整)转换为整数,符号不变,从而得到整数明文数,然后返回整数类型的明文数,或利用整数明文数进行运算、计算或处理(如果解密得到的明文数本身就是整数明文数,当然不用再转换);若整数类型的密文数数据对象中存放的密文数是向量密文数,则在解密密文数后,将解密得到的明文向量中的每个非整数元素的绝对值就近取整(按四舍五入取整)转换为整数,符号不变,得到整数明文向量;
对于浮动数类型的密文数数据对象,核心密码组件或构件在解密密文数后,返回浮点数类型的明文数,或利用浮点明文数进行运算、计算或处理。
无论是整数类型的密文数数据对象还是浮点数类型的密文数数据对象,对明文数的加密处理与通常针对整数、浮点数的加密处理是一样的,没有不同(通常针对整数、浮点数的加密处理是一样的或类似,比如,都是先乘以放大因子,取整,然后对取整的结果加密),针对密文数的密文运算与通常针对密文数的密文运算处理也是一样的,没有不同,不同仅仅在于解密密文数后,对解密得到的明文数的处理可能不同(对于整数类型的,需要对解密得到的明文数取整)。
对于以上所述密文数数据对象,可以再进一步做到:
所述密文数数据对象还包括复数类型的密文数数据对象,简称复数密文数数据对象(本发明不假设同态加密算法本身支持直接对复数加密以及对复数密文数的同态密文运算,有些同态加密算法比如CKKS支持复数加密及运算);
若同态加密算法不支持复数加密及复数密文运算,则复数密文数数据对象同时保存有复数密文数的实部密文和虚部密文,而当普通密码组件或构件,或核心密码组件或构件,针对复数类型的密文数据对象进行密文运算或密文计算时,从复数密文数据对象中取出实部密文数和虚部密文数,按照复数运算或计算规则,利用实部或虚部密文数进行密文运算或密文计算,得到相应的密文运算或计算结果(若同态加密算法本身支持复数加密及密文运算,则不必如此)。
本发明的这里的做法是以数据对象为中心的做法,密码算法的实施仅仅是实现数据运算、计算处理的工具,程序员按通常编写针对明文数据的运算、计算程序的方式编写针对密文数据的运算、计算程序;而现有的保密计算技术通常是以密码算法为中心,是以实现密码算法对数据的处理为中心的,数据对象仅仅是密码程序针对的计算处理对象,程序员不能按通常编写针对明文数据的计算、处理程序的方式编写程序,程序员必须熟悉密码运算、计算的过程。
对于以上所述保密计算系统,为了降低普通程序员使用同态加密的密文数进行计算程序编写的难度,所述保密计算系统提供有辅助计算程序和/或辅助编译工具,其中:
辅助计算程序接收(一个或多个)密文数数据对象以及计算公式和/或计算过程的描述信息,解析计算公式和/或计算过程的描述信息,按照计算公式和/或计算过程的描述信息规定的计算公式和/或计算过程,使用密文数数据对象、调用普通密码组件或构件完成相应的计算(程序员无需关心普通密码组件或构件、核心密码组件或构件如何调用);
辅助编译工具根据程序员在源程序代码中的注释或根据源程序中的计算式中出现的数据对象的数据类型(比如,属于密文数数据类的数据对象或其子类的数据对象),将源程序代码中出现的使用运算符(如+、-、*、/等)针对密文数数据对象所进行运算的程序代码,转换为使用密文数数据对象调用普通密码组件或构件提供的、与运算符对应的运算操作函数或方法的程序代码(如与+、-、*、/运算符对应的进行加、减、乘、除运算操作的函数或方法),将源程序代码中出现的调用编程语言提供的常用计算函数(如自然指数函数、自然对数函数、三角函数、平方根函数等)针对密文数数据对象进行计算的程序代码,转换为使用密文数数据对象调用普通密码组件或构件提供的对应常规计算函数(如普通密码组件或构件提供的针对密文数的自然指数函数、自然对数函数、三角函数、平方根函数等)进行对应计算的程序代码,或者,对于不支持运算符重载但提供有反射(reflection)机制或功能的编程语言(如Java、Golang、C#的反射机制或工具),辅助编译工具根据程序员在源程序代码中的注释,将源程序代码中出现的使用运算符针对数据对象进行运算的程序代码,转换为调用普通密码组件或构件提供的、与运算符对应的运算操作函数或方法进行运算的程序代码,将源程序代码中出现的调用编程语言提供的常用计算函数针对数数据对象进行计算的程序代码,转换为调用普通密码组件或构件提供的对应常规计算函数针对数据对象进行对应计算的程序代码,普通密码组件或构件提供的、与运算符对应的运算操作函数或方法,普通密码组件或构件提供的常规计算函数,在执行过程中通过反射确定参与运算或计算的数据对象的类型(什么类型的数据,如整数、浮点、双精浮点或其他类型的数据对象)和种类(是否是密文数数据对象),然后依据数据对象的类型和种类进行相应的运算或计算处理。
对于支持运算符(如+、-、*、/等)重载的编程语言(如c++),所述保密计算系统提供有针对密文数数据对象的运算符重载,普通编程人员按编写针对明文数(如整数、浮点数)的计算程序的方式编写针对密文数数据对象的计算程序;所述普通编程人员指使用普通密码组件或模块进行程序编写的人员。
从以上方案描述可以看到,基于本发明的方案,在针对密文数的运算、计算过程中,可以由核心密码组件或构件对密文数进行整理,避免了密文数运算层级带来的限制,解决了不同同态加密算法、加密参数、密钥加密的密文数不能互操作的问题;由核心密码组件或构件完成复杂计算,其中包括复杂函数的计算,不但解决了进行各种复杂计算的问题,而且能够保证计算精度和计算效率;在放大因子的基础上,进一步引入浮动因子,保证被加密、参与运算的数具有足够的有效位数,使得计算结果更准确、具有足够的有效位数,而对于仅适用于整数的精确同态加密算法,可固定取放大因子γ为1,限定有效数位数为整数,通过浮点因子结合浮动因子调整,在这类算法的基础上能够容易地实现实数加密及密文运算(这类算法仅使用放大因子γ很难实现密文加、乘的混合运算,因为是精确算法);核心密码组件或构件只会返回采用同态加密算法加密的密文数,不会直接返回明文数,只有在得到足够授权的情况下,核心密码组件或构件才会返回从密文数解密得到的明文数,且这个返回的明文数采用解密数据的使用者或拥有者的密钥加密,确保只有授权的用户、机构、系统才能得到最终的明文数;在具体实施中,核心密码组件或构件是一个安全可信的组件或构件(如密码卡、密码服务器或密码机),它提供了安全可信的密码运算环境,对运算、计算过程中的敏感数据以及解密密钥(私钥)提供符合安全要求的保护;密文数的使用者、核心密码组件或构件的使用者,与核心密码组件或构件的拥有者、管理者、控制者可以属于不同的机构,敏感、保密数据的拥有者、使用者,与密文数的使用者,与核心密码组件或构件的使用者可以属于不同的机构,从而可以使得使用密文数进行数据处理、运算的机构即密文数的使用者(如公共计算服务平台)不拥有核心密码组件或构件、且在技术上不能控制核心密码组件或构件,只有得到了足够的授权后,核心密码组件或构件才将解密后的明文数,以解密数据的使用者或拥有者能够解密的密文数据的形式返回给解密数据的使用者或拥有者(然后由他们自己解密得到最终的明文数),从而可以避免使用密文数进行数据处理、计算的机构(如公共计算服务平台)既作为运动员(使用密文数进行运算、计算)、又作为裁判员(拥有解密密文数的能力)的情况出现,从而有效地防止密文数进行数据处理、运算的机构通过作弊解密密文数获得用户的敏感数据的风险;基于本发明的密文数数据对象,编程人员可以按通常调用函数或方法提交调用参数对数据进行计算、处理的方式,调用对密文数进行处理的函数或方法,无需直接调用涉及密码功能的函数或方法,无需向调用函数或方法提交涉及密码功能的参数(如密码运算上下文),基于本发明的辅助计算程序,程序员不必编写使用密文数进行计算的程序代码,基于本发明的辅助编译工具,程序员可以按通常针对明文数使用运算符、常用函数编写计算程序的方式编写计算程序,不必考虑编写密文数计算程序与编写明文数计算程序的不同,所有这些降低了普通程序员使用同态加密算法、技术进行计算程序编写的难度。
附图说明
图1为本发明系统的示意图。
图2为本发明系统在企业应用中的应用示意图。
图3为本发明系统在SaaS平台中的应用示意图。
图4为本发明系统在数据处理/模型计算平台中的应用及数据解密示意图。
图5为本发明的系统在数据处理/模型计算平台中的应用及另一种数据解密示意图。
具体实施方式
下面对本发明的具体实施方式进行说明。以下内容仅是对本发明可能实施方式的说明,不作为对本发明保护范围的限制。
本发明的具体实施涉及同态加密算法,本发明对实施所采用的同态加密算法并没有特别的限定。如果实施针对的具体应用仅涉及加(减)运算,则可以仅采用加法同态加密算法,如果实施针对的具体应用仅涉及乘运算,则可以仅采用乘法同态加密算法,当然这两种情况也可以采用全同态加密算法。如果实施针对的具体应用同时涉及加(减)和乘运算,则采用全同态加密算法,其中同态加密算法既可以是近似同态加密算法,也可以是非近似同态加密算法(即精确同态加密算法)。
在具体实施应用中,针对不同的数据处理对象,加密计算过程所采用的同态加密算法、多项式环中的多项式模(polynomial modulus)(如XN+1)、密码运算模数(比如CKKS中的qL、ql)、公钥、放大因子(比如CKKS中的Δ)等可能不一样,即密码运算上下文及其他相关加密参数可能不一样,当这些密码运算上下文及其他相关加密参数不同的密文数需要进行运算时,需要由核心密码组件或构件对参与运算的密文数进行整理,使得它们的密码运算上下文及其他相关加密参数保持一致。
引入浮动因子是本发明保证加密得到的密文数和密文运算结果具有足够的有效数字位的一种方法。下面举例说明浮动因子的实施。
考虑如下一个二进制整数(浮点数表示的整数):
1.001100011010101100001000000011110010100001·285(·表示乘),
假设对一个数进行同态加密前,要将其乘以一个很大的放大因子γ,比如γ=240,如果直接对这个数进行同态加密,将其与放大因子γ相乘的结果,将导致参与密码运算的数非常大,消耗的存储资源、计算资源多,计算效率低。如果引入浮动因子,假如取这个数的浮动因子是β=250,这个数的有效数位数为:
1.001100011010101100001000000011110010100001·235,
有效数位数乘以放大因子γ后仍然有足够的有效位数(有效数字的位数),对其加密的结果仍然有足够的有效位数和计算精度,但这时有效数位数以及乘以放大因子γ后得到的数,相对于原来直接将待加密的数乘以放大因子所得到的数要小很多,此时对有效数位数进行加密和密码运算,消耗的存储资源、计算资源要少很多,计算效率要高很多。
再考虑如下一个二进制小数(浮点数表示的小数):
1.001100011010101100001000000011110010100001·2-65,
按通常的做法,如果要使得这个数加密后保留足够的有效位数,则需要乘以一个很大的放大因子γ,如果直接用这个数进行同态加密,由于放大因子γ非常大(模数如CKKS中的qL、ql也会非常大),消耗的存储资源、计算资源多,计算效率低,而且考虑到其他进行数据加密、密文运算的数有可能是很大的整数,这很大的放大因子γ将使得进行数据加密、密文运算的整数变得非常大。如果引入浮动因子,假如这个数的浮动因子是β=2-50,这个数的有效数位数为:
1.001100011010101100001000000011110010100001·2-15,
这个有效数位数相对原来的数要大很多,可以乘以一个较小的放大因子γ,比如γ=240,对有效数位数进行加密,消耗的存储资源、计算资源要少很多,计算效率要高很多。采用此放大因子γ,有效数位数乘γ取整后会丢掉部分有效数字,若要取整后保留更多的有效数字,可取更小的浮动因子比如β=2-60,或取更大放大因子比如γ=260,当然,可以取这个小数的浮动因子是β=2-100,这个数的有效数位数为(整数):
1.001100011010101100001000000011110010100001·235,
对这个有效数位数采用同态加密算法进行加密,也可以在保证有足够的有效位数、计算精度和计算效率的情况下,采用一个较小的放大因子γ,比如γ=240(相比浮动因子β=2-50,同样的放大因子γ=240,数据加密时,有效数位数乘以放大因子γ取整后具有更多的有效数字,即更多的有效位数)。
对于精确同态加密算法,若有效数位数都是整数,依据相应的算法,甚至可以固定取放大因子γ为1(浮动因子、有效数位数是乘以放大因子前的处理)。
对于以上两个一个很大、一个很小的数,假如需要计算它们的乘积,如果放大因子γ取240,这将导致最后的计算结果为0(因为其中很小的数乘以γ后取整的结果为0),这显然不正确;如果为了保证有足够的有效位数,取很大很大的放大因子γ,比如取280,参与运算的各数、模数(比如多项式系数,CKKS的qL、ql)都会很大,这将导致消耗的资源多、计算效率低。如果引入浮动因子β,很大的数的浮动因子是β=250,很小的数的浮动因子是β=2-100,放大因子γ取240(或者再稍微取大点,比如250),就能在保证具有足够的有效位数、计算精度、计算效率的情况下,取得到期望的计算结果。
浮动因子β用2的幂表示不是必须的,只是因为计算机中的数是二进制数,用2的幂能更好地与二进制数的有效数字、有效位数、小数点对应。实数在计算机中是以二进制浮点数表示的,在计算机中用浮点数表示的数为f=m×2e,其中m为尾数,e为阶码(m、e可为正、负、零),尾数对应二进制有效数字(非0数的尾数的最高位为1,尾数可为正、负、零),阶码对应2的幂的次数(指数),浮点数为尾数m与2的阶码e次幂的乘积。在计算机中一个浮点数仅需存储m、e。可以看到,本发明的浮动因子对应浮点数的2e(2的e次幂),本发明的有效数位数对应浮点数的尾数(当然,二者不完全等同),因此,为了便于尾数与有效数位数、2e(或阶码e)与浮动因子之间的转换,浮动因子通常优选取2的幂(2的正或负整数次幂或0次幂),这样可以通过浮点数的阶码e(包括其数值和符号)直接得到浮动因子,下面给出的选取浮动因子、将浮点数转化有效数位数和浮动因子乘积的一般实施原则,充分体现了这点。
浮动因子采用β=cqj=2n×j的形式,其中q=2n,n为选定的正整数(常数),j是整数(非常数),c=2u,u为常整数(可正、负或0),此时密文数数据对象只需保存指数k=u+n×j,浮动因子的乘变为简单的指数k相加(类似于浮点数相乘,阶码相加)。假设计算机中浮点数f=m×2e中尾数m的小数点后的有效位数为L(L为正整数),即尾数m中除去小数点前的规格化位外,小数点后的有效数字有L位,即e=L时f恰好为整数(即e=L-1时f有1位小数位,e=L时f为整数)。在已选取了放大因子γ的情况下,若浮点数f=m×2e的阶码e在L+[a,b]内时(即[L+a,L+b]内时,阶码为带符号的整数),其中a、b为整数且b-a≥n,采用同态加密算法和放大因子γ对浮点数加密、密文运算能够得到期望的有效位数、计算精度、计算效率,则:对于任一个浮点数f=m×2e,将其阶码e表示为e=u+L+t+n×j,其中t是(a,b)内的整数(除非特殊情况,常数u尽量取0),则f对应的浮动因子β=2u+n×j=cqj,其中q=2n,c=2u,有效数位数为v=m×2L+t,即有效数位数对应的浮点数,其阶码是L+[a,b]内的整数,而任一个明文浮点数表示为这样的一个有效数位数与一个浮动因子β=cqj=2u+n×j的乘积。若a≥0,则对于精确同态加密算法,放大因子γ允许固定取为1(当然,这不是必须的)。
以上实施原则的关键是要先确定一个针对浮点数f=m×2e的阶码e的区间L+[a,b],只要所采用的同态加密方案(其中包括选择的算法、放大因子、模数等)针对阶码e在L+[a,b]内的浮点数f=m×2e的加密、密文数运算能满足对有效位数、计算精度、计算效率的要求,那么,通过实施本发明的浮动因子,针对任何浮点数f=m×2e的加密、密文数运算都能满足对有效位数、计算精度的要求。但是,对于任选的n,计算效率则未必能满足要求。通常,相邻浮动因子β之间的间隔越小,即相邻两个浮动因子中大的与小的之比越小,比如β=cqj,q=2n时,q越小,即相邻的两个浮动因子的指数之间的间隔n越小,即浮动因子的粒度越小,则针对密文数的运算越接近浮点数运算(n=1则相当于是浮点数运算),保留有效数字的效果越好,但计算过程中的浮动因子调整次数会增多(频度增大),浮动因子调整会变得频繁,计算效率会降低,反之,相邻浮动因子之间的间隔越大,计算过程中的浮动因子调整次数会减少(频度降低),计算效率会提高,但保留的有效数字的效果可能会变差。具体实施中如何选取浮动因子及间隔,还要综合考虑对有效位数、计算精度及计算效率的要求。
这里要特别指出的是,对于β=cqj,q通常远小于γ,q反映的是浮动因子的粒度,q反映的不是明文数、密文数的有效数字的位数(有效位数),即q=2n中的n反映的不是明文数、密文数的二进制数有效数字的位数,而是用于决定浮动因子的粒度,β=cqj=c×2n×j中的|u+n×j|反映的也不是明文数、密文数的二进制数有效数字的位数,有效数位数经加密后保留的有效位数才是密文数的有效位数,密文数经密文运算后仍然保留的有效位数,才是密文运算结果的有效位数,而有效数位数经加密后保留的有效位数,与对有效数位数加密时放大因子γ与有效数位数相乘后(取整后)保留的有效位数有关,与同态加密算法的精度有关;如果同态加密算法的精度足够高,那么,密文数及密文运算结果的有效位数主要取决于对有效数位数加密时放大因子γ与有效数位数相乘取整后保留的有效位数,因此,在选取的放大因子γ能够保证足够的计算精度的情况下,可以以有效数位数加密时放大因子γ与有效数位数相乘取整后保留的有效位数作为(或近似作为)密文数和密文运算结果的有效位数。注意到计算精度也与放大因子γ有关,针对实数(浮点数),通常放大因子γ越大,数据加密、密文运算的计算精度越高,就是说有效数位、计算精度都与放大因子γ有关。
前面所述选取浮动因子、将浮点数转化为有效数位数与浮动因子的乘积的关键是先确定一个针对浮点数f=m×2e的阶码e的区间L+[a,b],但是,并没有给出[a,b]如何选取,实际上为了便于计算得到t,保证t选取的唯一性,[a,b]的选取与n是有关的,比如限定|a|+|b|≤2n,但是,n又决定了浮动因子的粒度q=2n,而浮动因子的粒度的选取即n的选取又与放大因子γ相关(γ影响有效数位数加密、密文运算的有效位数、计算精度、计算效率),与计算效率即浮动因子的调整频度要求相关,具体选取n时如何考虑这些因素?以下一些可能的选取放大因子γ、浮动因子的粒度q=2n的方式,综合考虑了这些因素。
若对于参与运算、计算的明文数都有e≥L(即尽管用浮点数表示,但都是整数),则按如下方式确定浮动因子的粒度q=2n、常数c:
取n=1;
取一个放大因子γ,且使得选择的放大因子对于任意f=m×2L+t的数具有满足要求的数据加密、密文运算的有效位数、计算精度和计算效率,其中t为[0,n]内整数(若是精确同态加密算法,放大因子γ可以固定取1,但非必须);
对于测试用样本数据中的任意一个浮点数f=m×2e,取其有效数位数为v=m×2L +t,其中t=(e-L)mod n,e=L+t+n×j,j为一个整数,浮动因子β=2n×j=qj,q=2n(此时c=1);
针对一定数量的测试用样本数据,模拟实际计算过程(比如模拟模型训练),测试n取当前值时的浮动因子的调整频度,其中浮动因子的调整频度是指密文运算过程中浮动因子的调整次数与总的密文运算次数之比,密文运算包括密文数加(减)运算、密文数乘运算(实际上仅有加运算才可能出现浮动因子调整);
若n取当前值时,浮动因子的调整频度满足要求(比如不超过20%),则选定此n,浮动因子的粒度为q=2n,c=1;否则,将n加1,重复以上,直到浮动因子的调整频度满足要求;
若n取某个值事出现了密码运算溢出(超出了数据加密、密文数运算允许的范围),则调整加密参数(比如模数等),或者浮动因子的调整频度虽然满足要求,但此时的密码运算精度无法满足要求,则调整加密参数,如增大放大因子γ(比如将原来的放大因子γ乘2作为新的放大因子),然后从n=1开始,重新针对测试用样本数据进行计算统计,直到浮动因子的调整频度满足要求,且不出现密码运算溢出,且密码运算精度满足要求。
或者,若对于参与运算、计算的明文数中有e<L的数的情形(即存在有带小数的情况),则按如下方式确定浮动因子的粒度q=2n、常数c:
取n=1;
取一个放大因子且使得选择的放大因子对于任意f=m×2L+t的数具有满足要求的数据加密、密文运算的有效位数、计算精度和计算效率,其中t为[0,2n]内的整数(若是精确同态加密算法,放大因子γ可以固定取1,但非必须);
对于测试用样本数据中的任意一个浮点数f=m×2e,取其有效数位数为v=m×2L +n+t,其中t为(-n,n)内的整数,t的绝对值为|(e-L-n)|mod n,t的符号与e-L-n的符号相同,e=L+n+t+n×j,j为一个整数,浮动因子为β=2n×j=qj,q=2n(此时c=1);
针对一定数量的测试用样本数据,模拟实际计算过程(比如模型训练),测试n取当前值时的浮动因子的调整频度;
若n取当前值时,浮动因子的调整频度满足要求(比如不超过20%),则选定此n,浮动因子的粒度为q=2n,c=1;否则,将n加1,重复以上,直到浮动因子的调整频度满足要求;
若n取某个值事出现了密码运算溢出(超出了数据加密、密文数运算允许的范围),则调整加密参数(比如模数),或者浮动因子的调整频度虽然满足要求,但此时的密码运算精度无法满足要求,则调整加密参数,如增大放大因子γ(比如将原来的放大因子γ乘2作为新的放大因子),然后从n=1开始,重新针对样本数据进行计算统计,直到浮动因子的调整频度满足要求,且不出现密码运算溢出,且密码运算精度满足要求。
或者,若对于参与运算、计算的明文数中有e<L的数的情形(即存在有带小数的情况),则按如下方式确定浮动因子的粒度q=2n、常数c:
取n=1;
取一个放大因子γ≥2n,且使得选择的放大因子对于任意f=m×2L+t的数具有满足要求的数据加密、密文运算的有效位数、计算精度和计算效率,其中t为区间[-n,n]内的整数;
对于测试用样本数据中的任意一个浮点数f=m×2e,取其有效数位数为v=m×2L +t,其中t为(-n,n)内的整数,t的绝对值为|(e-L)|mod n,t的符号与e-L的符号相同,e=L+t+n×j,j为一个整数,浮动因子为β=2n×j=qj,q=2n(此时c=1);
针对一定数量的测试用样本数据,模拟实际计算过程(比如模型训练),测试n取当前值时的浮动因子的调整频度;
若n取当前值时,浮动因子的调整频度满足要求(比如不超过20%),则选定此n,浮动因子的粒度为q=2n,c=1;否则,将n加1,重复以上,直到浮动因子的调整频度满足要求;
若n取某个值事出现了密码运算溢出(超出了数据加密、密文数运算允许的范围),则调整加密参数(比如模数),或者浮动因子的调整频度虽然满足要求,但此时的密码运算精度无法满足要求,则调整加密参数,如增大放大因子γ(比如将原来的放大因子γ乘2作为新的放大因子),然后从n=1开始,重新针对样本数据进行计算统计,直到浮动因子的调整频度满足要求,且不出现密码运算溢出,且密码运算精度满足要求。
这里的一定数量的测试用样本数据来自于:(1)从实际数据中随机选择的样本数据;(2)实际数据的取值满足某种随机分布模型,利用实际数据取值满足的随机分布模型,产生随机生成的样本数据;(3)已知实际数据(估计的)最大值、最小值,假设实际数据在最大值、最小值之间均匀分布,按均匀分布从最大值、最小值中随机选择数据。
如下选择放大因子、浮动因子粒度的方法无需利用样本数据进行测试。
若参与运算、计算的明文数中绝大部分的数据(如超过80%)的浮点数的阶码在[L,L+n]内,则:
取一个放大因子γ,且使得选择的放大因子对于任意f=m×2L+t(即阶码e固定为L)的数具有满足要求的数据加密、密文运算精度,其中t为[0,n]内的整数(若是精确同态加密算法,放大因子γ可以固定取1,但非必须);
取浮动因子的粒度为q=2n;
对于任意一个浮点数f=m×2e,取其有效数位数为v=m×2L+t,其中t=(e-L)modn,e=L+t+n×j,j为一个整数,浮动因子β=2n×j=qj,q=2n(此时c=1)。
或者,若对于参与运算、计算的明文数中绝大部分的实际数据(如超过80%)的浮点数的阶码在[L,L+2n]内,则:
取一个放大因子γ,且使得选择的放大因子对于任意f=m×2L+t的数具有满足要求的数据加密、密文运算的有效位数、计算精度和计算效率,其中t为[0,2n]内的整数;
取浮动因子的粒度的q=2n:
对于任意一个浮点数f=m×2e,取其有效数位数为v=m×2L+n+t,其中t为区间(-n,n)内的整数,t的绝对值为|(e-L-n)|mod n,t的符号与e-L-n的符号相同,e=L+n+t+n×j,j为整数,浮动因子β=2n×j=qj,q=2n(此时c=1)(大部分数的浮动因子为1)。
若对于参与运算、计算的明文数中绝大部分的实际数据(如超过80%)的浮点数的阶码在[L-n,L+n]内(即在L+[-n,n]内),则:
取一个放大因子γ≥2n,且使得选择的放大因子对于任意f=m×2L+t的数具有满足要求的数据加密、密文运算的有效位数、计算精度和计算效率,其中t为[-n,n]内的整数;
取浮动因子的粒度的q=2n:
对于任意一个浮点数f=m×2e,取其有效数位数为v=m×2L+t,其中t为区间(-n,n)内的整数,t的绝对值为|(e-L)|mod n,t的符号与e-L的符号相同,e=L+t+n×j,j为整数,浮动因子β=2n×j=qj,q=2n(此时c=1)(大部分数的浮动因子为1)。
或者,若实际样本数据对应的浮点数f=m×2e的阶码e取值大部分(如超过80%)在[a,b]范围内,其中a、b为整数,则可以按如下方式选取放大因子和浮动因子(的粒度)(这里的[a,b]与前面一般原则中的[a,b]不同):
取放大因子γ≥2n,其中n=[(b-a)/2],其中[]为向上取整(比如1.5取2,-1.5取-1),且使得选择的放大因子对于任意f=m×2L+t的数具有满足要求数据加密、密文运算的有效位数、计算精度和计算效率,其中t为[-n,n]内的整数;
对于任意一个浮点数f=m×2e,取其有效数位数为v=m×2L+t,其中t为区间(-n,n)内的整数,t的绝对值为|e-[(a+b)/2]|mod n,t的符号与e-[(a+b)/2]相同,e=[(a+b)/2]+t+n×j,j为整数,浮动因子为β=2-L+[(a+b)/2]+n×j=cqj,浮动因子的粒度q=2n,常数c=2-L+[(a+b)/2](大部分数的浮动因子相同,即大部分情况下j=0)。
或者,若实际样本数据对应的浮点数f=m×2e的阶码e取值大部分(如超过80%)在[a,b]范围内,其中a、b为整数,则可以按如下方式选取放大因子和浮动因子(的粒度):
取放大因子γ,使得选择的放大因子对于任意f=m×2L+t的数具有满足要求数据加密、密文运算的有效位数、计算精度和计算效率,其中t为[0,2n]内的整数,n=[(b-a)/2],[]为向上取整(比如0.5取1,1.5取2,-1.5取-1)(若是精确同态加密算法,放大因子γ可以固定取1,但非必须);
对于任意一个浮点数f=m×2e,取其有效数位数为v=m×2L+n+t,其中t为区间(-n,n)内的整数,t的绝对值为|e-n-[(a+b)/2]|mod n,t的符号与e-n-[(a+b)/2]相同,e=[(a+b)/2]+n+t+n×j,j为整数,浮动因子为β=2-L+[(a+b)/2]+n×j=cqj,浮动因子的粒度q=2n,常数c=2-L+[(a+b)/2](大部分数的浮动因子相同,即大部分情况下j=0);
或者,取放大因子γ,且使得选择的放大因子对于任意f=m×2L+t的数具有满足要求数据加密、密文运算的有效位数、计算精度和计算效率,其中t为[-n,n]内的整数,n=b-a;
对于任意一个浮点数f=m×2e,取其有效数位数为v=m×2L+t,其中t为区间(-n,n)内的整数,t的绝对值为|e-a|mod n,t的符号与e-a的符号相同,e=a+t+n×j,j为整数,浮动因子为β=2-L+a+n×j=cqj,浮动因子的粒度q=2n,常数c=2-L+a(大部分数的浮动因子相同,即大部分情况下j=0);
以上方案取[0,n],有效数位数t所在区间为[0,n)整数,t=(e-a)mod n也可;
或者,选择满足如下条件的整数j0:[L+n×j0,L+n×(j0+2)]覆盖(包含了)[a,b],其中n=b-a(即[L+n×j0,L+n×(j0+2)]包含了大部分数的阶码);
取放大因子γ≥2n,且使得选择的放大因子对于任意f=m×2L+t的数具有满足要求的数据加密、密文运算的有效位数、计算精度和计算效率,其中t为区间[-n,n]内的整数;
对于任意一个浮点数f=m×2e,取其有效数位数为v=m×2L+t,其中t为区间(-n,n)内的整数,t的绝对值为|e-L|mod n,t的符号与e-L的符号相同,e=L+t+n×j,j为整数,浮动因子为β=2n×j=qj,浮动因子的粒度q=2n,常数c=1(大部分数的浮动因子相同,即大部分情况下j=j0+1);
或者,选择满足如下条件的整数j0:[L+n×j0,L+n×(j0+2)]覆盖(包含了)[a,b],其中n=b-a(即[L+n×j0,L+n×(j0+2)]包含了大部分数的阶码);
取放大因子γ,且使得选择的放大因子对于任意f=m×2L+t的数具有满足要求的数据加密、密文运算的有效位数、计算精度和计算效率,其中t为[0,2n]内的整数(若是精确同态加密算法,放大因子γ可以固定取1,但非必须);
对于任意一个浮点数f=m×2e,取其有效数位数为v=m×2L+n+t,其中t为区间(-n,n)内的整数,t的绝对值为|e-L-n|mod n,t的符号与e-L-n的符号相同,e=L+n+t+n×j,j为整数,浮动因子为β=2n×j=qj,浮动因子的粒度q=2n,c=1(大部分数的浮动因子相同,即大部分情况下j=j0)。
选择整数j0使之满足:[L+n×j0,L+n×(j0+2)]覆盖(包含了)[a,b],其中n=a-b,的一种简单的方法为:j0=(a-L)/n向下取整(如1.5取1,-1.5取-2)。
若实际计算中的样本数据来自两类(或多类)数据,且这两类(或多类)数据主要进行乘运算,则这两类(或多类)数据可以独立选取浮动因子、浮动因子的粒度(甚至独立选取放大因子,取决于具体算法是否允许)。
以上仅描述了针对单一实数明文数(浮点数)的浮动因子的选取,对于复数明文数,可以按上述方式先分别取实部、虚部的浮动因子,若浮动因子不一致,则按约定选取其中一个作为复数的浮动因子,比如取的大或小的浮动因子,在此浮动因子下的实部和虚部的有效数位数构成了复数有效数位数(如果将实部和虚部作为两类数据,则实部和虚部的浮动因子粒度q也即n、常数c不必相同,若要求相同,而按以上所述方式选取的q、c不同,则可按约定取得相同,比如,c固定取1,q也即n取大的);对于一个明文向量,可先按上述方式选取每个明文元素的浮动因子(向量的元素通常为同类数),如果明文向量的所有明文元素的浮动因子相同,则以此浮动因子作为明文向量的浮动因子,如果明文向量的各明文元素的浮动因子存在不同,则按照约定选取一个浮动因子作为明文向量的浮动因子,比如,以最小的浮动因子、最大的浮动因子,或者中间大小的浮动因子作为向量的浮动因子等,然后以选取的浮动因子作为明文向量的浮动因子,各明文元素在此浮动因子下的有效数位数构成了有效数位数向量(对于测试选取,然后进行测试);还有,明文向量的各元素可以是复数。
这里要指出的是,一个明文数的有效数位数不一定就是整数,以上所述有效数位数的选取是针对一个明文数加密时的有效数位数的选取,密文运算、密文计算后,解密有效数位数的密文得到的有效数位数,是什么就是什么,不一定落在针对明文数加密的有效数位数选取的范围内,即不一定与针对明文数加密时有效数位数的选取相符合,比如,按给定的浮动因子重新调整浮动因子时,解密有效数位数的密文得到有效数位数,并对此解密得到有效数位数进行浮动因子调整处理后得到数,不一定落在针对明文数加密时有效数位数选取的范围内,即不一定与针对明文数加密时有效数位数的选取相符合,但这时仍然把这个解密、处理后得到的、并将重新加密的数作为或当作有效数位数。
在具体实施中,若计算机中浮点数f=m×2e的尾数m的小数点后有Lm位有效数字,而实际只需要L位,则可以取其中的L位,多余的有效数字舍弃。
在具体实施中,若针对具体的要计算、处理的数据对象,取浮动因子β固定为1也能满足计算要求,则可以取浮动因子β固定为1(理论上,只要放大因子γ足够大,密文运算层次足够多,则不采用浮动因子即浮动因子β固定为1也能满足精度、有效位数的要求,但计算效率可能会变低,占用资源会变多)。
以上所述放大因子、浮动因子、有效数位数的选择方法不是全部可能的实施方式,在实际应用中,针对一组具体数据,可以综合应用以上所述放大因子、浮动因子、有效数位数的选择方法,选取综合计算效果较好的一种选择,也可以采用其他方式。上述参数n、a、b等是用于生成密文数的浮动因子的参数。
在实际计算过程中,对于密文加运算中的基准密文数,即其他加数的浮动因子要与其对齐的密文数,比如利用前次计算结果进行递归计算中的中间计算结果(比如递归计算yi+1=a×yi+b×ui中的yi,其中a、b为常数),可以随时由核心密码组件或构件解密得到其明文数,然后重新确定其符合规定、约定的有效数位数。
在本发明的实施中,当浮动因子不同的两个密文数相加时(包括加、减),既可以将较大的浮动因子调整为较小的浮动因子(对应的有效数位数相应增大),也可以将较小的浮动因子调整为较大的浮动因子(对应的有效数位数相应减小),而且在参与运算的数不会出现溢出的情况下,优先选择前者,因为这样能够不损失有效数字位,保留更多的有效数字位,计算精度也更高。
浮动因子调整的原则是能不调整则能不调整,能由普通密码组件或构件调整则由普通密码组件或构件调整。
下面举例说明本发明所述的复杂计算的实施。
假设现在针对单一密文数X要计算eX、sin(X)、cos(X)、ln(X)、sqrt(X)(求平方根),如果直接利用密文数X计算,计算复杂、效率低、精度差,这时普通密码组件或构件可以将密文数X提交给核心密码组件或构件,核心密码组件或构件解密密文数X得到其对应的明文数x,计算ex、sin(x)、cos(x)、ln(x)、sqrt(x)的值,然后采用同态加密算法对计算得到的值加密,从而得到eX、sin(X)、cos(X)、ln(X)、sqrt(X)的值(为密文数)。
再假设针对单一明文数x有如下函数f(x):
f(x)=4x2,x≥2
f(x)=8x,x<2
其中,现在已知x的密文数X,要计算f(X)。显然,不知道X的明文值很难完成这个计算(除非采用的同态加密算法同时又是保序加密算法)。对此,普通密码组件或构件将密文数X提交给核心密码组件或构件,核心密码组件或构件解密密文数X得到其明文数x,然后利用x根据以上函数规则,计算得到f(x)的值,然后采用同态加密算法对计算得到的值加密,然后将加密的值(即f(X))返回给普通密码组件或构件。
再假设针对单一明文数x、y有下函数f(x,y):
f(x,y)=x-1/y2,x≥1/y2
f(x,y)=x(1/y2-x),x<1/y2
现在已知x、y的密文数X、Y,要计算f(X,Y)。显然,不知道X、Y的明文值很难完成这个计算。对此,普通密码组件或构件将密文数X、Y提交给核心密码组件或构件,核心密码组件或构件解密X、Y得到其明文数x、y,然后利用x、y根据以上函数规则,计算得到f(x,y)的值,然后采用同态加密算法对计算得到的值加密,然后将加密的值(即f(X,Y))返回给普通密码组件或构件。
再假设已知单一整数x的密文数X,要计算X对应的明文数x的模n余数的密文数(加密的值),其中n是一个任选的大于1的整数,不一定是素数。基于本发明,可通过如下方式完成计算。
普通密码组件或构件将密文数X提交给核心密码组件或构件,核心密码组件或构件解密X得到其对应明文数x;如果采用的是近似同态加密算法,则对解密的得到的明文数的绝对值四舍五入取整、符号保持不变(就近取整),得到密文数X对应的整数明文x;然后核心密码组件或构件计算x的模n余数,然后采用同态加密算法对计算得到的x的模n余数加密,然后将加密的值返回给普通密码组件或构件。
当然,如果采用的是近似同态加密算法,那么最后得到的密文数也是x的模n余数的密文的近似值,但是,只要有足够的计算精度,之后解密密文数,对解密得到的明文数的绝对值四舍五入取整、符号保持不变(就近取整),则能够还原出x的模n余数准确值。
再假设已知单一整数x的密文数X,要计算x的模n乘法逆的加密值,其中n是一个任选的大于1的素数。基于本发明,可通过如下方式完成计算。
普通密码组件或构件将密文数X提交给核心密码组件或构件,核心密码组件或构件解密密文数X得到其明文数x;如果采用的是近似同态加密算法,则对解密的得到的明文数的绝对值四舍五入取整、符号保持不变,得到密文数X对应的整数明文x;然后核心密码组件或构件计算x的模n乘法逆,然后采用同态加密算法对计算得到的x的模n乘法逆加密,然后将加密的值返回给普通密码组件或构件。
同样地,如果采用的是近似同态加密算法,那么最后得到的密文数也是x的模n乘法逆的密文大近似值,但是,只要有足够的计算精度,之后解密密文数、对解密得到的明文数的绝对值四舍五入取整、符号保持不变,则能够还原出x的模n乘法逆的准确值。
若以上所述复杂计算中的X是向量密文数且要求针对向量密文数中的被加密的每个明文元素(分量)进行同样的复杂计算,则对于以上所述针对单一明文数的密文X的复杂计算同样适用,相应地,核心密码组件或构件解密向量密文数X得到其明文向量x,然后针对明文向量x的每个元素进行同样的复杂计算,然后将结果加密,得到计算结果的向量密文数。
再假设已知方程x2+bx+c=0中系数a、b、c的同态加密后的密文数A、B、C,求方程的两个根的同态加密密文数,其中每个根的实部、虚部分别用密文数表示(即用一对实数密文数表示一个可能为复数的根)。显然,通过直接计算得到结果非常困难或者无法完成,而基于本发明,可通过如下方式完成计算。
普通密码组件或构件将密文数A、B、C提交给核心密码组件或构件,核心密码组件或构件解密密文数A、B、C得到其明文数a、b、c,然后核心密码组件或构件利用a、b、c求得方程ax2+bx+c=0的两个根,然后采用同态加密算法对两个根的实部、虚部分别加密,然后将加密的值返回给普通密码组件或构件。
下面举例说明本发明的针对密文数整理时的针对密文数的分解、变换处理。
假设普通密码组件或构件在进行两个浮动因子不一样的密文数相加时,为了将两个密文数的浮动因子调整为一致,需要核心密码组件或构件对其中一个密文数X的浮动因子进行调整,但同时又不期望向核心密码组件或构件暴露密文数X所对应的明文数x,比如x是高度敏感的,则普通密码组件或构件利用同态加密算法和同态密文运算将密文数X转换为Y,其中Y=X+X10,X10为-x0的密文数,x0为普通密码组件或构件(在允许的范围内)随机选择的数,X10具有与X一样的浮动因子(因此X10对应的有效数位数不一定符合前面所述的针对一个明文数加密时的有效数位数的选取),即Y与X有一样的浮动因子,然后将密文数Y提交到核心密码组件或构件,请求将密文数Y的浮动因子调整为指定的浮动因子;核心密码组件或构件解密Y得到Y对应的明文数y,然后将明文数y分解为指定的浮动因子与一个作为有效数位数的数(此数不一定符合前面所说的对一个明文数加密时的有效数位数的选择)的乘积,然后采用同态加密算法对作为有效数位数的数进行加密,得到调整了浮动因子的密文数Y1,然后将调整了浮动因子的密文数Y1返回给普通密码组件或构件;普通密码组件或构件采用同态加密算法和同态密文运算,将x0的同态加密密文数X20与核心密码组件或构件返回的密文数Y1相加,其中X20具有Y1一样的浮动因子,即有期望的浮动因子,从而得到对密文数X的浮动因子调整后的密文数。
以上所述密文数X可以是单一密文数(单一明文数的密文),也可以是向量密文数,若X是向量密文数,则x0为随机选择的明文向量,Y、Y1、X10、X20都为向量密文数。
再假设,普通密码组件或构件在对两个密文层级不一样的密文数进行运算时,需要逆向调整一个密文数的密文层级(level),因此,需要核心密码组件或构件对其中一个密文数X的密文层级进行逆向调整,但同时又不期望向核心密码组件或构件暴露密文数X所对应的明文数x,比如x是高度敏感的,则普通密码组件或构件利用同态加密算法和同态密文运算将密文数X转换为Y,其中Y=X+X10,X10为-x0的密文数,x0为普通密码组件或构件(在允许的范围内)随机选择的数,X10具有与X一样的密文层级和浮动因子(因此X10对应的有效数位数不一定符合前面所述的针对一个明文数加密时的有效数位数的选取),即Y与X有一样的密文层级和浮动因子,然后将密文数Y提交到核心密码组件或构件,请求将密文数Y的浮动因子调整为指定的密文层级;核心密码组件或构件解密Y得到Y对应的明文数y,然后采用同态加密算法y重新进行加密,得到具有指定运算层面的密文数Y1,然后将具有指定密文层级的密文数Y1返回给普通密码组件或构件;普通密码组件或构件采用同态加密算法和同态密文运算,将x0的同态加密密文数X20与核心密码组件或构件返回的密文数Y1相加,其中X20具有Y1一样的密文层级和浮动因子,即有期望的密文层级,从而得到对密文数X的密文层级调整后的密文数。
同样地,以上所述密文数X可以是单一密文数(单一明文数的密文),也可以是向量密文数,若X是向量密文数,则x0为随机选择的明文向量,Y、Y1、X10、X20都为向量密文数。
下面举例说明通过分解变换进行f(X)计算的实施,其中X是单一明文数的密文数,其对应的明文数是x。
假设现在要计算eX,则普通密码组件或构件利用同态加密算法计算得到密文数Y=X+X0,其中,X0为采用同态加密算法对-x0加密得到的密文数(X0有与X一样的浮动因子),x0为普通密码组件或构件随机选择的数;普通密码组件或构件计算得到e^x0的值,其中^为幂运算(^前面是底数,后面是指数);普通密码组件或构件将密文数Y提交给核心密码组件或构件,请求计算eY的值;核心密码组件或构件解密Y得到其明文数y,计算ey的值,然后采用同态加密算法加密对计算得到的ey的值进行加密,从而得到eY的值(为密文数),然后将计算得到的eY的值返回;普通密码组件或构件,利用eY的值和e^x0的值,采用同态加密算法的乘运算计算得到eX的值(为密文数),具体地,可以采用一个密文数(eY)与一个明文数(e^x0)相乘的方式,或者采用采用两个密文数相乘的方式,即eY乘以e^x0的密文数。
再假设现在要计算sin(X),则普通密码组件或构件利用同态加密算法计算得到密文数Y=X+X0,其中,X0为采用同态加密算法对-x0加密得到的密文数(X0有与X一样的浮动因子),x0为普通密码组件或构件随机选择的数;普通密码组件或构件计算得到sin(x0)、cos(x0)的值;普通密码组件或构件将密文数Y提交给核心密码组件或构件,请求计算sin(Y)、cos(Y)的值;核心密码组件或构件解密Y得到其明文数y,计算sin(y)、cos(y)的值,然后采用同态加密算法对计算得到的sin(y)、cos(y)的值加密,从而得到sin(Y)、cos(Y)的值(为密文数),然后将计算得到的sin(Y)、cos(Y)的值的值返回;普通密码组件或构件,利用sin(Y)、cos(Y)的值和sin(x0)、cos(x0)的值,采用同态加密算法的乘、加运算计算得到sin(X)的值(为密文数),具体地,可以采用密文数sin(Y)与cos(x0)的明文数相乘,密文数cos(Y)与sina(x0)的明文数相乘,然后将两个相乘的结果相加,或者,将密文数sin(Y)与cos(x0)的值经同态加密后的密文数相乘,密文数cos(Y)与sin(x0)的值经同态加密后的密文数相乘,然后将两个相乘的结果相加。
通过分解、变换计算其他三角函数类似。
再假设现在要计算1/X,则普通密码组件或构件利用同态加密算法计算得到密文数Y=X·X0(两个密文数的乘积),其中,X0为采用同态加密算法对x0加密得到的密文数,x0为普通密码组件或构件随机选择的数;普通密码组件或构件将密文数Y提交给核心密码组件或构件,请求计算1/Y值;核心密码组件或构件解密Y得到其明文数y,计算1/y的值,然后采用同态加密算法加密对计算得到的1/y的值加密,从而得到1/Y的值(为密文数),然后将计算得到的1/Y的值返回;普通密码组件或构件,利用1/Y的值和x0,采用同态加密算法的乘运算计算得到1/X的值(为密文数),具体地,可以采用1/Y的密文数与明文数x0相乘,或者采用1/Y的密文数与x0经同态加密后的密文数相乘。
再假设现在要计算sqrt(X)即X的平方根,则普通密码组件或构件利用同态加密算法计算得到密文数Y=X·X0(两个密文数的乘积),其中,X0为采用同态加密算法对(1/x0)2加密得到的密文数((1/x0)2为从随机选择的数x0导出的数),x0为普通密码组件或构件随机选择的一个正数;普通密码组件或构件将Y提交给核心密码组件或构件,请求计算sqrt(Y)的值;核心密码组件或构件解密Y得到其明文数y,计算sqrt(y)的值,然后采用同态加密算法对计算得到sqrt(y)的值加密,从而得到sqrt(Y)的值(为密文数),然后将计算得到的sqrt(Y)的值返回;普通密码组件或构件,利用sqrt(Y)的值和x0,采用同态加密算法的乘运算计算得到sqrt(X)的值(为密文数),具体地,可以采用密文数sqrt(Y)与明文数x0相乘,或者采用密文数sqrt(Y)与x0经同态加密后的密文数相乘。
再假设现在要计算ln(X)即X的自然对数(假设确定X为正数),则普通密码组件或构件利用同态加密算法计算得到密文数Y=X·X0(两个密文数的乘积),其中,X0为采用同态加密算法对1/x0加密得到的密文数,x0为普通密码组件或构件随机选择的一个正数;普通密码组件或构件计算得到ln(x0)的值;普通密码组件或构件将密文数Y提交给核心密码组件或构件,请求计算ln(Y)的值;核心密码组件或构件解密Y得到其明文数y,计算ln(y)的值,然后采用同态加密算法对计算得到ln(y)的值加密,从而得到ln(Y)的值(为密文数),然后将计算得到的ln(Y)的值返回;普通密码组件或构件,利用ln(Y)的值和ln(x0)的值,采用同态加密算法和同态密文运算计算得到ln(X)的值(为密文数),具体地,可以采用密文数ln(Y)与ln(x0)的明文数相加,或者采用密文数ln(Y)与ln(x0)的值经同态加密后的密文数相加。
若以上复杂计算中的X是向量密文数且要求针对向量密文数中的被加密的每个明文元素(分量)进行同样的复杂计算,则上述针对单一密文数X的复杂计算同样适用于向量密文数X,此时x0为随机选择的明文向量,核心密码组件或构件解密向量密文数Y得到明文向量y,然后针对明文向量y的每个元素进行同样的复杂计算,然后将计算结果加密,得到计算结果的向量密文数,即得到利用Y计算得到的密文结果,然后普通密码组件或构件利用明文向量x0计算得到其他相关明文向量、其他相关向量密文数,并利用Y计算得到的结果,通过同态加密的加、乘运算得到最终的期望计算结果。
再假设现在要计算X1/X2,则普通密码组件或构件利用同态加密算法计算得到密文数Y1=X1·X0,Y2=X2·X0(两个密文数的乘积),其中,X0为采用同态加密算法对x0加密得到的密文数,x0为普通密码组件或构件随机选择的数;普通密码组件或构件将密文数Y1、Y2提交给核心密码组件或构件,请求计算Y1/Y2的值;核心密码组件或构件解密Y1、Y2得到其明文数y1、y2,计算y1/y2的值,然后采用同态加密算法对计算得到的y1/y2的值加密,从而得到Y1/Y2的值(为密文数),然后将计算得到的Y1/Y2的值返回;则Y1/Y2的值即为X1/X2的值。
若普通密码组件或构件不想让核心密码组件或构件知道的X1/X2明文数,则可以按如下方式进行计算:
普通密码组件或构件利用同态加密算法计算得到密文数Y1=X1·X01,Y2=X2·X02(两个密文数的乘积),其中,X01为采用同态加密算法对x01加密得到的密文数,X02为采用同态加密算法对x02加密得到的密文数,x01、x02为普通密码组件或构件随机选择的数;普通密码组件或构件将密文数Y1、Y2提交给核心密码组件或构件,请求计算Y1/Y2的值;核心密码组件或构件解密Y1、Y2得到其明文数y1、y2,计算y1/y2的值,然后采用同态加密算法对计算得到的y1/y2的值加密,从而得到Y1/Y2的值(为密文数),然后将计算得到的Y1/Y2的值返回;普通密码组件或构件利用Y1/Y2的值和x02/x01的值,通过同态加密算法和同态密文运算计算得到X1/X2的值。
以上X1/X2计算中,密文数X1、X2可以是单一密文数,也可以是向量密文数,若X1、X2是向量密文数,则x0、x01、x02为明文向量,相应的明文向量、向量密文数除运算为对应明文元素的除运算。
普通密码组件或构件,请求核心密码组件或构件对一个密文数进行整理时,或者请求核心密码组件或构件针对一个或多个密文数进行复杂计算时,如何确定是否需要进行密文数变换、转换?这可以在密文数数据对象中定义一个敏感度属性,通过此属性的值来表明对应的密文数是否是高度敏感的(比如在密文数数据对象初始化时设置此属性的值),如果根据一个密文数数据对象的敏感度属性确定对应的密文数是高度敏感的,则在将此密文数数据对象提交给核心密码组件或构件前,普通密码组件或构件先对相应的密文数进行变换、转换。
再假设要计算eA,其中A为由列向量密文X1,X2,…,Xn构成的密文矩阵,则普通密码组件或构件将X1,X2,…,Xn提交给核心密码组件或构件,核心密码组件或构件解密X1,X2,…,Xn得到A的明文矩阵a,计算ea,然后采用同态加密算法对计算结果加密,得到eA(列向量密文),将其返回给普通密码组件或构件。
再假设要求解A的特征根的密文,其中A为由列向量密文X1,X2,…,Xn构成的密文矩阵,则普通密码组件或构件将X1,X2,…,Xn提交给核心密码组件或构件,核心密码组件或构件解密X1,X2,…,Xn得到A的明文矩阵a,求得其特征根(可为复数),然后将特征根加密返回给普通密码组件或构件。
再假设要求解A的逆矩阵,其中A为由列向量密文X1,X2,…,Xn构成的密文矩阵,则普通密码组件或构件将X1,X2,…,Xn提交给核心密码组件或构件,核心密码组件或构件解密X1,X2,…,Xn得到A的明文矩阵a,求得其逆矩阵,然后采用同态加密算法对计算结果加密,得到A的逆矩阵(列向量密文),将其返回给普通密码组件或构件。
对于调用核心密码组件或构件进行复杂计算的原则是,直接基于密文数能满足要求的计算尽量直接使用密文数计算,基于密文数计算无法满足要求或很难或无法完成的复杂计算才调用核心密码组件或构件计算。
对于复杂计算中出现的非常规的计算规则或函数,可以通过如下方式之一实施:
(1)针对明文数计算的程序代码作为可信代码(比如经数字签名后的可信代码)被核心密码组件或构件动态加载、调用;这个可信代码是核心密码组件或构件预先本地保存的,或者普通密码组件或构件提交计算请求时提交的,核心密码组件或构件在加载、执行程序代码前,先验证程序代码的可信性(比如通过验证程序代码的数字签名);这个可信程序可以是编译后的程序代码如c/c++程序、Java/C#类库,或者解释执行的程序,如由脚本性编程语言编写的解释执行程序;
(2)普通密码组件或构件提交提交计算求情时,同时提交复杂计算的计算规则或函数的描述式(表达式),核心密码组件或构件通过解析计算规则或函数的描述式(表达式),然后根据计算规则或函数的描述式(表达式)完成相应的计算;至于这个非常规的计算规则或函数的描述式(表达式)采用何种方式、形式,完全由实施者定义(比如,可以借助一种脚本编程语言定义)。
对于普通密码组件或构件,其可以以SDK、API(动态库、类库)的形式实施,也可以以一个单独的服务系统(比如服务器)的形式实施。
对于核心密码组件或构件,由于涉及解密运算的密钥(私钥)的安全存储和使用(解密运算),对其安全性要求高,通常不能以纯软件的方式实施,可以以包含软硬件的密码卡的形式实施,解密运算的密钥(私钥)存储在密码卡中受到严格安全保护,所有的敏感运算在密码卡中进行,或者,核心密码组件或构件以一种高安全、独立运行的密码服务器或密码机的形式实施(它们符合针对密码设备的有关安全要求),解密运算的密钥(私钥)存储在密码服务器或密码机中并受到严格安全保护,所有的敏感运算在密码服务器或密码机中进行。
针对数据加密采用的各种加密参数、密钥,可以是永久的,比如针对企业应用中、SaaS平台中存放在永久介质中如数据库中的数据进行加密及运算的各种加密参数、密钥,也可以是临时的,比如,针对某个数据处理过程、模型参数计算过程中的保密或私密数据进行加密及运算的各种加密参数、密钥,无论是永久的,还是临时的,都要通过相应的初始化过程,生成、设置加密参数(密码运算上下文),生成密钥(密钥对),输出加密参数、加密密钥(公钥),对于本发明的实施,这些初始化操作由核心密码组件或构件负责。
图1为本发明的系统示意图,本发明的普通和核心密码组件或构件的部署方式很灵活,可以有各种不同的部署方式(但部署方式通常与应用场景有关)。
对于无需调用核心密码组件或构件的普通密码组件或构件,可以部署在任何地方,比如,可以部署在(企业)客户端或用户端,可以部署在进行数据处理、计算的服务端,如应用服务端、计算服务平台、数据处理服务平台。对于需要调用核心密码组件或构件的普通密码组件或构件,通常部署在进行数据处理、计算的服务端,如应用服务端、计算服务平台、数据处理服务平台。
若核心密码组件或构件是密码卡,则核心密码组件或构件可以与需要调用它的普通密码组件或构件部署在同一个计算机中(比如企业应用的服务器计算机),或者部署在运行普通密码组件或构件的计算机所在场所的受到严格安全保护的专门计算机中,比如SaaS云计算应用平台、隐私计算服务平台中的受到严格安全保护的专门计算机中,它们作为密码服务器被普通密码组件或构件调用。
若核心密码组件或构件是一个单独的密码服务器或密码机,则核心密码组件或构件可以部署在运行普通密码组件或构件的计算机所在的应用服务平台、计算服务平台,与这些平台运行在同一场所,并受到严格安全保护,或者核心密码组件或构件部署在与应用服务平台、计算服务平台不同的另一个服务平台、另一场所,比如,专门提供密码服务的密码服务提供商的密码服务平台、密码服务提供商的场所,此时,普通密码组件或构件通过网络,远程调用核心密码组件或构件的密码功能(当然,这种远程密码功能调用需要有安全保护和授权),这种部署方式同时适用于企业应用、SaaS云计算应用平台、隐私计算服务平台。
对返回解密后的明文数的授权的实施,与具体应用场景有关,具体应用场景会影响核心密码组件或构件的所属权、管理权、控制权的实施,比如,对于公共应用、公共服务,这些公共应用、公共服务平台的拥有者、运行者不能是核心密码组件或构件的拥有者、管理者、控制者,否则他们有得到敏感明文数(据)的可能。无论怎样的应用场景、采用怎样的授权实施方式,都要确保一个原则:只有授权的解密数据的使用者、拥有者才能得到明文数(据)。下面是针对一些应用场景的可能的授权实施方式。
如图2所示,考虑这样一个应用场景,同态加密用于一个企业应用,比如企业财务系统,此时核心密码组件或构件,既可以部署在企业(以一个密码卡或密码机的方式),又可以部署在密码服务提供商(以一个密码服务器、密码机的方式),无论采用何种部署方式,此时核心密码组件或构件的所属权、管理权、控制权既可以属于企业,也可以属于一个专门的密码服务提供商。此时,无论核心密码组件或构件的所属权、管理权、控制权属于谁,这时企业内部授权的解密数据的使用者(比如财务人员),可以单独通过(在线)签发授权数据,比如通过一个存储有签名私钥的USB Key签发数字签名的授权数据(此时的签名私钥通常是其他算法的私钥,比如,SM2算法私钥、RSA算法私钥),请求核心密码组件或构件解密密文数、返回解密的明文数,这时,解密后的明文数经核心密码组件或构件采用解密数据的使用者的数据加密密钥(比如公钥)加密后返回给解密数据的使用者,而解密数据的使用者使用自己的数据解密密钥(如私钥)解密返回的、被加密的明文数(通常不是同态加密的密文数,但也可以是),从而最终得到明文数。
如图3所示,再考虑这样一个应用场景,同态加密用于一个SaaS平台中的客户数据的安全保护,比如用于一个向企业提供财务服务的SaaS平台中的企业财务数据的安全保护。此时核心密码组件或构件,既可以部署在SaaS服务平台(以密码卡或密码机、密码服务器的方式),又可以部署在密码服务提供商的密码服务平台(以密码服务器的形式)。无论核心密码组件或构件部署在哪,核心密码组件或构件的所有权、管理权、控制权不属于SaaS平台运营者(这里的管理权指技术管理的权力,若密码设备位于SaaS平台,平台有对密码设备安全保护、管理的责任),而是属于一个密码服务提供商(如果属于SaaS平台的运营者,那么,它既是裁判员,又是运动员,存在其获得敏感数据的风险)。这时,SaaS平台的客户是保密数据的拥有者,SaaS平台的客户的授权人员(比如财务人员)是解密数据的使用者,客户的授权人员可以单独通过(在线)签发授权数据(比如通过一个存储有签名私钥的USB Key签发经数字签名的授权数据),请求核心密码组件或构件解密密文数、返回明文数。这时,解密的明文数经核心密码组件或构件采用解密数据的使用者的数据加密密钥(比如公钥)加密后返回给授权人员,而授权人员使用自己的数据解密密钥(如私钥)解密返回的加密的明文数(通常不是同态加密的密文数,但也可以是),最终得到明文数。
再考虑这样一个应用场景,同态加密用于一个提供大数据处理、基于机器学习建模的云计算服务平台,这时用于处理、建模的数据来自平台客户(如银行、保险公司、产品生产商、电子商务企业等),平台客户的敏感数据经同态加密后提交到平台进行数据处理、模型计算。此时核心密码组件或构件,既可以部署在云计算平台(以密码卡或密码机、密码服务器的形式),又可以部署在一个密码服务提供商的密码服务平台(以密码服务器的形式)。无论核心密码组件或构件部署在哪,核心密码组件或构件的所有权、管理权、控制权不属于云计算服务平台的拥有者、运营者(这里的管理权指技术管理的权力,若密码设备位于公共服务平台,平台有对密码设备安全保护、管理的责任),而是属于一个专门的密码服务商(若属于云计算平台的运营者,则它既是裁判员,又是运动员,存在它获取敏感数据的风险)。这时,平台客户是保密数据的拥有者,是最终数据处理结果、模型计算结果的拥有者、使用者。为了向平台客户提供更严格的数据安全保护,防止敏感信息被泄露,核心密码组件或构件输出最终的处理结果、模型数据的明文,需要得到平台客户以及核心密码组件或构件的拥有者或管理者(即密码服务提供商)的同时(在线或离线)授权,由它们分别对授权数据进行数字签名。实际应用中,授权方式还可以进一步分为两种情形:一是,如图4所示,用于实时在线计算的核心密码组件或构件与依据授权数据解密返回明文数的核心密码组件或构件是同一个或位于同一场所的核心密码组件或构件,二是,如图5所示,用于实时在线计算的核心密码组件或构件与依据授权数据解密返回明文数的核心密码组件或构件是位于不同一场所的核心密码组件或构件,其中用于实时在线计算的核心密码组件或构件位于进行大数据处理、基于机器学习建模的云计算服务平台,依据授权数据解密返回明文数的核心密码组件或构件位于一个密码服务提供商的场所,而云计算服务平台的核心密码组件或构件从不密返回明文数(这样能更有效地防止敏感数据的泄露)。
无论何种应用场景,解密数据的使用者或拥有者有针对密文数进行解密的私钥(即同态加密算法的私钥),则解密数据的使用者或拥有者可以使用自己的私钥对同态加密密文数及运算、计算结果进行解密,核心密码组件或构件仅在数据处理、计算过程中需要的时候被调用(如对密文数进行整理、复杂计算)。
在本发明的实施中,哪些主体持有解密密文数的同态加密(算法的)私钥(这里说的持有是指物理上的持有,而不是指逻辑上的持有),以及加密数据所使用的同态加密(算法的)公钥是怎样的,可以包括如下几种情形:
情形1:除了核心密码组件或构件中保存有解密数据的同态加密私钥、且私钥不出核心密码组件或构件外,所有参与主体都不持有同态加密私钥,不同的参与主体使用同一个同态加密公钥(公共公钥)加密数据,然后由核心密码组件或构件使用同一个私钥(公共私钥)解密数据;这种情形适用于以上所述的企业应用、SaaS应用、公共数据处理平台、公共模型计算平台;从计算角度,这样的好处是:对于公共数据处理平台、公共模型计算平台,来自不同参与主体的密文数据可以直接混合进行密文运算(对于一个公共数据处理平台、公共模型计算平台,计算、处理所涉及的数据可能来自不同的主体,当然,不同来源的密文数据采用的密码运算上下文也要相同);
情形2:与情形1相同的是所有参与主体都不持有同态加密私钥,与情形1的差别在于,不同的参与主体使用不同的同态加密(公私钥对的)公钥加密数据,然后由核心密码组件或构件使用不同的私钥解密数据;这种情形适用于以上所述的企业应用、SaaS应用、公共数据处理平台、公共模型计算平台;从计算角度,对于公共数据处理平台、公共模型计算平台,这样做带了的问题是,来自不同主体的密文数据不能直接混合进行密文运算,若需要进行这种运算,需要由核心密码组件或构件进行相应的转换,转为用两个密文数中的一个公钥加密的数据,或者将两个密文数转换为用同一个其他公钥(比如公共公钥)加密的数据;
情形3:不同的参与主体,有的持有同态加密(公私钥对的)私钥,有的没有,不同的参与主体使用不同的同态加密公钥加密数据;没有私钥的参与方要获得解密后的数据,必需由核心密码组件或构件使用对应的私钥解密密文数据,而有私钥的参与方,或者自己用持有的私钥解密密文数,或者由核心密码组件或构件使用对应的私钥解密密文数;这种情形适用于以上所述的企业应用(不同企业应用的拥有主体可能持有私钥)、SaaS应用、公共数据处理平台、公共模型计算平台;从计算角度,对于公共数据处理平台、公共模型计算平台,这样做带了的问题是,来自不同主体、使用不同公钥加密的密文数据不能直接混合进行密文运算,若需要进行这种运算,需要由核心密码组件或构件进行相应的转换,将数据转为用没有主体持有对应私钥的公钥(比如公共公钥)加密的数据。
对于情形2、3,核心密码组件或构件可以维护一个列表,表明哪些同态加密公钥对应的私钥被参与主体持有,从而知道用哪个同态加密公钥加密的数据不能转化为用哪个主体持有私钥所对应的公钥加密的数据,只能转化为用其他公钥,比如公共公钥,加密的数据。
对于以上所述的各种SaaS服务平台、公共数据处理/模型计算平台(各种云计算)应用场景,平台系统或平台的运维、运营管理者可以作为解密数据的使用者或拥有者,或者作为解密数据的使用者或拥有者之一,参与密文数解密操作的授权,但不能单独进行授权。
本发明的普通密码组件或构件的实施,优先采用以数据(或数据对象)为中心的实施方式,而不是采用通常的以密码(算法、技术)为中心的实施方式。所谓以数据(或数据对象)为中心的实施方式,即除了少量接口外(如针对密码运算环境即密码运算上下文的初始化、针对密文数数据对象的初始化程序外),通过(普通)密码组件或构件提供的针对密文数进行操作的调用函数或方法,提交、传递的参数只有密文数数据对象,没有专门的与密码运算有关的参数,比如没有密码运算上下文等,与密码运算有关的参数被包含在了密文数数据对象中、作为数据对象的一部分被提交、传递,针对密文数数据对象进行操作处理的过程中具体需要使用哪些加密参数,由(普通)密码组件或构件,通过解析密文数数据对象获得,即仅从(普通)密码组件或构件提供的调用函数或方法的接口看,函数或方法接口提供的仅仅是针对密文数数据对象的运算、计算操作,与密码运算、密码计算、密码操作没有关系,比如,(普通)密码组件或构件不提供针对密文数的密文层级进行调整的接口函数或方法,是否需要针对密文数的密文层级进行调整由实施密文数运算、计算处理的接口函数或方法(如加运算、乘运算接口函数或方法)根据需要或要求自动进行处理,这使得使用(普通)密码组件或构件的接口(函数或方法)的编程人员无需关心密码操作,无需关心如何使用加密参数,无需具备密码知识、无需掌握密码算法。
所谓以密码(算法、技术)为中心的实施方式,即通过密码组件或构件提供的调用函数或方法的接口,提交、传递的参数除了(密文数)数据对象外,还有与密码运算、密码操作有关的参数(比如,密码运算上下文、放大因子),对于同态加密,编程人员需要使用密码组件或构件提供的专门接口函数或方法针对密文数进行专门的密码操作、处理,比如调整密文数的密文层级,这样,使用密码组件或构件接口的编程人员需要熟悉密码算法、熟悉密码计算,需具备密码知识。
实施基础密码功能的模块(如HElib、SEAL、Palisade等各种常用库)通常采用密码(算法、技术)为核心的实施方式,为了实施以数据(或数据对象)为中心的实施方式,可以由普通密码组件或构件面向应用程序提供以数据(数据对象)为中心的调用接口,在普通密码组件或构件内部,由普通密码组件或构件调用基础密码功能模块的以密码(算法、技术)为中心的接口,调用基础密码功能模块提供的同态加密密码功能。
在普通密码组件或构件采用以数据(或数据对象)为中心的实施方式的情况下,核心密码组件或构件也应尽可能地采用以数据(或数据对象)为中心的实施方式,比如,对于仅涉及密文数运算、计算的接口函数或方法,通过调用接口传递的参数仅仅涉及数据对象,不涉及密码参数,而对于其他与密码有关的操作,比如加密参数调整,则除了通过接口传递数据对象外,还需要通过接口传递与密码有关的参数(核心密码组件或构件通常不由应用程序直接调用,普通编程人员不使用,开发普通密码组件或构件的专业技术人员才使用)。
对于本发明的(程序中)用于运算和计算的、存放有密文数的数据对象的实施,可以由普通密码组件或构件提供相应的密文数数据对象(数据存储结构)的类型定义(比如类定义、结构定义),密文数数据对象是通过相应数据字段或结构直接存放密文数还是通过字段(如指针、引用字段)引用其他数据对象(结构)的方式存放密文数完全取决于实施者;密文数数据对象中除了有数据字段或结构用于存放密文数或引用存放密文数的数据对象外,还有相应的数据字段或结构用于存放进行密码运算的密码运算上下文信息、以及密码运算上下文之外的与当前密文数加密有关的参数,或者不是直接存放密码运算上下文,而是有相应的字段存放获取密码运算上下文的指示信息(如指针、标识符等),对于相应字段存放的是获取密码运算上下文的指示信息的情形,密码运算上下文可以存放在全局可访问的数据存储结构中(因为它包含的是必需的共同参数),比如一个全局Map表中,在进行数据加密、解密及密文运算时,可以通过密码运算上下文的指示信息,获得相应的密码运算上下文。在对密文数数据对象进行序列化时,可以直接将密码运算上下文序列化,之后反序列化重构数据对象时利用序列化数据中的密码运算上下文信息恢复进行密码运算的密码运算上下文,或者,在对密文数数据对象进行序列化时,将包含有重构密码运算上下文的密码运算上下文生成参数序列化,之后反序列化重构数据对象时利用序列化数据中的密码运算上下文生成参数重构用于密码运算的密码运算上下文,或者在全局表中找到用于密码运算的密码运算上下文,然后生成相应的获取密码运算上下文额的指示信息,即重构的密文数数据对象中保存的同样地可以直接是密码运算上下文,或者是获取密码运算上下文指示信息。
在具体实施中,密码运算上下文除了包含密码运算所必需的所有参数外,还可以包含密码运算的相应函数或方法(因为它可以是一个包含函数或方法的数据对象),但这不是必须的。若密码运算上下文中还包含密码运算的相应函数或方法,则这些函数或方法代码本身不序列化(而是反序列化时在本地重构)。
为了实施以数据(或数据对象)为中心的实施方式,对于面向对象的编程语言,普通密码组件或构件提供有密文数数据对象的类定义,提供有相应的数据对象的构造函数(方法)或初始化函数(方法),构造函数(方法)或初始化函数(方法)的输入参数仅需输入明文数(整数、浮点数),同态加密公钥,以及密码运算上下文,或者用于选择密码运算上下文的指示信息。密文数数据对象的构造函数(方法)或初始化函数(方法),根据输入参数,对明文数进行编码,使用或选择相应的密码运算上下文对编码的明文数进行加密得到相应的密文数(若没有已创建的密码运算上下文,则创建相应的密码运算上下文),然后设置密文数数据对象的相应字段,完成密文数数据对象的初始化设置。
对于非面向对象的编程语言,普通密码组件或构件定义、提供有针对密文数数据对象的初始化函数,初始化函数的输入参数仅需输入待初始化的密文数数据对象、明文数(整数、浮点数),同态加密公钥,以及密码运算上下文或者用于选择密码运算上下文的指示信息。针对密文数数据对象的初始化函数,根据输入参数,对明文数进行编码,利用输入的密码运算上下文,或者根据密码运算上下文的指示信息找到匹配的已创建的密码运算上下文(若没有已创建的,则创建相应的密码运算上下文),使用密码运算上下文对编码的明文数进行加密得到相应的密文数,然后设置密文数数据对象的相应字段,完成密文数数据对象的初始化设置。
在本发明的实施中,在同一个密码运算上下文下,不同的类型的数据的浮动因子的粒度q及浮动因子中的常数c可以同,也可以不同,如果不同的类型的数据的q、c的选取都相同,则q、c可以属于密码运算上下文下,也可以不属于;如果不同的类型的数据的q、c的选取不同,则不属于密码运算上下文下。
在本发明的密码运算上下文和/或密文数数据对象的初始化过程中,需要选择、设置(一个或多个)放大因子γ、浮动因子β的粒度q及常数c,为此,可以采用以上所述的通过测试选择、设置γ、β的方案,或者采用以上所述的根据已知的(大部分)待加密、运算和计算的浮点数的阶码的范围,(由相应初始化程序)自动选择、设置的方案,当然,也可以采用实施者认为合适的其他方案。
通过以上密文数数据对象以及密文数数据对象的初始化方法,编程人员无需关心如何编程调用密码组件或构件从明文数加密得到对应的密文数,无需关心构造函数(方法)或初始化函数(方法)的编写。
这里要指出的是,由于核心密码组件或构件具有较高的安全性要求,因此,它无论是以密码卡,还是以独立运行的密码服务器、密码机的方式实施,普通密码组件或构件都不能通过程序代码调用的方式(函数、方法调用方式),直接调用核心密码组件或构件的功能,必须通过间接的方式(如通过网络、PCIE总线);普通密码组件或构件调用核心密码组件或构件时提交的各种数据对象,比如密文数数据对象,必须经序列化后才能传送给核心密码组件或构件,由核心密码组件或构件通过反序列化重构数据对象;响应返回时,返回的各种数据对象,必须经序列化后才能返回给普通密码组件或构件,由普通密码组件或构件通过反序列化重构数据对象;为了避免在这个调用、返回过程中不断、重复地创建密码运算上下文,密码运算上下文应优先采用全局数据的方式保存,且避免出现重复的密码运算上下文,而通过对每个全局密码运算上下文引入一个引用计数,可以有效地管理全局密码运算上下文:维护一个全局表,它保存有不同的密码运算上下文,每个密码运算上下文有一个引用计数;当需要引用一个密码运算上下文而它在全局表中不存在时,在全局表中创建此密码运算上下文,并将其引用计数置为1;每增加一个密文数数据对象或其他密码数据对象对一个密文运算上下文的引用,将其引用计数加1;若一个密文数数据对象或密码数据对象不再对一个密码运算上下文引用了,将其引用计数减1;当一个密码运算上下文的引用计数为0超时后,将此密码运算上下文从全局表中删除。
对于不同数据类型(整数、浮点、复数)的密文数数据对象的实施,可以采用直接定义不同的数据类(型)(如class)的方式,也可以通过在密文数数据对象(类)的一个表示数据类型的字段或属性中设定不同的值来区分,当在运算或计算过程,需要知道密文数数据对象的类型时,可以通过此字段或属性的取值来确定密文数数据对象的类型(比如,对于c语言,可以用结构数据的第一个字段来标识密文数数据对象的类型,这样通过指针所指向的数据结构的第一个字段就可以知道数据对象的类型,以及具体数据结构,这是c语言编程中定义具有共同特性的不同类型的数据对象的常用方法,能取得类似于面向对象的编程语言中定义基类、派生类的技术效果);对于具有反射(reflection)机制的编程语言、技术,还可先定义基类,然后通过不同的派生类来定义不同的类型的密文数数据对象,在运算或计算过程,当需要知道密文数数据对象的类型时,可通过反射机制确定。采用直接定义不同的数据类(型)(如class)的方式最不可取,无论对于保密计算系统编写的程序员,还是对于应用程序编写的程序员,这都增加了额外的复杂性,比如,两个实数密文数相加,通常是不用管这两个密文数是整数密文数还是浮点数密文数,仅在解密得到明文数后,才依据两个密文数数据对象是整数类型的还是浮点类型的,分别做不同的处理,而且采用直接定义不同的数据类(型)(如class)的方式,对于不同的数据类型的操作,需要定义不同的运算操作(接口)函数或方法。
存放单一密文数和存放向量密文数的密文数数据对象是通过不同类型的数据对象实施,还是通过同一个类型的数据对象实施,即将单一密文数当作向量密文数的特例(仅一个元素的向量),取决于具体实施者。另外,在具体中还可以定义矩阵密文数据对象,矩阵密文数据对象包含单个或多个向量密文数,
为了降低普通程序员使用经同态加密的密文数进行计算程序编写的难度,实施的保密计算系统可提供辅助计算程序和/或辅助编译工具,其中:
辅助计算程序接收(一个或多个)密文数数据对象以及计算公式和/或计算过程的描述信息,解析计算公式和/或计算过程的描述信息,按照描述的计算公式和/或计算过程的描述使用密文数数据对象、调用普通密码组件或构件完成相应的计算;计算公式和/或计算过程的描述信息由实施者自己规定;辅助计算程序可以实施为一个动态加载的程序组件,如动态库、类库(比如以SDK形式发布),或者是一个独立运行的程序;
或者,程序员仍按针对明文数(如整数、浮点数的方式)编写计算程序的方式,使用运算符(如+、-、*、/等)、编程语言提供的常用计算函数(如自然指数函数、自然对数函数、三角函数、平方根函数等)针对密文数数据对象进行计算编程的编写,同时对程序中的密文数据对象进行注释,或者针对密文数预定义有专门的基类,所有的密文数是密文数的派生类;辅助编译工具根据程序员在源程序代码中的注释或根据程序中计算式的数据对象的数据类型,将源程序代码中出现的使用运算符(如+、-、*、/等)、使用编程语言提供的常用计算函数针对密文数数据对象进行运算、计算的程序代码,转换为使用密文数数据对象调用普通密码组件或构件提供的与运算符对应运算操作函数或方法(如与+、-、*、/运算符对应的进行加、减、乘、除运算操作的函数或方法)、调用普通密码组件或构件提供的相应常规计算函数(如普通密码组件或构件提供的针对密文数的自然指数函数、自然对数函数、三角函数、平方根函数等)进行对应计算的程序代码;之后,再对变换后的源程序进行编译,然后执行编译后的程序;对于解释执行的源程序(脚本程序),则直接执行变换后的源程序,或者,对于不支持运算符重载但提供有反射(reflection)机制或功能的编程语言(如Java、Golang、C#的反射机制或工具),辅助编译工具根据程序员在源程序代码中的注释,将源程序代码中出现的使用运算符针对数据对象进行运算的程序代码,调用编程语言提供的常用计算函数针对数数据对象进行计算的程序代码,转换为调用普通密码组件或构件提供的、与运算符对应的运算操作函数或方法进行运算的程序代码,转换为调用普通密码组件或构件提供的对应常规计算函数针对数据对象进行对应计算的程序代码,普通密码组件或构件提供的、与运算符对应的运算操作函数或方法,普通密码组件或构件提供的常规计算函数,在执行过程中通过反射确定参与运算或计算的数据对象的类型(什么类型的数据,如整数、浮点、双精浮点或其他类型的数据对象)和种类(是否是密文数数据对象),然后依据数据对象的类型和种类进行相应的运算或计算处理。
为了能够通过反射确定参与运算或计算的数据对象的类型和种类,并依据数据对象的类型和种类进行相应的运算或计算处理,普通密码组件或构件提供的、与运算符对应的运算操作函数或方法,提供的对应常规计算函数,其输入参数的类型为最基本的对象类(Object类)(其他类型为其派生类)。
对于支持运算符(如+、-、*、/等)重载的编程语言(如c++),保密系统可通过实施提供针对密文数据对象的(所需的所有)运算符重载程序,从而使得普通编程人员能按编写通常的、针对明文数(如整数、浮点数)的计算程序一样的编程方式编写针对密文数的计算程序,其中表示密文数的数据对象可通过数据初始化程序(如c++数据对象的构造函数)赋值;进一步地,密文数数据对象的类型可以包括整数类型、浮点数类型和复数类型,对于整数类型的密文数对象,核心密码组件或构件在解密密文数后,对于解密得到的非整数明文数,核心密码组件或构件将其绝对值按四舍五入取整转换为整数(如果解密得到的明文数本身就是整数明文数,当然不用转换),符号不变,从而得到整数明文数。
其他未说明的具体技术实施,对于相关领域的技术人员而言是众所周知,不言自明的。
Claims (17)
1.一种保密计算系统,其特征是:
所述保密计算系统包括普通密码组件或构件、核心密码组件或构件,其中:
普通密码组件或构件:采用同态加密算法对明文数进行加密以及针对密文数进行代数运算即密文运算;普通密码组件或构件没有用于解密密文数的密钥;
核心密码组件或构件:对密文数进行整理,针对密文数进行复杂计算,以及将密文数解密后安全返回给解密数据的使用者或拥有者;对密文数的整理针对的是如果不解密密文数得到其明文数,就很难或无法做到的针对密文数的改变或调整,其中包括改变或调整数据加密运算、数据解密运算及密文运算即密码运算所采用的密码运算上下文,改变或调整密码运算上下文之外的与密码运算有关的参数,以及改变或调整密文数的密文层级;核心密码组件或构件有用于解密密文数的密钥;用于解密密文数的密钥被安全保护;核心密码组件或构件不以明文形式返回敏感数据,所述敏感数据包括从密文数解密得到的数据,以及利用从密文数解密得到的数据所计算得到的不允许以明文返回的数据;
所述明文数包括单一明文数和明文向量,所述密文数包括单一明文数加密后的密文即单一密文数和明文向量加密后的密文即向量密文数;
所述复杂计算是指由于受到密文数允许进行的乘运算的次数的限制即密文层级的限制而无法得到期望结果的计算,或者利用密文数很难或无法完成的计算;所述很难或无法完成的计算是指由于受到同态加密算法本身或计算技术的限制而无法在要求或规定的时间内基于密文数完成并得到期望结果的计算;
所述密码运算上下文是指针对数据进行加密运算、解密运算及密文运算即密码运算所必需的共同参数的集合,所述共同参数的集合构成了密码运算的基本背景环境;若所述保密计算系统同时支持不同的同态加密算法,则密码运算上下文还包括同态加密算法标识符,用于标识数据加密运算、解密运算及密文运算所采用的同态加密算法;若密码运算上下文中没有同态加密算法标识符,则相应的同态加密算法为缺省的算法;
所述普通密码组件或构件、所述核心密码组件或构件中的所述组件为不能独立运行的系统部件,所述构件为能独立运行的系统部件;所述普通密码组件或构件和所述核心密码组件或构件位于相同或不同的运行场所,若二者位于不同的运行场所,则普通密码组件或构件通过网络与核心密码组件或构件进行数据交换;
对于所述普通密码组件或构件提交的对密文数进行整理的请求,所述核心密码组件或构件解密待整理的密文数,对解密得到的明文数按普通密码组件或构件的要求进行整理,然后采用同态加密算法对整理后的明文数重新进行加密,之后将重新加密得到的密文数返回;
对于所述普通密码组件或构件提交的针对密文数进行复杂计算的请求,所述核心密码组件或构件解密密文数,利用解密得到的明文数进行普通密码组件或构件所要求的复杂计算,然后采用同态加密算法对计算得到的结果进行加密,之后将加密得到的密文数返回;
对于解密返回密文数对应的明文数的请求,所述核心密码组件或构件在确认请求获得解密数据的使用者或拥有者,以及/或者核心密码组件或构件的拥有者或管理者或控制者的授权后,解密密文数,将解密得到的明文数用解密数据的使用者或拥有者的数据加密密钥加密,然后将加密得到的密文返回给解密数据的使用者或拥有者;之后,解密数据的使用者或拥有者使用数据解密密钥解密核心密码组件或构件返回的密文,最终获得明文数。
2.根据权利要求1所述的保密计算系统,其特征是:
一个待加密处理的单一明文数被分解为一个浮动因子β与一个有效数位数的乘积,所述有效数位数是指包含的有效数字有期望的位数的数即具有足够的有效数位的数;对于复数明文数,其实部和虚部的浮动因子相同;浮动因子为正数;对有效数位数加密得到有效数位数密文,有效数位数密文与浮动因子一起构成了单一明文数的密文即单一密文数;
一个待加密的明文向量,其每个元素被分解为同一个浮动因子β与一个有效数位数的乘积,所有元素的有效数位数构成了一个有效数位数向量;对有效数位数向量加密得到有效数位数向量的密文即向量密文数,有效数位数向量的密文即向量密文数与浮动因子一起构成了明文向量的密文即明文向量的向量密文数;
单一明文数的有效数位数和明文向量的有效数位数向量统称为有效数位数,单一明文数的有效数位数的密文即密文数和明文向量的有效数位数向量的密文即向量密文数统称为有效数位数的密文或有效数位数的密文数;
浮动因子的选取应使得的采用同态加密算法按通常的方式针对有效数位数进行加密,加密得到的结果以及基于密文数的运算的结果满足对数据的有效位数、计算精度和计算效率要求;所述按通常的方式针对有效数位数进行加密是指没有引入浮动因子时对待加密的数进行加密所采用的加密方式;
当一个系统部件,其中包括普通密码组件或构件以及核心密码组件或构件,对一个明文数加密时,先将待加密的明文数分解为一个浮动因子β与一个有效数位数的乘积,然后采用同态加密算法按通常的方式对有效数位数加密,得到有效数位数的密文,然后将浮动因子和有效数位数的密文组合形成明文数加密后的密文数;
当一个系统部件,其中包括核心密码组件或构件,对一个密文数进行解密时,先解密密文数中的有效数位数的密文,得到对应的有效数位数,然后将解密得到的有效数位数乘以密文数中给出的浮动因子β,从而得到密文数对应的明文数。
3.根据权利要求2所述的保密计算系统,其特征是:
当需要对一个密文数的浮动因子进行调整时,所述普通密码组件或构件将要调整的密文数提交到所述核心密码组件或构件;核心密码组件或构件解密密文数得到明文数,然后自动调整明文数的浮动因子及对应的有效数位数,或者依据调整请求中指定的浮动因子或要求,调整明文数的浮动因子及对应的有效数位数,然后采用同态加密算法对调整后的有效数位数加密,将加密结果与调整后的浮动因子一起形成调整后的密文数,然后将调整后的密文数返回给普通密码组件或构件。
4.根据权利要求3所述的保密计算系统,其特征是:
对一个密文数的浮动因子进行调整的同时,允许调整其密码运算上下文以及密码运算上下文之外的其他加密参数。
5.根据权利要求2所述的保密计算系统,其特征是:
普通密码组件或构件在不借助核心密码组件或构件的情况下,将浮动因子调小的一种方式如下:
若需要将一个密文数的浮动因子减小d倍,则将待调整的密文数的浮动因子减小d倍得到新的浮动因子,然后将待调整的密文数的有效数位数的密文与d的密文数相乘,得到新的有效数位数的密文,或者,若同态加密算法支持密文数乘明文数,则将待调整的密文数的有效数位数的密文与明文数d相乘,得到新的有效数位数的密文;新的浮动因子和新的有效数位数的密文一起构成了调整了浮动因子的密文数。
6.根据权利要求2所述的保密计算系统,其特征是:
普通密码组件或构件在不借助核心密码组件或构件的情况下将浮动因子调大的一种方式如下:
若需要将一个密文数的浮动因子增大d倍且1/d在有效数位数的表示范围内,则普通密码组件或构件将待调整的密文数的浮动因子增大d倍得到新的浮动因子,将待处理的密文数的有效数位数的密文乘以1/d经同态加密后的密文数,得到新的有效数位数的密文,新的浮动因子和新的有效数位数的密文一起构成了调整了浮动因子的密文数。
7.根据权利要求2-6中任一项所述的保密计算系统,其特征是:
当两个数的密文数相乘时,普通密码组件或构件将两个数的有效数位数的密文按同态加密算法相乘得到乘积的有效数位数的密文,将浮动因子相乘得到乘积的浮动因子;
当浮动因子相同的两个密文数相加时,普通密码组件或构件将两个数的有效数位数的密文按同态加密算法的加运算相加得到和的有效数位数的密文,浮动因子不变;
当浮动因子不同的两个密文数相加时,普通密码组件或构件借助核心密码组件或构件或者自己将两个密文数的浮动因子调整为一致,然后将调整后的浮动因子相同的两个密文数相加。
8.根据权利要求1-6中任一项所述的保密计算系统,其特征是:
若普通密码组件或构件需要核心密码组件或构件对一个密文数X进行整理,同时又不期望向核心密码组件或构件暴露密文数X所对应的明文数x,则普通密码组件或构件利用同态加密算法和同态密文运算将密文数X转换为Y,其中Y为x-x0的密文数,即Y对应的明文数为y=x-x0,x0为普通密码组件或构件随机选择的数或从随机选择的数中导出的数,然后将密文数Y提交到核心密码组件或构件请求进行整理;核心密码组件或构件解密Y得到Y对应的明文数y,然后使用密文数Y对应的明文数y完成普通密码组件或构件要求的整理,然后采用同态加密算法将整理得到结果加密,将加密后的整理结果返回给普通密码组件或构件;普通密码组件或构件采用同态加密算法和同态密文运算,将x0的同态加密密文数X0与核心密码组件或构件返回的密文数相加,从而得到期望的针对密文数X的整理结果。
9.根据权利要求1-6中任一项所述的保密计算系统,其特征是:
若普通密码组件或构件需要核心密码组件或构件使用密文数X完成复杂计算,同时又不期望向核心密码组件或构件暴露密文数X所对应的明文数x,则普通密码组件或构件利用同态加密算法和同态密文运算将密文数X转换为Y,其中Y为x+x0或x·x0的密文数,即Y对应的明文数y为x+x0或x·x0,x0为普通密码组件或构件随机选择的数或从随机选择的数中导出的数,然后将密文数Y提交到核心密码组件或构件,请求完成指定的计算;核心密码组件或构件解密Y得到Y对应的明文数y,然后使用密文数Y对应的明文数y完成普通密码组件或构件指定的计算,然后采用同态加密算法将计算得到结果加密,将加密后的计算结果返回给普通密码组件或构件;普通密码组件或构件利用核心密码组件或构件返回的密文数以及x0,采用同态加密算法和同态密文运算,计算得到期望的计算结果。
10.根据权利要求1-6中任一项所述的保密计算系统,其特征是:
对于复杂计算,若计算规则或函数不是核心密码组件或构件支持的常规的计算规则或函数,则所述核心密码组件或构件完成相应计算的方式包括:
针对明文数计算的程序代码作为可信代码被核心密码组件或构件加载、调用,由可信代码完成相应的期望的计算;
或者,普通密码组件或构件提交复杂计算对应的计算规则或函数的描述式,核心密码组件或构件通过解析计算规则或函数的描述式,完成相应的期望的计算;
核心密码组件或构件支持的常规的计算规则或函数是指不提供额外的计算规则或函数描述式,不提供额外的程序代码,核心密码组件或构件就能完成相应计算的计算规则或函数。
11.根据权利要求1-6中任一项所述的保密计算系统,其特征是:
对解密返回密文数对应的明文数的请求进行授权的一种方式是通过授权数据;所述授权数据包含有要解密的密文数或密文数的散列值,并由解密数据的使用者或拥有者,以及/或者核心密码组件或构件的拥有者或管理者或控制者数字签名,所述数字签名包括公钥数字签名或对称密钥数字签名;
请求返回密文数对应的明文数的实体,在请求返回密文数对应的明文数时,提交对应的用于获取密文数对应的明文数的授权数据;核心密码组件或构件通过验证授权数据的数字签名,验证授权数据的有效性;
若所述核心密码组件或构件没有预先保存解密数据的使用者或拥有者的用于数据加密的加密密钥,则所述授权数据中包含有用于对返回的数据进行加密的公钥或者用于生成、导出加密密钥的数据。
12.根据权利要求1-6中任一项所述的保密计算系统,其特征是:
核心密码组件或构件维护有授权者列表,其中的信息包括授权者的标识信息,针对授权者的数字签名的签名验证密钥,授权的方式,以及将密文数解密得到明文数后,对返回给解密数据的使用者或拥有者的明文数进行加密的加密密钥;所述授权者指能签发授权数据的实体,其中包括解密数据的使用者或拥有者,以及核心密码组件或构件的拥有者或管理者或控制者。
13.根据权利要求1-6中任一项所述的保密计算系统,其特征是:
用于存放一个密文数的数据对象称为密文数数据对象;密文数数据对象除了存放有密文数外,还存放有密码运算上下文以及密码运算上下文之外的与当前密文数加密及密文运算有关的参数,或存放有获取密码运算上下文的信息以及密码运算上下文之外的与当前密文数加密及密文运算有关的参数;所述密码运算上下文之外的与当前密文数加密及密文运算有关的参数包括公钥、放大因子、当前密文层级、当前密文运算模数;若密文数加密引入了浮动因子,则用于生成密文数的浮动因子的参数属于密码运算上下文中的参数,或属于密码运算上下文之外的与当前密文数加密及密文运算有关的参数;所述当前密文数指密文数数据对象中存放的密文数;
密文数数据对象经序列化后的序列化数据中有密文数对应的密码运算上下文或密码运算上下文生成参数;在通过反序列化重构密文数数据对象时,通过序列化数据中的密码运算上下文或密码运算上下文生成参数恢复或重构密文数数据对象的密码运算上下文或获取密码运算上下文的信息;
在进行密码运算时,进行密码运算的程序或系统部件通过密文数数据对象直接或间接获得进行密码运算所需的密码运算上下文以及密码运算上下文之外的与当前密文数加密及密文运算有关的参数;
所述密码运算上下文生成参数指用于生成或构造密码运算上下文的参数。
14.根据权利要求13所述的保密计算系统,其特征是:
所述密文数数据对象包括整数类型的密文数数据对象和浮点数类型的密文数数据对象,分别简称整数密文数数据对象和浮点密文数数据对象;
对于整数类型的密文数数据对象,核心密码组件或构件在解密密文数后,对于解密得到的非整数明文数,将其绝对值就近取整转换为整数,符号不变,从而得到整数明文数,然后返回整数类型的明文数,或利用整数明文数进行运算、计算或处理;若整数类型的密文数数据对象中存放的密文数是向量密文数,则在解密密文数后,将解密得到的明文向量中的每个非整数元素的绝对值就近取整转换为整数,符号不变,得到整数明文向量;
对于浮动数类型的密文数数据对象,核心密码组件或构件在解密密文数后,返回浮点数类型的明文数,或利用浮点明文数进行运算、计算或处理。
15.根据权利要求13所述的保密计算系统,其特征是:
所述密文数数据对象还包括复数类型的密文数数据对象,简称复数密文数数据对象;
若同态加密算法不支持复数加密及复数密文运算,则复数密文数数据对象同时保存有复数密文数的实部密文和虚部密文,而当普通密码组件或构件,或核心密码组件或构件,针对复数类型的密文数据对象进行密文运算或密文计算时,从复数密文数据对象中取出实部密文数和虚部密文数,按照复数运算或计算规则,利用实部或虚部密文数进行密文运算或密文计算,得到相应的密文运算或计算结果。
16.根据权利要求13所述的保密计算系统,其特征是:
所述保密计算系统提供有辅助计算程序和/或辅助编译工具,其中:
辅助计算程序接收密文数数据对象以及计算公式和/或计算过程的描述信息,解析计算公式和/或计算过程的描述信息,按照计算公式和/或计算过程的描述信息规定的计算公式和/或计算过程,使用密文数数据对象、调用普通密码组件或构件完成相应的计算;
辅助编译工具根据程序员在源程序代码中的注释或根据源程序中的计算式中出现的数据对象的数据类型,将源程序代码中出现的使用运算符针对密文数数据对象所进行运算的程序代码,转换为使用密文数数据对象调用普通密码组件或构件提供的、与运算符对应的运算操作函数或方法的程序代码,将源程序代码中出现的调用编程语言提供的常用计算函数针对密文数数据对象进行计算的程序代码,转换为使用密文数数据对象调用普通密码组件或构件提供的对应常规计算函数进行对应计算的程序代码,或者,对于不支持运算符重载但提供有反射机制或功能的编程语言,辅助编译工具根据程序员在源程序代码中的注释,将源程序代码中出现的使用运算符针对数据对象进行运算的程序代码,转换为调用普通密码组件或构件提供的、与运算符对应的运算操作函数或方法进行运算的程序代码,将源程序代码中出现的调用编程语言提供的常用计算函数针对数数据对象进行计算的程序代码,转换为调用普通密码组件或构件提供的对应常规计算函数针对数据对象进行对应计算的程序代码,普通密码组件或构件提供的、与运算符对应的运算操作函数或方法,普通密码组件或构件提供的常规计算函数,在执行过程中通过反射确定参与运算或计算的数据对象的类型和种类,然后依据数据对象的类型和种类进行相应的运算或计算处理。
17.根据权利要求13所述的保密计算系统,其特征是:
对于支持运算符重载的编程语言,所述保密计算系统提供有针对密文数数据对象的运算符重载,普通编程人员按编写针对明文数的计算程序的方式编写针对密文数数据对象的计算程序;所述普通编程人员指使用普通密码组件或模块进行程序编写的人员。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211078106.4A CN115529120A (zh) | 2022-09-05 | 2022-09-05 | 一种保密计算系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211078106.4A CN115529120A (zh) | 2022-09-05 | 2022-09-05 | 一种保密计算系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115529120A true CN115529120A (zh) | 2022-12-27 |
Family
ID=84698038
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211078106.4A Pending CN115529120A (zh) | 2022-09-05 | 2022-09-05 | 一种保密计算系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115529120A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116992204A (zh) * | 2023-09-26 | 2023-11-03 | 蓝象智联(杭州)科技有限公司 | 一种基于隐私保护的数据点乘运算方法 |
-
2022
- 2022-09-05 CN CN202211078106.4A patent/CN115529120A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116992204A (zh) * | 2023-09-26 | 2023-11-03 | 蓝象智联(杭州)科技有限公司 | 一种基于隐私保护的数据点乘运算方法 |
CN116992204B (zh) * | 2023-09-26 | 2023-12-29 | 蓝象智联(杭州)科技有限公司 | 一种基于隐私保护的数据点乘运算方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
RU2691874C2 (ru) | Способ защиты информации в облачных вычислениях с использованием гомоморфного шифрования | |
US12001525B1 (en) | Methods, systems, and devices for an encrypted and obfuscated algorithm in a computing environment | |
US10944751B2 (en) | Generating cryptographic function parameters from compact source code | |
CN112989368B (zh) | 多方联合进行隐私数据处理的方法及装置 | |
CN110214325B (zh) | 数据屏蔽的方法和系统 | |
US8208627B2 (en) | Format-preserving cryptographic systems | |
US10176056B2 (en) | Systems and methods for quorum-based data recovery | |
US7167565B2 (en) | Efficient techniques for sharing a secret | |
US11488134B2 (en) | Format-preserving cryptographic systems | |
JP2020515087A (ja) | ブロックチェーン機密トランザクション内の暗号化されたトランザクション情報の復元 | |
US11316665B2 (en) | Generating cryptographic function parameters based on an observed astronomical event | |
US20100091984A1 (en) | Secure logical vector clocks | |
EP3286747B1 (en) | Generating cryptographic function parameters from a puzzle | |
Moon et al. | An Efficient Encrypted Floating‐Point Representation Using HEAAN and TFHE | |
JP7327510B2 (ja) | 秘密乱数生成システム、秘密計算装置、秘密乱数生成方法、およびプログラム | |
CN115529120A (zh) | 一种保密计算系统 | |
WO2018216512A1 (ja) | 秘密改ざん検知システム、秘密改ざん検知装置、秘密改ざん検知方法、およびプログラム | |
Anwarbasha et al. | An efficient and secure protocol for checking remote data integrity in multi-cloud environment | |
CN117313119A (zh) | 一种应用代码加密验证方法、装置以及计算机设备 | |
Carey | On the explanation and implementation of three open-source fully homomorphic encryption libraries | |
WO2017001872A1 (en) | Secure computation | |
CN112995189B (zh) | 一种基于隐私保护的公开验证矩阵乘法正确性的方法 | |
CN114629620A (zh) | 同态加密计算方法及系统、同态请求、计算和密钥系统 | |
CN112614557A (zh) | 电子病历加密存档方法 | |
CN116455575B (zh) | 一种密钥生成、加密、解密方法、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |