一种云关系数据库的浮点数据的加密及查询方法转让专利

申请号 : CN201610477122.9

文献号 : CN106131139B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 邹先霞潘久辉杜威朱泰鹏

申请人 : 暨南大学

摘要 :

本发明公开的一种云关系数据库的浮点数据的加密及查询方法,包含以下步骤:一是将浮点数据的密文插入到云数据库:二是通过对存贮在云数据库的浮点数不解密的情况下进行SUM求和,先在云数据库上直接对加密后的属性值按正数和负数分类求和,未对属性值解密,保证了数据的安全性;其次由用户信任的数据库代理对云数据库上求和的结果进行解密和校正;最后为保证浮点计算精度,对解密后正数的和与负数的和采用浮点编码计算,解码后得到最终结果。本发明的方法,解决了云关系数据库浮点型的加密及加密数据上的求和计算能力,为云数据库的浮点型数据的安全性和高效查询提供了技术解决方法。

权利要求 :

1.一种云关系数据库的浮点数据的加密及查询方法,其特征在于,包含以下步骤:将浮点数据的密文插入到云数据库的加密方法包括A、B、C,其中:A、用户输入包含浮点数据的插入语句,对浮点数进行编码,通过编码规则将浮点数的小数点位置和正负号隐藏起来;

B、利用同态加密算法Paillier对编码后的每一组分别进行加密;

C、将加密后的编码值存入云数据库;

对存贮在云数据库的浮点数不解密的情况下进行SUM求和,对浮点数进行SUM查询的方法包括a-f,其中:a、将存贮在云数据库的浮点数密文转换为双链表二叉树;

b、利用双链表二叉树分别对正浮点数、负浮点数求和得到X、Y;

c、将云数据库所求得的X、Y的密文传送到用户客户端,再利用同态加密算法Paillier对X、Y进行解密;

d、采用双链表二叉树的结构对X、Y进行校正,使X、Y符合编码规则;

e、对校正后的X、Y按编码运算规则进行一次正、负数的求和运算,得到浮点数的SUM函数最终结果的编码值;

f、将SUM函数编码值按编码规则进行解码即为用户查询的结果。

2.根据权利要求1所述云关系数据库的浮点数据的加密及查询方法,其特征在于,步骤A中,所述编码规则如下:将浮点数的编码分为标志位和数字组二部分:标志位/指数位F,[数字组1,数字组

2,……,数字组N,……,数字组20];

(1)划分:按照浮点数的十进制小数形式以小数点为界,整数部分从小数点位置开始向最高位方向每二位为一组,最高位不够二位的补0;小数部分从小数点位置开始向最低位方向每二位为一组,最低位不够二位的补0;数字组的顺序与浮点数十进制数字顺序一致;

(2)符号位表示:设浮点数编码的标志位为F,标志位F大于193的为正数,标志位F小于

62的为负数,标志位F为193或62时分别表示正零或负零;

(3)小数点位置:设浮点数编码的标志位为F,F-193+1为正数的整数部分的组数,62-F+

1为负数的整数部分的组数,除掉整数部分的组数后剩余的组数为小数部分;

(4)数字组的编码:设划分的每一组的数字值为N,正数的编码为N,负数的编码为100-N。

3.根据权利要求2所述云关系数据库的浮点数据的加密及查询方法,其特征在于,所述步骤B具体为:

1)标志位F不进行加密;

2)按数字组顺序,每个数字组N用Paillier算法按正整数的形式进行加密,加密后每个节点的长度是不固定。

4.根据权利要求3所述云关系数据库的浮点数据的加密及查询方法,其特征在于,所述步骤C具体为:数字组加密后,在组之间设置分隔符;由标志位、组的加密串和分隔符组成的字符串存储在云关系数据库中。

5.根据权利要求2所述云关系数据库的浮点数据的加密及查询方法,其特征在于,所述步骤b具体为:

1)初始化二棵只有根结点的双链表二叉树,正数的和树AST根结点值为193,负数的和树MST根节点值为62;

2)依次读取浮点属性的属性值,若所有属性值已读完,则进入步骤6),否则进入步骤

3);

3)按编码串的遍历方式恢复双链表二叉树T:标志位F为根结点;若标志位大于62则F-

192为左子树节点数,否则62-F为左子树节点数,编码顺序为左子树的反向链表;剩余数字串为右子树,编码顺序为正向链表;恢复左子树的正向链表和右子树的反向链表;

4)由标志位判断为正数,则

4.1)若T根节点值大于AST根节点值,则AST根节点值改为T根节点值;

4.2)正向遍历AST和T的右子树,若AST和T的节点都不为空则进入步骤4.2.1),否则进入步骤4.2.3):

4.2.1)AST和T相同层的节点值相加,和为AST当前节点的值;

4.2.2)访问AST和T的下一个节点,进入步骤4.2);

4.2.3)若T的节点为空,则进入步骤4.3),否则进入步骤4.2.4);

4.2.4)新建AST的叶子节点,将T当前节点值复制到AST的叶子节点;

4.2.5)访问T的下一个节点,进入步骤4.2.3);

4.3)正向遍历AST和T的左子树,若AST和T的节点都不为空则进入步骤4.3.1),否则进入步骤4.3.3):

4.3.1)AST和T相同层的节点值相加,和为AST当前节点的值;

4.3.2)访问AST和T的下一个节点,进入步骤4.3);

4.3.3)若T的节点为空,则进入步骤2),否则进入步骤4.3.4);

4.3.4)新建AST的叶子节点,将T当前节点值复制到AST的叶子节点;

4.3.5)访问T的下一个节点,进入步骤4.3.3);

5)由标志位判断为负数,则

5.1)若T根节点值小于MST根节点值,则MST根节点值改为T根节点值;

5.2)正向遍历MST和T的右子树,若MST和T的节点都不为空则进入步骤5.2.1),否则进入步骤5.2.3);

5.2.1)MST和T相同层的节点值相加,和为MST当前节点的值;

5.2.2)访问MST和T的下一个节点,进入步骤5.2);

5.2.3)若T的节点为空,则进入步骤5.3),否则进入步骤5.2.4);

5.2.4)新建MST的叶子节点,将T当前节点值复制到MST的叶子节点;

5.2.5)访问T的下一个节点,进入步骤5.2.3);

5.3)正向遍历MST和T的左子树,若MST和T的节点都不为空则进入步骤5.3.1),否则进入步骤5.3.3);

5.3.1)MST和T相同层的节点值相加,和为MST当前节点的值;

5.3.2)访问MST和T的下一个节点,进入步骤5.3);

5.3.3)若T的节点为空,则进入步骤2),否则进入步骤5.3.4);

5.3.4)新建MST的叶子节点,将T当前节点值复制到MST的叶子节点;

5.3.5)访问T的下一个节点,进入步骤5.3.3);

6)输出二个数字串:按AST和MST的根节点、左子树的反向遍历、右子树的正向遍历及分隔符组成的数字串。

6.根据权利要求2所述云关系数据库的浮点数据的加密及查询方法,其特征在于,所述步骤c具体为:对正数和AST或负数和MST的数字串,除标志位外,对分隔符间隔开的每个数字串用Paillier算法进行解密;

恢复AST或MST的双链表二叉树T:标志位为根节点;由标志位确定左子树的节点数,按节点数将分隔符间隔的数字串顺序建立左子树的反向链表;剩余的数字串按顺序建立右子树的正向链表;恢复左子树的正向链表和右子树的反向链表。

7.根据权利要求6所述云关系数据库的浮点数据的加密及查询方法,其特征在于,所述步骤d具体为:(1)初始化进位变量C为0;

(2)若树T的右子树反向链表当前节点为空节点则进入步骤(3),否则转步骤(2.1):(2.1)将当前节点值保存在变量N,修改当前节点值为(N+C)mod100,修改进位变量C=(N+C)/100;

(2.2)继续访问T右子树反向链表的下一个节点,重复步骤(2);

(3)若树T的左子树正向链表当前节点为空节点则进入步骤(4),否则进入步骤(3.1):(3.1)将当前节点值保存在变量N,修改当前节点值为(N+C)mod100,修改进位变量C=(N+C)/100;

(3.2)继续访问T左子树正向链表的下一个节点,进入步骤(3);

(4)若进位变量C为0则进入步骤(5),否则进入步骤(4.1):(4.1)设当前节点为P,新建节点Q,C mod 100为新建节点Q的值,修改进位变量C=C/

100,树T的左子树反向链表根节点指向Q,Q指向P;正向链表P指向Q,Q指向空指针;

(4.2)进入步骤(4)继续判断是否需要新增节点;

(5)输出解密校正后的AST或MST的双链表二叉树。

8.根据权利要求1所述云关系数据库的浮点数据的加密及查询方法,其特征在于,步骤e中,所述编码运算规则具体为:首先对齐小数点,即找到整数部分的最后一个数字组,然后由最后一个数字组向前按组进行求和,小数部分由小数的第一个数字组向后按组进行求和,有进位时需处理进位。

说明书 :

一种云关系数据库的浮点数据的加密及查询方法

技术领域

[0001] 本发明涉及计算机学科数据库领域,特别涉及一种云关系数据库的浮点数据的加密及查询方法。

背景技术

[0002] 云计算提供了大容量的、低成本的数据存储和数据即服务DaaS(Database as a Service),越来越多的中小企业也为了降低投入成本和维护代价,选择了云计算的数据即服务,将原有的系统移植到云中。
[0003] 随之而来的就是数据的安全性,将敏感数据加密存贮是解决数据安全性的首要手段,如何保证数据安全性的同时又能维持数据的高效查询成为了数据即服务的关键技术问题。
[0004] 针对云中的关系型数据库,麻省理工学院开发了一个中间件CryptDB,广泛应用在Google、Amazon等云服务商。该中间件提供了对整型和字符型二种数据类型的加密和加密数据上的查询计算,但对浮点型数据的加密及加密数据的查询计算还未解决。
[0005] 因此,针对浮点型数据,有必要提供一种新的加密及查询方法来满足需求。

发明内容

[0006] 本发明的目的在于克服现有技术的缺点与不足,提供一种云关系数据库的浮点数据的加密及查询方法。
[0007] 本发明的目的通过以下的技术方案实现:
[0008] 一种云关系数据库的浮点数据的加密及查询方法,包含以下步骤:
[0009] 将浮点数据的密文插入到云数据库的加密方法包括A、B、C,其中:
[0010] A、用户输入包含浮点数据的插入语句,对浮点数进行编码,通过编码规则将浮点数的小数点位置和正负号隐藏起来;
[0011] B、利用同态加密算法Paillier对编码后的每一组分别进行加密;
[0012] C、将加密后的编码值存入云数据库;
[0013] 对存贮在云数据库的浮点数不解密的情况下进行SUM求和,对浮点数进行SUM查询的方法包括a-f,其中:
[0014] a、将存贮在云数据库的浮点数密文转换为双链表二叉树;
[0015] b、利用双链表二叉树分别对正浮点数、负浮点数求和得到X、Y,分开求和的原因是受到同态加密算法Paillier的限制和省去对借位的处理;
[0016] c、将云数据库所求得的X、Y的密文传送到用户客户端,再利用同态加密算法Paillier对X、Y进行解密;
[0017] d、解密后的二个和不符合我们的编码规则,采用双链表二叉树的结构对X、Y进行校正,使X、Y符合编码规则;
[0018] e、对校正后的X、Y按编码运算规则进行一次正、负数的求和运算,得到浮点数的SUM函数最终结果的编码值;
[0019] f、将SUM函数编码值按编码规则进行解码即为用户查询的结果。
[0020] 在整个查询计算过程中云数据库的数据始终是密文,保证了存贮在云数据库数据的安全性。
[0021] 步骤A中,所述编码规则如下:
[0022] 将浮点数的编码分为标志位和数字组二部分:标志位/指数位F,[数字组1,数字组2,……,数字组N,……,数字组20];
[0023] (1)划分:按照浮点数的十进制小数形式以小数点为界,整数部分从小数点位置开始向最高位方向每二位为一组,最高位不够二位的补0;小数部分从小数点位置开始向最低位方向每二位为一组,最低位不够二位的补0;数字组的顺序与浮点数十进制数字顺序一致;
[0024] (2)符号位表示:设浮点数编码的标志位为F,标志位F大于193的为正数,标志位F小于62的为负数,标志位F为193或62时分别表示正零或负零;
[0025] (3)小数点位置:设浮点数编码的标志位为F,F-193+1为正数的整数部分的组数,62-F+1为负数的整数部分的组数,除掉整数部分的组数后剩余的组数为小数部分;
[0026] (4)数字组的编码:设划分的每一组的数字值为N,正数的编码为N,负数的编码为100-N。
[0027] 所述步骤B具体为:
[0028] 1)由于标志位隐藏着浮点数符号和小数点位置信息,标志位F不进行加密;
[0029] 2)按数字组顺序,每个数字组N用Paillier算法按正整数的形式进行加密,加密后每个节点的长度是不固定。
[0030] 所述步骤C具体为:
[0031] 为方便计算,数字组加密后,在组之间设置分隔符;由标志位、组的加密串和分隔符组成的字符串存储在云关系数据库中。
[0032] 所述步骤b具体为:
[0033] 1)初始化二棵只有根结点的双链表二叉树,正数的和树AST根结点值为193,负数的和树MST根节点值为62;
[0034] 2)依次读取浮点属性的属性值,若所有属性值已读完,则进入步骤6),否则进入步骤3);
[0035] 3)按编码串的遍历方式恢复双链表二叉树T:标志位F为根结点;若标志位大于62则F-192为左子树节点数,否则62-F为左子树节点数,编码顺序为左子树的反向链表;剩余数字串为右子树,编码顺序为正向链表;恢复左子树的正向链表和右子树的反向链表;
[0036] 4)由标志位判断为正数,则
[0037] 4.1)若T根节点值大于AST根节点值,则AST根节点值改为T根节点值;
[0038] 4.2)正向遍历AST和T的右子树,若AST和T的节点都不为空则进入步骤4.2.1),否则进入步骤4.2.3):
[0039] 4.2.1)AST和T相同层的节点值相加,和为AST当前节点的值;
[0040] 4.2.2)访问AST和T的下一个节点,进入步骤4.2);
[0041] 4.2.3)若T的节点为空,则进入步骤4.3),否则进入步骤4.2.4);
[0042] 4.2.4)新建AST的叶子节点,将T当前节点值复制到AST的叶子节点;
[0043] 4.2.5)访问T的下一个节点,进入步骤4.2.3);
[0044] 4.3)正向遍历AST和T的左子树,若AST和T的节点都不为空则进入步骤4.3.1),否则进入步骤4.3.3):
[0045] 4.3.1)AST和T相同层的节点值相加,和为AST当前节点的值;
[0046] 4.3.2)访问AST和T的下一个节点,进入步骤4.3);
[0047] 4.3.3)若T的节点为空,则进入步骤2),否则进入步骤4.3.4);
[0048] 4.3.4)新建AST的叶子节点,将T当前节点值复制到AST的叶子节点;
[0049] 4.3.5)访问T的下一个节点,进入步骤4.3.3);
[0050] 5)由标志位判断为负数,则
[0051] 5.1)若T根节点值小于MST根节点值,则MST根节点值改为T根节点值;
[0052] 5.2)正向遍历MST和T的右子树,若MST和T的节点都不为空则进入步骤5.2.1),否则进入步骤5.2.3);
[0053] 5.2.1)MST和T相同层的节点值相加,和为MST当前节点的值;
[0054] 5.2.2)访问MST和T的下一个节点,进入步骤5.2);
[0055] 5.2.3)若T的节点为空,则进入步骤5.3),否则进入步骤5.2.4);
[0056] 5.2.4)新建MST的叶子节点,将T当前节点值复制到MST的叶子节点;
[0057] 5.2.5)访问T的下一个节点,进入步骤5.2.3);
[0058] 5.3)正向遍历MST和T的左子树,若MST和T的节点都不为空则进入步骤5.3.1),否则进入步骤5.3.3);
[0059] 5.3.1)MST和T相同层的节点值相加,和为MST当前节点的值;
[0060] 5.3.2)访问MST和T的下一个节点,进入步骤5.3);
[0061] 5.3.3)若T的节点为空,则进入步骤2),否则进入步骤5.3.4);
[0062] 5.3.4)新建MST的叶子节点,将T当前节点值复制到MST的叶子节点;
[0063] 5.3.5)访问T的下一个节点,进入步骤5.3.3);
[0064] 6)输出二个数字串:按AST和MST的根节点、左子树的反向遍历、右子树的正向遍历及分隔符组成的数字串。
[0065] 上述算法描述中步骤4)主要按双链表二叉树求所有正数的和,步骤5)主要按双链表二叉树求所有负数的和,这二步过程是类似的,仅在和树的根节点值的处理不一样。
[0066] 所述步骤c具体为:
[0067] 对正数和AST或负数和MST的数字串,除标志位外,对分隔符间隔开的每个数字串用Paillier算法进行解密;
[0068] 恢复AST或MST的双链表二叉树T:标志位为根节点;由标志位确定左子树的节点数,按节点数将分隔符间隔的数字串顺序建立左子树的反向链表;剩余的数字串按顺序建立右子树的正向链表;恢复左子树的正向链表和右子树的反向链表。
[0069] 所述步骤d具体为:
[0070] (1)初始化进位变量C为0;
[0071] (2)若树T的右子树反向链表当前节点为空节点则进入步骤(3),否则转步骤(2.1):
[0072] (2.1)将当前节点值保存在变量N,修改当前节点值为(N+C)mod 100,修改进位变量C=(N+C)/100;
[0073] (2.2)继续访问T右子树反向链表的下一个节点,重复步骤(2);
[0074] (3)若树T的左子树正向链表当前节点为空节点则进入步骤(4),否则进入步骤(3.1):
[0075] (3.1)将当前节点值保存在变量N,修改当前节点值为(N+C)mod 100,修改进位变量C=(N+C)/100;
[0076] (3.2)继续访问T左子树正向链表的下一个节点,进入步骤(3);
[0077] (4)若进位变量C为0则进入步骤(5),否则进入步骤(4.1):
[0078] (4.1)设当前节点为P,新建节点Q,C mod 100为新建节点Q的值,修改进位变量C=C/100,树T的左子树反向链表根节点指向Q,Q指向P;正向链表P指向Q,Q指向空指针;
[0079] (4.2)进入步骤(4)继续判断是否需要新增节点。
[0080] 步骤e中,所述编码运算规则具体为:首先对齐小数点,即找到整数部分的最后一个数字组,然后由最后一个数字组向前按组进行求和,小数部分由小数的第一个数字组向后按组进行求和,有进位时需处理进位。所述编码运算规则即浮点数编码的加减运算规则,浮点数按编码规则编码后加减运算与十进制小数的加减运算过程一样,首先对齐小数点,即找到整数部分的最后一个数字组,由最后一个数字组向前按组进行求和,小数部分由小数的第一个数字组向后按组进行求和,有进位时需处理进位。下面是浮点数编码后按组进行的加减运算规则。
[0081] (1)正数+正数
[0082] “正数+正数”的结果必然是正数,可能产生进位。例如a、b分别表示两个正浮点数编码对应的数字组,a和b是二位数的整数,真值和编码值如表1所示。
[0083] 表1“正数+正数”情况下的真值和编码值
[0084]  真值 编码值
正数 a a
正数 b b
[0085] 1)若(a+b)≥100,则说明该数字组需向前一个数字组进位,本数字组和的编码为(a+b)-100。前一个数字组的和应加上进位1。若最高数字组产生了进位,则产生一个新的数字组,编码值为1,标志位则需加1。
[0086] 2)若(a+b)<100,则说明该数字组的和小于100,不产生向前一个数字组的进位,本数字组和的编码值为(a+b)。
[0087] (2)负数+负数
[0088] “负数+负数”的结果必然是负数,可能产生进位。例如a、b分别表示两个负浮点数编码后的对应数字组,a和b是二位数的整数。真值和编码值如表2所示。
[0089] 表2“负数+负数”情况下的真值和编码值
[0090]  真值 编码值
负数 a 100-a
负数 b 100-b
[0091] 1)若(100-a)+(100-b)>100,则说明该数字组真值的和小于100,该位没有向高一位产生进位。本数字组和的编码值为(100-a)+(100-b)-100。
[0092] 2)若(100-a)+(100-b)≤100,则说明该数字组真值的和大于100,向前一个数字组产生进位。本数字值和的编码值为(100-a)+(100-b),前一个数字组相加的和再加99处理进位。若最高数字组产生了进位,则产生一个新的数字位,编码值为99,即真值为1,同时标志位减1。
[0093] (3)正数+负数
[0094] “正数+负数”的结果有三种情况,正数,负数或者0,不可能产生进位,但可能产生借位。例如a、b分别表示正、负浮点数编码对应的数字组,a和b是二位数的整数,则标志位、真值和编码值如表3所示。
[0095] 表3“正数+负数”情况下的标志位值、真值和编码值
[0096]  标志位值 真值 编码值
正数 f1 a a
负数 f2 b 100-b
[0097] (5)输出解密校正后的AST或MST的双链表二叉树。
[0098] 本发明与现有技术相比,具有如下优点和有益效果:
[0099] 1、本发明解决了云关系数据库浮点型的加密及加密数据上的求和计算能力,为云数据库的浮点型数据的安全性和高效查询提供了技术解决方法。
[0100] 2、与采用将浮点数转换为整数的方法比较,本发明采用的浮点数编码和运算规则即保持了浮点型数据加密后的计算能力,又保持了计算的准确性和精度。与其他加密数据库不支持浮点型相比,本发明采用的编码和数据结构支持关系型数据库中浮点型数据的加密存储和求和函数SUM。
[0101] 3、本发明适用于中小企业在云计算环境中存贮敏感数据,也适用于云服务商提供加密数据的服务。在云计算广阔前景下,本发明的产业化前景是非常好的。
[0102] 4、本发明的浮点数的编码和运算规则:将浮点数进行划分、符号表示、小数点位置及编码四个方面进行了定义,该定义隐藏了符号位和小数点位置;并给出了编码后浮点数的运算规则,使浮点属性值加密后能保持查询计算能力。数据库Oracle为提高计算的精度,也对浮点型采用了编码形式,同样隐藏了符号位和小数点位置,但Oracle公司仅提供了浮点格式的查询,未公布编码定义,也未给出编码运算规则。
[0103] 5、本发明的浮点数的“双链表二叉树”结构:为保持浮点属性的查询计算能力,本发明对浮点数的编码采用了“双链表二叉树”的数据结构,树的正向遍历和反向遍历为求和函数SUM提供了可操作性。
[0104] 6、本发明的求和算法:求和函数SUM算法通过三个过程完成。首先在云数据库上直接对加密后的属性值按正数和负数分类求和,未对属性值解密,保证了数据的安全性;其次由用户信任的数据库代理对云数据库上求和的结果进行解密和校正;最后为保证浮点计算精度,对解密后正数的和与负数的和采用浮点编码计算,解码后得到最终结果。

附图说明

[0105] 图1为本发明所述一种云关系数据库的浮点数据的加密及查询方法的流程图。
[0106] 图2为浮点数加密和SUM查询的体系结构的示意图。
[0107] 图3为云数据库UDF求浮点属性所有正数的和及所有负数的和的算法流程图。
[0108] 图4为数据库代理上的解密及校正算法流程图。
[0109] 图501、502为求浮点属性所有正数的和与所有负数的和的编码的流程图。

具体实施方式

[0110] 下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。
[0111] 如图1,一种云关系数据库的浮点数据的加密及查询方法,包含以下步骤:
[0112] 将浮点数据的密文插入到云数据库的加密方法包括A、B、C,其中:
[0113] A、用户输入包含浮点数据的插入语句,对浮点数进行编码,通过编码规则将浮点数的小数点位置和正负号隐藏起来;
[0114] B、利用同态加密算法Paillier对编码后的每一组分别进行加密;
[0115] C、将加密后的编码值存入云数据库;
[0116] 对存贮在云数据库的浮点数不解密的情况下进行SUM求和,对浮点数进行SUM查询的方法包括a-f,其中:
[0117] a、将存贮在云数据库的浮点数密文转换为双链表二叉树;
[0118] b、利用双链表二叉树分别对正浮点数、负浮点数求和得到X、Y,分开求和的原因是受到同态加密算法Paillier的限制和省去对借位的处理;
[0119] c、将云数据库所求得的X、Y的密文传送到用户客户端,再利用同态加密算法Paillier对X、Y进行解密;
[0120] d、解密后的二个和不符合我们的编码规则,采用双链表二叉树的结构对X、Y进行校正,使X、Y符合编码规则;
[0121] e、对校正后的X、Y按编码运算规则进行一次正、负数的求和运算,得到浮点数的SUM函数最终结果的编码值;
[0122] f、将SUM函数编码值按编码规则进行解码即为用户查询的结果。
[0123] 浮点数的加密和SUM查询实施过程的体系结构如图2所示。体系结构包括三个组成部分:用户、数据库代理和云数据库。用户是整个系统的使用者;数据库代理主要完成对插入到云数据库中的浮点数进行编码、加密;对用户的SUM查询结果进行解密、校正、计算最终结果等过程。云数据库端的用户自定义函数UDF(User Define Function)主要完成将浮点数密文转换为双链表二叉树及正、负浮点数密文的求和。
[0124] 1、对浮点数编码
[0125] 本发明将浮点数的编码分为标志位和数字组二部分:标志位/指数位F,[数字组1,数字组2,……,数字组N,……,数字组20]
[0126] (1)划分:按照浮点数的十进制小数形式以小数点为界,整数部分从小数点位置开始向最高位方向每二位为一组,最高位不够二位的补0;小数部分从小数点位置开始向最低位方向每二位为一组,最低位不够二位的补0。数字组的顺序与浮点数十进制数字顺序一致。
[0127] (2)符号位表示:设浮点数编码的标志位为F,标志位F大于193的为正数,标志位F小于62的为负数,标志位F为193或62时分别表示正零或负零。
[0128] (3)小数点位置:设浮点数编码的标志位为F,F-193+1为正数的整数部分的组数,62-F+1为负数的整数部分的组数,除掉整数部分的组数后剩余的组数为小数部分。
[0129] (4)数字组的编码:设划分的每一组的数字值为N,正数的编码为N,负数的编码为100-N。
[0130] 例:正数123.1201,按编码规则为194 01 23 12 01;
[0131] 负数-123.1201,按编码规则为061 99 77 88 99;
[0132] 为了计算的方便,本发明编码划分时每二位进行分组。按这种编码表示的浮点数精度可以达到38位,长度为0-22字节,取值范围为10E-130—10E126。
[0133] 2、对浮点数加密存储
[0134] 编码后的浮点数隐藏了符号位、小数点位置,并将减法转换成了加法。但浮点数加密之后,求和计算过程需要对加密后的数据比较大小,如判断是否有进位产生,即加密算法需具有保序性;但目前没有能同时满足保序和加法同态的加密算法。同态加密算法Paillier是具有良好同态性质的概率加密体制,在安全多方计算和密文数据库检索方面有广泛的应用。但同态加密算法Paillier不支持负数的加密,不支持减法同态,不支持保序。本发明的目的是要提供数据库的浮点数加密求和的查询能力,因此上述编码规则中将负数的编码也直接采用了真值,即在云数据库上不执行减法计算。
[0135] 数据库代理对浮点数编码形式标志位/指数位F,[数字组1,数字组2,……,数字组N,……,数字组20]的加密过程分为三步:
[0136] 1)由于标志位隐藏着浮点数符号和小数点位置信息,标志位F不进行加密。
[0137] 2)按数字组顺序每个数字组N用Paillier算法按正整数的形式进行加密,加密后每个节点的长度是不固定的。
[0138] 3)为方便计算,数字组加密后,在组之间设置分隔符。由标志位、组的加密串和分隔符组成的字符串存储在云关系数据库中。
[0139] 3、利用云数据库上的UDF函数完成浮点数密文的求和计算
[0140] 对存贮在云服务器上浮点型编码的加密值求出所有正数加密的和和所有负数加密的和;算法流程图如附图3所示,算法描述如下。
[0141] 输入:云服务器上加密的浮点属性值;
[0142] 输出:二个加密数字串,其中一个为所有正数的和的编码加密串,另一个为所有负数的和的编码加密串;
[0143] 开始:
[0144] 1)初始化二棵只有根结点的双链表二叉树,正数的和树AST根结点值为193,负数的和树MST根节点值为62;
[0145] 2)依次读取浮点属性的属性值,若所有属性值已读完,则转6),否则转下一步;
[0146] 3)按编码串的遍历方式恢复双链表二叉树T:标志位F为根结点;若标志位大于62则F-192为左子树节点数,否则62-F为左子树节点数,编码顺序为左子树的反向链表;剩余数字串为右子树,编码顺序为正向链表;恢复左子树的正向链表和右子树的反向链表;
[0147] 4)由标志位判断为正数,则
[0148] 4.1)若T根节点值大于AST根节点值,则AST根节点值改为T根节点值;
[0149] 4.2)正向遍历AST和T的右子树,若AST和T的节点都不为空则转4.2.1),否则转4.2.3);
[0150] 4.2.1)AST和T相同层的节点值相加,和为AST当前节点的值;
[0151] 4.2.2)访问AST和T的下一个节点,转4.2);
[0152] 4.2.3)若T的节点为空,则转4.3),否则转4.2.4);
[0153] 4.2.4)新建AST的叶子节点,将T当前节点值复制到AST的叶子节点;
[0154] 4.2.5)访问T的下一个节点,转4.2.3);
[0155] 4.3)正向遍历AST和T的左子树,若AST和T的节点都不为空则转4.3.1),否则转4.3.3);
[0156] 4.3.1)AST和T相同层的节点值相加,和为AST当前节点的值;
[0157] 4.3.2)访问AST和T的下一个节点,转4.3);
[0158] 4.3.3)若T的节点为空,则转步骤2),否则转4.3.4);
[0159] 4.3.4)新建AST的叶子节点,将T当前节点值复制到AST的叶子节点;
[0160] 4.3.5)访问T的下一个节点,转4.3.3);
[0161] 5)由标志位判断为负数,则
[0162] 5.1)若T根节点值小于MST根节点值,则MST根节点值改为T根节点值;
[0163] 5.2)正向遍历MST和T的右子树,若MST和T的节点都不为空则转5.2.1),否则转5.2.3);
[0164] 5.2.1)MST和T相同层的节点值相加,和为MST当前节点的值;
[0165] 5.2.2)访问MST和T的下一个节点,转5.2);
[0166] 5.2.3)若T的节点为空,则转5.3),否则转5.2.4);
[0167] 5.2.4)新建MST的叶子节点,将T当前节点值复制到MST的叶子节点;
[0168] 5.2.5)访问T的下一个节点,转5.2.3);
[0169] 5.3)正向遍历MST和T的左子树,若MST和T的节点都不为空则转5.3.1),否则转5.3.3);
[0170] 5.3.1)MST和T相同层的节点值相加,和为MST当前节点的值;
[0171] 5.3.2)访问MST和T的下一个节点,转5.3);
[0172] 5.3.3)若T的节点为空,则转2),否则转5.3.4);
[0173] 5.3.4)新建MST的叶子节点,将T当前节点值复制到MST的叶子节点;
[0174] 5.3.5)访问T的下一个节点,转5.3.3);
[0175] 6)输出二个数字串:按AST和MST的根节点、左子树的反向遍历、右子树的正向遍历及分隔符组成的数字串;
[0176] 上述算法描述中第4)步主要按双链表二叉树求所有正数的和,第5)步主要按双链表二叉树求所有负数的和,这二步过程是类似的,仅在和树的根节点值的处理不一样。
[0177] 4、数据库代理对云数据库UDF的求和值进行解密及校正
[0178] 将云服务器上计算输出的AST和MST的数字串传输到数据库代理,利用Paillier算法对编码中的每个数字组进行解密,解密后进行校正。解密及校正算法流程图如附图4所示,算法描述如下。
[0179] 输入:云数据库中计算输出的正数和AST或负数和MST的数字串;
[0180] 输出:正数和AST或负数和MST解密校正后的双链表二叉树;
[0181] 开始:
[0182] 1)对正数和AST或负数和MST的数字串除标志位外,对分隔符间隔开的每个数字串用Paillier算法进行解密;
[0183] 2)恢复AST或MST的双链表二叉树T:标志位为根节点;由标志位确定左子树的节点数,按节点数将分隔符间隔的数字串顺序建立左子树的反向链表;剩余的数字串按顺序建立右子树的正向链表;恢复左子树的正向链表和右子树的反向链表;
[0184] 3)初始化进位变量C为0;
[0185] 4)若树T的右子树反向链表当前节点为空节点则转5),否则转4.1);
[0186] 4.1)将当前节点值保存在变量N,修改当前节点值为(N+C)mod 100,修改进位变量C=(N+C)/100;
[0187] 4.2)继续访问T右子树反向链表的下一个节点,转4);
[0188] 5)若树T的左子树正向链表当前节点为空节点则转6),否则转5.1);
[0189] 5.1)将当前节点值保存在变量N,修改当前节点值为(N+C)mod 100,修改进位变量C=(N+C)/100;
[0190] 5.2)继续访问T左子树正向链表的下一个节点,转5);
[0191] 6)若进位变量C为0则转7),否则转6.1);
[0192] 6.1)设当前节点为P,新建节点Q,C mod 100为新建节点Q的值,修改进位变量C=C/100,树T的左子树反向链表根节点指向Q,Q指向P;正向链表P指向Q,Q指向空指针;
[0193] 6.2)转6)继续判断是否需要新增节点;
[0194] 7)输出解密校正后的AST或MST的双链表二叉树;
[0195] 上述算法步骤4)到6)主要对数字组的总和大于99的值进行校正。
[0196] 5、输出用户SUM查询的最终结果
[0197] 对浮点属性所有正数的和与所有负数的和再次进行求和,结果即为浮点属性求和函数SUM的值。首先对MST的双链表二叉树按编码规则修改每个节点值,然后按AST和MST的双链表二叉树进行求和,解码校正后输出求和函数SUM的值。这一步没有对正数和或者负数和解码后直接相加是为了保证浮点型计算的精度。算法流程如附图501、502所示,算法描述如下。
[0198] 输入:数据库代理解密校正后的双链表二叉树AST和双链表二叉树MST;
[0199] 输出:浮点属性的求和函数SUM的输出值(编码形式);
[0200] 开始:
[0201] 1)遍历双链表二叉树MST,将每个节点的值N按负数的编码规则改为编码值100-N;
[0202] 2)初始化和树ST,建立只有根节点的双链表二叉树,根节点初始值为0;
[0203] 3)对AST,MST右子树正向遍历,若AST和MST中短的右子树节点为空节点则转4),否则转3.1);
[0204] 3.1)设ST当前叶子节点为P,ST右子树新建叶子节点Q,正向链表P指向Q,反向链表根节点指向Q,Q指向P。AST,MST同一层的节点值相加,和为Q节点的值;
[0205] 3.2)取AST,MST的下一个节点,转3);
[0206] 4)若AST和MST中长的右分支为空节点则转5),否则转4.1);
[0207] 4.1)设ST当前叶子节点为P,ST右子树新建叶子节点Q,正向链表P指向Q,反向链表根节点指向Q,Q指向P。将AST和MST长分支中的节点值复制给节点Q;
[0208] 4.2)取AST或MST的下一个节点,转4);
[0209] 5)对AST,MST左子树正向遍历,若AST和MST中短的左子树节点为空节点则转6),否则转5.1);
[0210] 5.1)设ST当前叶子节点为P,ST左子树新建叶子节点Q,正向链表P指向Q,反向链表根节点指向Q,Q指向P。AST,MST同一层的节点值相加,和为Q节点的值;
[0211] 5.2)取AST,MST的下一个节点,转5);
[0212] 6)若AST和MST中长的左分支为空节点则转7),否则转6.1);
[0213] 6.1)设ST当前叶子节点为P,ST右子树新建叶子节点Q,正向链表P指向Q,反向链表根节点指向Q,Q指向P。将AST和MST长分支中的节点值复制给节点Q;
[0214] 6.2)取AST或MST的下一个节点,转6);
[0215] 7)初始化进位变量C为0,判断AST和MST根节点的和,若和大于255转9),若和小于255则转10),否则转7.1);
[0216] 7.1)对和树ST的左子树反向遍历,右子树正向遍历,找到第一个值不为100的节点;
[0217] 7.2)若节点值大于100转8),否则转11);
[0218] 8)将和树ST根节点的值修改为AST根节点的值;
[0219] 9)对ST的右子树反向遍历,若是空节点转10),否则转9.1);
[0220] 9.1)将ST当前节点值保存为N,若N+C≥100则将ST当前节点值改为(N+C)-100,进位变量C修改为0;否则将进位变量C修改为99;
[0221] 9.2)取ST的下一个节点,转9);
[0222] 10)对ST的左子树正向遍历,若是空节点转14),否则转10.1);
[0223] 10.1)将ST当前节点值保存为N,若N+C≥100则将ST当前节点值改为(N+C)-100,进位变量C修改为0;否则将进位变量C修改为99;
[0224] 10.2)取ST的下一个节点,转10);
[0225] 11)将和树ST根节点的值修改为MST根节点的值;
[0226] 12)对ST的右子树反向遍历,若是空节点转13),否则转12.1);
[0227] 12.1)将ST当前节点值保存为N,若N+C≥100则将ST当前节点值改为(N+C)-100,进位变量C修改为99;否则将进位变量C修改为0;
[0228] 12.2)取ST的下一个节点,转12);
[0229] 13)对ST的左子树正向遍历,若是空节点转14),否则转13.1);
[0230] 13.1)将ST当前节点值保存为N,若N+C≥100则将ST当前节点值改为(N+C)-100,进位变量C修改为99;否则将进位变量C修改为0;
[0231] 13.2)取ST的下一个节点,转13);
[0232] 14)输出和树ST按根节点、左子树反向遍历、右子树正向遍历得到求和函数SUM的输出,其值为编码形式;
[0233] 上述算法描述从第3)到6)求出了AST和MST对应节点的和,存到和树ST;若求和函数SUM的和是正数,则按步骤9)和10)校正;若求和函数SUM的和是负数,则按步骤12)和13)校正。
[0234] 上述算法得到求和函数SUM值的编码形式后再进行解码。设数字组N在编码中的顺序为k,顺序编号从1开始,则解码式为
[0235] ∑N×100(F-192-K)
[0236] 其中F为标志位。解码后的结果可能在最高位和最低位出现多余的0,这部分无意义的0可直接去掉不影响结果。
[0237] 上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。