本發(fā)明涉及計算機(jī)學(xué)科數(shù)據(jù)庫領(lǐng)域,特別涉及一種云關(guān)系數(shù)據(jù)庫的浮點數(shù)據(jù)的加密及查詢方法。
背景技術(shù):
:云計算提供了大容量的、低成本的數(shù)據(jù)存儲和數(shù)據(jù)即服務(wù)DaaS(DatabaseasaService),越來越多的中小企業(yè)也為了降低投入成本和維護(hù)代價,選擇了云計算的數(shù)據(jù)即服務(wù),將原有的系統(tǒng)移植到云中。隨之而來的就是數(shù)據(jù)的安全性,將敏感數(shù)據(jù)加密存貯是解決數(shù)據(jù)安全性的首要手段,如何保證數(shù)據(jù)安全性的同時又能維持?jǐn)?shù)據(jù)的高效查詢成為了數(shù)據(jù)即服務(wù)的關(guān)鍵技術(shù)問題。針對云中的關(guān)系型數(shù)據(jù)庫,麻省理工學(xué)院開發(fā)了一個中間件CryptDB,廣泛應(yīng)用在Google、Amazon等云服務(wù)商。該中間件提供了對整型和字符型二種數(shù)據(jù)類型的加密和加密數(shù)據(jù)上的查詢計算,但對浮點型數(shù)據(jù)的加密及加密數(shù)據(jù)的查詢計算還未解決。因此,針對浮點型數(shù)據(jù),有必要提供一種新的加密及查詢方法來滿足需求。技術(shù)實現(xiàn)要素:本發(fā)明的目的在于克服現(xiàn)有技術(shù)的缺點與不足,提供一種云關(guān)系數(shù)據(jù)庫的浮點數(shù)據(jù)的加密及查詢方法。本發(fā)明的目的通過以下的技術(shù)方案實現(xiàn):一種云關(guān)系數(shù)據(jù)庫的浮點數(shù)據(jù)的加密及查詢方法,包含以下步驟:將浮點數(shù)據(jù)的密文插入到云數(shù)據(jù)庫:A、用戶輸入包含浮點數(shù)據(jù)的插入語句,對浮點數(shù)進(jìn)行編碼,通過編碼規(guī)則將浮點數(shù)的小數(shù)點位置和正負(fù)號隱藏起來;B、利用同態(tài)加密算法Paillier對編碼后的每一組分別進(jìn)行加密;C、將加密后的編碼值存入云數(shù)據(jù)庫;對用戶對浮點數(shù)的SUM查詢:通過對存貯在云數(shù)據(jù)庫的浮點數(shù)不解密的情況下進(jìn)行SUM求和,具體步驟為:a、將存貯在云數(shù)據(jù)庫的浮點數(shù)密文轉(zhuǎn)換為雙鏈表二叉樹;b、利用雙鏈表二叉樹分別對正浮點數(shù)、負(fù)浮點數(shù)求和得到X、Y,分開求和的原因是受到同態(tài)加密算法Paillier的限制和省去對借位的處理;c、將云數(shù)據(jù)庫所求得的X、Y的密文傳送到用戶客戶端,再利用同態(tài)加密算法Paillier對X、Y進(jìn)行解密;d、解密后的二個和不符合我們的編碼規(guī)則,采用雙鏈表二叉樹的結(jié)構(gòu)對X、Y進(jìn)行校正,使X、Y符合編碼規(guī)則;e、對校正后的X、Y按編碼運算規(guī)則進(jìn)行一次正、負(fù)數(shù)的求和運算,得到浮點數(shù)的SUM函數(shù)最終結(jié)果的編碼值;f、將SUM函數(shù)編碼值按編碼規(guī)則進(jìn)行解碼即為用戶查詢的結(jié)果。在整個查詢計算過程中云數(shù)據(jù)庫的數(shù)據(jù)始終是密文,保證了存貯在云數(shù)據(jù)庫數(shù)據(jù)的安全性。步驟A中,所述編碼規(guī)則如下:將浮點數(shù)的編碼分為標(biāo)志位和數(shù)字組二部分:標(biāo)志位/指數(shù)位F,[數(shù)字組1,數(shù)字組2,……,數(shù)字組N,……,數(shù)字組20];(1)劃分:按照浮點數(shù)的十進(jìn)制小數(shù)形式以小數(shù)點為界,整數(shù)部分從小數(shù)點位置開始向最高位方向每二位為一組,最高位不夠二位的補0;小數(shù)部分從小數(shù)點位置開始向最低位方向每二位為一組,最低位不夠二位的補0;數(shù)字組的順序與浮點數(shù)十進(jìn)制數(shù)字順序一致;(2)符號位表示:設(shè)浮點數(shù)編碼的標(biāo)志位為F,標(biāo)志位F大于193的為正數(shù),標(biāo)志位F小于62的為負(fù)數(shù),標(biāo)志位F為193或62時分別表示正零或負(fù)零;(3)小數(shù)點位置:設(shè)浮點數(shù)編碼的標(biāo)志位為F,F(xiàn)-193+1為正數(shù)的整數(shù)部分的組數(shù),62-F+1為負(fù)數(shù)的整數(shù)部分的組數(shù),除掉整數(shù)部分的組數(shù)后剩余的組數(shù)為小數(shù)部分;(4)數(shù)字組的編碼:設(shè)劃分的每一組的數(shù)字值為N,正數(shù)的編碼為N,負(fù)數(shù)的編碼為100-N。所述步驟B具體為:1)由于標(biāo)志位隱藏著浮點數(shù)符號和小數(shù)點位置信息,標(biāo)志位F不進(jìn)行加密;2)按數(shù)字組順序,每個數(shù)字組N用Paillier算法按正整數(shù)的形式進(jìn)行加密,加密后每個節(jié)點的長度是不固定。所述步驟C具體為:為方便計算,數(shù)字組加密后,在組之間設(shè)置分隔符;由標(biāo)志位、組的加密串和分隔符組成的字符串存儲在云關(guān)系數(shù)據(jù)庫中。所述步驟b具體為:1)初始化二棵只有根結(jié)點的雙鏈表二叉樹,正數(shù)的和樹AST根結(jié)點值為193,負(fù)數(shù)的和樹MST根節(jié)點值為62;2)依次讀取浮點屬性的屬性值,若所有屬性值已讀完,則進(jìn)入步驟6),否則進(jìn)入步驟3);3)按編碼串的遍歷方式恢復(fù)雙鏈表二叉樹T:標(biāo)志位F為根結(jié)點;若標(biāo)志位大于62則F-192為左子樹節(jié)點數(shù),否則62-F為左子樹節(jié)點數(shù),編碼順序為左了樹的反向鏈表;剩余數(shù)字串為右子樹,編碼順序為正向鏈表;恢復(fù)左子樹的正向鏈表和右子樹的反向鏈表;4)由標(biāo)志位判斷為正數(shù),則4.1)若AST根節(jié)點值大于T根節(jié)點值,則AST根節(jié)點值改為T根節(jié)點值,否則進(jìn)入步驟4.2);4.2)正向遍歷AST和T的右子樹,若AST和T的節(jié)點都不為空則進(jìn)入步驟4.2.1),否則進(jìn)入步驟4.2.3):4.2.1)AST和T相同層的節(jié)點值相加,和為AST當(dāng)前節(jié)點的值;4.2.2)訪問AST和T的下一個節(jié)點,進(jìn)入步驟4.2);4.2.3)若T的節(jié)點為空,則進(jìn)入步驟4.3),否則進(jìn)入步驟4.2.4);4.2.4)新建AST的葉子節(jié)點,將T當(dāng)前節(jié)點值復(fù)制到AST的葉子節(jié)點;4.2.5)訪問T的下一個節(jié)點,進(jìn)入步驟4.2.3);4.3)正向遍歷AST和T的左子樹,若AST和T的節(jié)點都不為空則進(jìn)入步驟4.3.1),否則進(jìn)入步驟4.3.3):4.3.1)AST和T相同層的節(jié)點值相加,和為AST當(dāng)前節(jié)點的值;4.3.2)訪問AST和T的下一個節(jié)點,進(jìn)入步驟4.3);4.3.3)若T的節(jié)點為空,則進(jìn)入步驟2),否則進(jìn)入步驟4.3.4);4.3.4)新建AST的葉子節(jié)點,將T當(dāng)前節(jié)點值復(fù)制到AST的葉子節(jié)點;4.3.5)訪問T的下一個節(jié)點,進(jìn)入步驟4.3.3);5)由標(biāo)志位判斷為負(fù)數(shù),則5.1)若MST根節(jié)點值小于T根節(jié)點值,則MST根節(jié)點值改為T根節(jié)點值,否則進(jìn)入步驟5.2);5.2)正向遍歷AST和T的右子樹,若MST和T的節(jié)點都不為空則進(jìn)入步驟5.2.1),否則進(jìn)入步驟5.2.3);5.2.1)MST和T相同層的節(jié)點值相加,和為MST當(dāng)前節(jié)點的值;5.2.2)訪問MST和T的下一個節(jié)點,進(jìn)入步驟5.2);5.2.3)若T的節(jié)點為空,則進(jìn)入步驟5.3),否則進(jìn)入步驟5.2.4);5.2.4)新建MST的葉子節(jié)點,將T當(dāng)前節(jié)點值復(fù)制到MST的葉子節(jié)點;5.2.5)訪問T的下一個節(jié)點,進(jìn)入步驟5.2.3);5.3)正向遍歷MST和T的左子樹,若MST和T的節(jié)點都不為空則進(jìn)入步驟5.3.1),否則進(jìn)入步驟4.3.3);5.3.1)MST和T相同層的節(jié)點值相加,和為MST當(dāng)前節(jié)點的值;5.3.2)訪問MST和T的下一個節(jié)點,進(jìn)入步驟5.3);5.3.3)若T的節(jié)點為空,則進(jìn)入步驟2),否則進(jìn)入步驟5.3.4);5.3.4)新建MST的葉子節(jié)點,將T當(dāng)前節(jié)點值復(fù)制到MST的葉子節(jié)點;5.3.5)訪問T的下一個節(jié)點,進(jìn)入步驟5.3.3);6)輸出二個數(shù)字串:按AST和MST的根節(jié)點、左子樹的反向遍歷、右子樹的正向遍歷及分隔符組成的數(shù)字串。上述算法描述中步驟4)主要按雙鏈表二叉樹求所有正數(shù)的和,步驟5)主要按雙鏈表二叉樹求所有負(fù)數(shù)的和,這二步過程是類似的,僅在和樹的根節(jié)點值的處理不一樣。所述步驟c具體為:對正數(shù)和AST或負(fù)數(shù)和MST的數(shù)字串,除標(biāo)志位外,對分隔符間隔開的每個數(shù)字串用Paillier算法進(jìn)行解密;恢復(fù)AST或MST的雙鏈表二叉樹T:標(biāo)志位為根節(jié)點;由標(biāo)志位確定左子樹的節(jié)點數(shù),按節(jié)點數(shù)將分隔符間隔的數(shù)字串順序建立左子樹的反向鏈表;剩余的數(shù)字串按順序建立右子樹的正向鏈表;恢復(fù)左子樹的正向鏈表和右子樹的反向鏈表。所述步驟d具體為:(1)初始化進(jìn)位變量C為0;(2)若樹T的右子樹反向鏈表當(dāng)前節(jié)點為空節(jié)點則重復(fù)步驟(2),否則轉(zhuǎn)步驟(2.1):(2.1)將當(dāng)前節(jié)點值保存在變量N,修改當(dāng)前節(jié)點值為(N+C)mod100,修改進(jìn)位變量C=(N+C)/100;(2.2)繼續(xù)訪問T右子樹反向鏈表的下一個節(jié)點,重復(fù)步驟(2);(3)若樹T的左子樹正向鏈表當(dāng)前節(jié)點為空節(jié)點則進(jìn)入步驟(4),否則進(jìn)入步驟(3.1):(3.1)將當(dāng)前節(jié)點值保存在變量N,修改當(dāng)前節(jié)點值為(N+C)mod100,修改進(jìn)位變量C=(N+C)/100;(3.2)繼續(xù)訪問T右子樹反向鏈表的下一個節(jié)點,進(jìn)入步驟(2);(4)若進(jìn)位變量C為0則進(jìn)入步驟(5),否則進(jìn)入步驟(4.1):(4.1)設(shè)當(dāng)前節(jié)點為P,新建節(jié)點Q,Cmod100為新建節(jié)點Q的值,修改進(jìn)位變量C=C/100,樹T的左子樹反向鏈表根節(jié)點指向Q,Q指向P;正向鏈表P指向Q,Q指向空指針;(4.2)進(jìn)入步驟(4)繼續(xù)判斷是否需要新增節(jié)點。步驟e中,所述編碼運算規(guī)則具體為:首先對齊小數(shù)點,即找到整數(shù)部分的最后一個數(shù)字組,然后由最后一個數(shù)字組向前按組進(jìn)行求和,小數(shù)部分由小數(shù)的第一個數(shù)字組向后按組進(jìn)行求和,有進(jìn)位時需處理進(jìn)位。所述編碼運算規(guī)則即浮點數(shù)編碼的加減運算規(guī)則,浮點數(shù)按編碼規(guī)則編碼后加減運算與十進(jìn)制小數(shù)的加減運算過程一樣,首先對齊小數(shù)點,即找到整數(shù)部分的最后一個數(shù)字組,由最后一個數(shù)字組向前按組進(jìn)行求和,小數(shù)部分由小數(shù)的第一個數(shù)字組向后按組進(jìn)行求和,有進(jìn)位時需處理進(jìn)位。下面是浮點數(shù)編碼后按組進(jìn)行的加減運算規(guī)則。(1)正數(shù)+正數(shù)“正數(shù)+正數(shù)”的結(jié)果必然是正數(shù),可能產(chǎn)生進(jìn)位。例如a、b分別表示兩個正浮點數(shù)編碼對應(yīng)的數(shù)字組,a和b是二位數(shù)的整數(shù),真值和編碼值如表1所示。表1“正數(shù)+正數(shù)”情況下的真值和編碼值真值編碼值正數(shù)aa正數(shù)bb1)若(a+b)≥100,則說明該數(shù)字組需向前一個數(shù)字組進(jìn)位,本數(shù)字組和的編碼為(a+b)-100。前一個數(shù)字組的和應(yīng)加上進(jìn)位1。若最高數(shù)字組產(chǎn)生了進(jìn)位,則產(chǎn)生一個新的數(shù)字組,編碼值為1,標(biāo)志位則需加1。2)若(a+b)<100,則說明該數(shù)字組的和小于100,不產(chǎn)生向前一個數(shù)字組的進(jìn)位,本數(shù)字組和的編碼值為(a+b)。(2)負(fù)數(shù)+負(fù)數(shù)“負(fù)數(shù)+負(fù)數(shù)”的結(jié)果必然是負(fù)數(shù),可能產(chǎn)生進(jìn)位。例如a、b分別表示兩個負(fù)浮點數(shù)編碼后的對應(yīng)數(shù)字組,a和b是二位數(shù)的整數(shù)。真值和編碼值如表2所示。表2“負(fù)數(shù)+負(fù)數(shù)”情況下的真值和編碼值真值編碼值負(fù)數(shù)a100-a負(fù)數(shù)b100-b1)若(100-a)+(100-b)>100,則說明該數(shù)字組真值的和小于100,該位沒有向高一位產(chǎn)生進(jìn)位。本數(shù)字組和的編碼值為(100-a)+(100-b)-100。2)若(100-a)+(100-b)≤100,則說明該數(shù)字組真值的和大于100,向前一個數(shù)字組產(chǎn)生進(jìn)位。本數(shù)字值和的編碼值為(100-a)+(100-b),前一個數(shù)字組相加的和再加99處理進(jìn)位。若最高數(shù)字組產(chǎn)生了進(jìn)位,則產(chǎn)生一個新的數(shù)字位,編碼值為99,即真值為1,同時標(biāo)志位減1。(3)正數(shù)+負(fù)數(shù)“正數(shù)+負(fù)數(shù)”的結(jié)果有三種情況,正數(shù),負(fù)數(shù)或者0,不可能產(chǎn)生進(jìn)位,但可能產(chǎn)生借位。例如a、b分別表示正、負(fù)浮點數(shù)編碼對應(yīng)的數(shù)字組,a和b是二位數(shù)的整數(shù),則標(biāo)志位、真值和編碼值如表3所示。表3“正數(shù)+負(fù)數(shù)”情況下的標(biāo)志位值、真值和編碼值標(biāo)志位值真值編碼值正數(shù)f1aa負(fù)數(shù)f2b100-b本發(fā)明與現(xiàn)有技術(shù)相比,具有如下優(yōu)點和有益效果:1、本發(fā)明解決了云關(guān)系數(shù)據(jù)庫浮點型的加密及加密數(shù)據(jù)上的求和計算能力,為云數(shù)據(jù)庫的浮點型數(shù)據(jù)的安全性和高效查詢提供了技術(shù)解決方法。2、與采用將浮點數(shù)轉(zhuǎn)換為整數(shù)的方法比較,本發(fā)明采用的浮點數(shù)編碼和運算規(guī)則即保持了浮點型數(shù)據(jù)加密后的計算能力,又保持了計算的準(zhǔn)確性和精度。與其他加密數(shù)據(jù)庫不支持浮點型相比,本發(fā)明采用的編碼和數(shù)據(jù)結(jié)構(gòu)支持關(guān)系型數(shù)據(jù)庫中浮點型數(shù)據(jù)的加密存儲和求和函數(shù)SUM。3、本發(fā)明適用于中小企業(yè)在云計算環(huán)境中存貯敏感數(shù)據(jù),也適用于云服務(wù)商提供加密數(shù)據(jù)的服務(wù)。在云計算廣闊前景下,本發(fā)明的產(chǎn)業(yè)化前景是非常好的。4、本發(fā)明的浮點數(shù)的編碼和運算規(guī)則:將浮點數(shù)進(jìn)行劃分、符號表示、小數(shù)點位置及編碼四個方面進(jìn)行了定義,該定義隱藏了符號位和小數(shù)點位置;并給出了編碼后浮點數(shù)的運算規(guī)則,使浮點屬性值加密后能保持查詢計算能力。數(shù)據(jù)庫Oracle為提高計算的精度,也對浮點型采用了編碼形式,同樣隱藏了符號位和小數(shù)點位置,但Oracle公司僅提供了浮點格式的查詢,未公布編碼定義,也未給出編碼運算規(guī)則。5、本發(fā)明的浮點數(shù)的“雙鏈表二叉樹”結(jié)構(gòu):為保持浮點屬性的查詢計算能力,本發(fā)明對浮點數(shù)的編碼采用了“雙鏈表二叉樹”的數(shù)據(jù)結(jié)構(gòu),樹的正向遍歷和反向遍歷為求和函數(shù)SUM提供了可操作性。6、本發(fā)明的求和算法:求和函數(shù)SUM算法通過三個過程完成。首先在云數(shù)據(jù)庫上直接對加密后的屬性值按正數(shù)和負(fù)數(shù)分類求和,未對屬性值解密,保證了數(shù)據(jù)的安全性;其次由用戶信任的數(shù)據(jù)庫代理對云數(shù)據(jù)庫上求和的結(jié)果進(jìn)行解密和校正;最后為保證浮點計算精度,對解密后正數(shù)的和與負(fù)數(shù)的和采用浮點編碼計算,解碼后得到最終結(jié)果。附圖說明圖1為本發(fā)明所述一種云關(guān)系數(shù)據(jù)庫的浮點數(shù)據(jù)的加密及查詢方法的流程圖。圖2為浮點數(shù)加密和SUM查詢的體系結(jié)構(gòu)的示意圖。圖3為云數(shù)據(jù)庫UDF求浮點屬性所有正數(shù)的和及所有負(fù)數(shù)的和的算法流程圖。圖4為數(shù)據(jù)庫代理上的解密及校正算法流程圖。圖5-1、5-2為求浮點屬性所有正數(shù)的和與所有負(fù)數(shù)的和的編碼的流程圖。具體實施方式下面結(jié)合實施例及附圖對本發(fā)明作進(jìn)一步詳細(xì)的描述,但本發(fā)明的實施方式不限于此。如圖1,一種云關(guān)系數(shù)據(jù)庫的浮點數(shù)據(jù)的加密及查詢方法,包含以下步驟:將浮點數(shù)據(jù)的密文插入到云數(shù)據(jù)庫:A、用戶輸入包含浮點數(shù)據(jù)的插入語句,對浮點數(shù)進(jìn)行編碼,通過編碼規(guī)則將浮點數(shù)的小數(shù)點位置和正負(fù)號隱藏起來;B、利用同態(tài)加密算法Paillier對編碼后的每一組分別進(jìn)行加密;C、將加密后的編碼值存入云數(shù)據(jù)庫;對用戶對浮點數(shù)的SUM查詢:通過對存貯在云數(shù)據(jù)庫的浮點數(shù)不解密的情況下進(jìn)行SUM求和,具體步驟為:a、將存貯在云數(shù)據(jù)庫的浮點數(shù)密文轉(zhuǎn)換為雙鏈表二叉樹;b、利用雙鏈表二叉樹分別對正浮點數(shù)、負(fù)浮點數(shù)求和得到X、Y,分開求和的原因是受到同態(tài)加密算法Paillier的限制和省去對借位的處理;c、將云數(shù)據(jù)庫所求得的X、Y的密文傳送到用戶客戶端,再利用同態(tài)加密算法Paillier對X、Y進(jìn)行解密;d、解密后的二個和不符合我們的編碼規(guī)則,采用雙鏈表二叉樹的結(jié)構(gòu)對X、Y進(jìn)行校正,使X、Y符合編碼規(guī)則;e、對校正后的X、Y按編碼運算規(guī)則進(jìn)行一次正、負(fù)數(shù)的求和運算,得到浮點數(shù)的SUM函數(shù)最終結(jié)果的編碼值;f、將SUM函數(shù)編碼值按編碼規(guī)則進(jìn)行解碼即為用戶查詢的結(jié)果。浮點數(shù)的加密和SUM查詢實施過程的體系結(jié)構(gòu)如圖2所示。體系結(jié)構(gòu)包括三個組成部分:用戶、數(shù)據(jù)庫代理和云數(shù)據(jù)庫。用戶是整個系統(tǒng)的使用者;數(shù)據(jù)庫代理主要完成對插入到云數(shù)據(jù)庫中的浮點數(shù)進(jìn)行編碼、加密;對用戶的SUM查詢結(jié)果進(jìn)行解密、校正、計算最終結(jié)果等過程。云數(shù)據(jù)庫端的用戶自定義函數(shù)UDF(UserDefineFunction)主要完成將浮點數(shù)密文轉(zhuǎn)換為雙鏈表二叉樹及正、負(fù)浮點數(shù)密文的求和。1、對浮點數(shù)編碼本發(fā)明將浮點數(shù)的編碼分為標(biāo)志位和數(shù)字組二部分:標(biāo)志位/指數(shù)位F,[數(shù)字組1,數(shù)字組2,……,數(shù)字組N,……,數(shù)字組20](1)劃分:按照浮點數(shù)的十進(jìn)制小數(shù)形式以小數(shù)點為界,整數(shù)部分從小數(shù)點位置開始向最高位方向每二位為一組,最高位不夠二位的補0;小數(shù)部分從小數(shù)點位置開始向最低位方向每二位為一組,最低位不夠二位的補0。數(shù)字組的順序與浮點數(shù)十進(jìn)制數(shù)字順序一致。(2)符號位表示:設(shè)浮點數(shù)編碼的標(biāo)志位為F,標(biāo)志位F大于193的為正數(shù),標(biāo)志位F小于62的為負(fù)數(shù),標(biāo)志位F為193或62時分別表示正零或負(fù)零。(3)小數(shù)點位置:設(shè)浮點數(shù)編碼的標(biāo)志位為F,F(xiàn)-193+1為正數(shù)的整數(shù)部分的組數(shù),62-F+1為負(fù)數(shù)的整數(shù)部分的組數(shù),除掉整數(shù)部分的組數(shù)后剩余的組數(shù)為小數(shù)部分。(4)數(shù)字組的編碼:設(shè)劃分的每一組的數(shù)字值為N,正數(shù)的編碼為N,負(fù)數(shù)的編碼為100-N。例:正數(shù)123.1201,按編碼規(guī)則為19401231201;負(fù)數(shù)-123.1201,按編碼規(guī)則為06199778899;為了計算的方便,本發(fā)明編碼劃分時每二位進(jìn)行分組。按這種編碼表示的浮點數(shù)精度可以達(dá)到38位,長度為0-22字節(jié),取值范圍為10E-130—10E126。2、對浮點數(shù)加密存儲編碼后的浮點數(shù)隱藏了符號位、小數(shù)點位置,并將減法轉(zhuǎn)換成了加法。但浮點數(shù)加密之后,求和計算過程需要對加密后的數(shù)據(jù)比較大小,如判斷是否有進(jìn)位產(chǎn)生,即加密算法需具有保序性;但目前沒有能同時滿足保序和加法同態(tài)的加密算法。同態(tài)加密算法Paillier是具有良好同態(tài)性質(zhì)的概率加密體制,在安全多方計算和密文數(shù)據(jù)庫檢索方面有廣泛的應(yīng)用。但同態(tài)加密算法Paillier不支持負(fù)數(shù)的加密,不支持減法同態(tài),不支持保序。本發(fā)明的目的是要提供數(shù)據(jù)庫的浮點數(shù)加密求和的查詢能力,因此上述編碼規(guī)則中將負(fù)數(shù)的編碼也直接采用了真值,即在云數(shù)據(jù)庫上不執(zhí)行減法計算。數(shù)據(jù)庫代理對浮點數(shù)編碼形式標(biāo)志位/指數(shù)位F,[數(shù)字組1,數(shù)字組2,……,數(shù)字組N,……,數(shù)字組20]的加密過程分為三步:1)由于標(biāo)志位隱藏著浮點數(shù)符號和小數(shù)點位置信息,標(biāo)志位F不進(jìn)行加密。2)按數(shù)字組順序每個數(shù)字組N用Paillier算法按正整數(shù)的形式進(jìn)行加密,加密后每個節(jié)點的長度是不固定的。3)為方便計算,數(shù)字組加密后,在組之間設(shè)置分隔符。由標(biāo)志位、組的加密串和分隔符組成的字符串存儲在云關(guān)系數(shù)據(jù)庫中。3、利用云數(shù)據(jù)庫上的UDF函數(shù)完成浮點數(shù)密文的求和計算對存貯在云服務(wù)器上浮點型編碼的加密值求出所有正數(shù)加密的和和所有負(fù)數(shù)加密的和;算法流程圖如附圖3所示,算法描述如下。輸入:云服務(wù)器上加密的浮點屬性值;輸出:二個加密數(shù)字串,其中一個為所有正數(shù)的和的編碼加密串,另一個為所有負(fù)數(shù)的和的編碼加密串;開始:初始化二棵只有根結(jié)點的雙鏈表二叉樹,正數(shù)的和樹AST根結(jié)點值為193,負(fù)數(shù)的和樹MST根節(jié)點值為62;依次讀取浮點屬性的屬性值,若所有屬性值已讀完,則轉(zhuǎn)6),否則轉(zhuǎn)步驟3);按編碼串的遍歷方式恢復(fù)雙鏈表二叉樹T:標(biāo)志位F為根結(jié)點;若標(biāo)志位大于62則F-192為左子樹節(jié)點數(shù),否則62-F為左子樹節(jié)點數(shù),編碼順序為左了樹的反向鏈表;剩余數(shù)字串為右子樹,編碼順序為正向鏈表;恢復(fù)左子樹的正向鏈表和右子樹的反向鏈表;由標(biāo)志位判斷為正數(shù),則4.1)若AST根節(jié)點值大于T根節(jié)點值,則AST根節(jié)點值改為T根節(jié)點值,否則執(zhí)行4.2);4.2)正向遍歷AST和T的右子樹,若AST和T的節(jié)點都不為空則轉(zhuǎn)4.2.1),否則轉(zhuǎn)4.2.3);4.2.1)AST和T相同層的節(jié)點值相加,和為AST當(dāng)前節(jié)點的值;4.2.2)訪問AST和T的下一個節(jié)點,轉(zhuǎn)4.2);4.2.3)若T的節(jié)點為空,則轉(zhuǎn)4.3),否則轉(zhuǎn)4.2.4);4.2.4)新建AST的葉子節(jié)點,將T當(dāng)前節(jié)點值復(fù)制到AST的葉子節(jié)點;4.2.5)訪問T的下一個節(jié)點,轉(zhuǎn)4.2.3);4.3)正向遍歷AST和T的左子樹,若AST和T的節(jié)點都不為空則轉(zhuǎn)4.3.1),否則轉(zhuǎn)4.3.3);4.3.1)AST和T相同層的節(jié)點值相加,和為AST當(dāng)前節(jié)點的值;4.3.2)訪問AST和T的下一個節(jié)點,轉(zhuǎn)4.3);4.3.3)若T的節(jié)點為空,則轉(zhuǎn)步驟2),否則轉(zhuǎn)4.3.4);4.3.4)新建AST的葉子節(jié)點,將T當(dāng)前節(jié)點值復(fù)制到AST的葉子節(jié)點;4.3.5)訪問T的下一個節(jié)點,轉(zhuǎn)4.3.3);由標(biāo)志位判斷為負(fù)數(shù),則5.1)若MST根節(jié)點值小于T根節(jié)點值,則MST根節(jié)點值改為T根節(jié)點值,否則執(zhí)行5.2);5.2)正向遍歷AST和T的右子樹,若MST和T的節(jié)點都不為空則轉(zhuǎn)5.2.1),否則轉(zhuǎn)5.2.3);5.2.1)MST和T相同層的節(jié)點值相加,和為MST當(dāng)前節(jié)點的值;5.2.2)訪問MST和T的下一個節(jié)點,轉(zhuǎn)5.2);5.2.3)若T的節(jié)點為空,則轉(zhuǎn)5.3),否則轉(zhuǎn)5.2.4);5.2.4)新建MST的葉子節(jié)點,將T當(dāng)前節(jié)點值復(fù)制到MST的葉子節(jié)點;5.2.5)訪問T的下一個節(jié)點,轉(zhuǎn)5.2.3);5.3)正向遍歷MST和T的左子樹,若MST和T的節(jié)點都不為空則轉(zhuǎn)5.3.1),否則轉(zhuǎn)4.3.3);5.3.1)MST和T相同層的節(jié)點值相加,和為MST當(dāng)前節(jié)點的值;5.3.2)訪問MST和T的下一個節(jié)點,轉(zhuǎn)5.3);5.3.3)若T的節(jié)點為空,則轉(zhuǎn)2),否則轉(zhuǎn)5.3.4);5.3.4)新建MST的葉子節(jié)點,將T當(dāng)前節(jié)點值復(fù)制到MST的葉子節(jié)點;5.3.5)訪問T的下一個節(jié)點,轉(zhuǎn)5.3.3);6)輸出二個數(shù)字串:按AST和MST的根節(jié)點、左子樹的反向遍歷、右子樹的正向遍歷及分隔符組成的數(shù)字串;上述算法描述中第4)步主要按雙鏈表二叉樹求所有正數(shù)的和,第5)步主要按雙鏈表二叉樹求所有負(fù)數(shù)的和,這二步過程是類似的,僅在和樹的根節(jié)點值的處理不一樣。4、數(shù)據(jù)庫代理對云數(shù)據(jù)庫UDF的求和值進(jìn)行解密及校正將云服務(wù)器上計算輸出的AST和MST的數(shù)字串傳輸?shù)綌?shù)據(jù)庫代理,利用Paillier算法對編碼中的每個數(shù)字組進(jìn)行解密,解密后進(jìn)行校正。解密及校正算法流程圖如附圖4所示,算法描述如下。輸入:云數(shù)據(jù)庫中計算輸出的正數(shù)和AST或負(fù)數(shù)和MST的數(shù)字串;輸出:正數(shù)和AST或負(fù)數(shù)和MST解密校正后的雙鏈表二叉樹;開始:1)對正數(shù)和AST或負(fù)數(shù)和MST的數(shù)字串除標(biāo)志位外,對分隔符間隔開的每個數(shù)字串用Paillier算法進(jìn)行解密;2)恢復(fù)AST或MST的雙鏈表二叉樹T:標(biāo)志位為根節(jié)點;由標(biāo)志位確定左子樹的節(jié)點數(shù),按節(jié)點數(shù)將分隔符間隔的數(shù)字串順序建立左子樹的反向鏈表;剩余的數(shù)字串按順序建立右子樹的正向鏈表;恢復(fù)左子樹的正向鏈表和右子樹的反向鏈表;3)初始化進(jìn)位變量C為0;4)若樹T的右子樹反向鏈表當(dāng)前節(jié)點為空節(jié)點則轉(zhuǎn)4),否則轉(zhuǎn)4.1);4.1)將當(dāng)前節(jié)點值保存在變量N,修改當(dāng)前節(jié)點值為(N+C)mod100,修改進(jìn)位變量C=(N+C)/100;4.2)繼續(xù)訪問T右子樹反向鏈表的下一個節(jié)點,轉(zhuǎn)4);5)若樹T的左子樹正向鏈表當(dāng)前節(jié)點為空節(jié)點則轉(zhuǎn)6),否則轉(zhuǎn)5.1);5.1)將當(dāng)前節(jié)點值保存在變量N,修改當(dāng)前節(jié)點值為(N+C)mod100,修改進(jìn)位變量C=(N+C)/100;5.2)繼續(xù)訪問T右子樹反向鏈表的下一個節(jié)點,轉(zhuǎn)4);6)若進(jìn)位變量C為0則轉(zhuǎn)7),否則轉(zhuǎn)6.1);6.1)設(shè)當(dāng)前節(jié)點為P,新建節(jié)點Q,Cmod100為新建節(jié)點Q的值,修改進(jìn)位變量C=C/100,樹T的左子樹反向鏈表根節(jié)點指向Q,Q指向P;正向鏈表P指向Q,Q指向空指針;6.2)轉(zhuǎn)6)繼續(xù)判斷是否需要新增節(jié)點;7)輸出解密校正后的AST或MST的雙鏈表二叉樹;上述算法步驟4)到6)主要對數(shù)字組的總和大于99的值進(jìn)行校正。5、輸出用戶SUM查詢的最終結(jié)果對浮點屬性所有正數(shù)的和與所有負(fù)數(shù)的和再次進(jìn)行求和,結(jié)果即為浮點屬性求和函數(shù)SUM的值。首先對MST的雙鏈表二叉樹按編碼規(guī)則修改每個節(jié)點值,然后按AST和MST的雙鏈表二叉樹進(jìn)行求和,解碼校正后輸出求和函數(shù)SUM的值。這一步?jīng)]有對正數(shù)和或者負(fù)數(shù)和解碼后直接相加是為了保證浮點型計算的精度。算法流程如附圖5-1、5-2所示,算法描述如下。輸入:數(shù)據(jù)庫代理解密校正后的雙鏈表二叉樹AST和雙鏈表二叉樹MST;輸出:浮點屬性的求和函數(shù)SUM的輸出值(編碼形式);開始:1)遍歷雙鏈表二叉樹MST,將每個節(jié)點的值N按負(fù)數(shù)的編碼規(guī)則改為編碼值100-N;2)初始化和樹ST,建立只有根節(jié)點的雙鏈表二叉樹,根節(jié)點初始值為0;3)對AST,MST右子樹正向遍歷,若AST和MST中短的右子樹節(jié)點為空節(jié)點則轉(zhuǎn)4),否則轉(zhuǎn)3.1);3.1)設(shè)ST當(dāng)前葉子節(jié)點為P,ST右子樹新建葉子節(jié)點Q,正向鏈表P指向Q,反向鏈表根節(jié)點指向Q,Q指向P。AST,MST同一層的節(jié)點值相加,和為Q節(jié)點的值;3.2)取AST,MST的下一個節(jié)點,轉(zhuǎn)3);4)若AST和MST中長的右分支為空節(jié)點則轉(zhuǎn)5),否則轉(zhuǎn)4.1);4.1)設(shè)ST當(dāng)前葉子節(jié)點為P,ST右子樹新建葉子節(jié)點Q,正向鏈表P指向Q,反向鏈表根節(jié)點指向Q,Q指向P。將AST和MST長分支中的節(jié)點值復(fù)制給節(jié)點Q;4.2)取AST或MST的下一個節(jié)點,轉(zhuǎn)4);5)對AST,MST左子樹正向遍歷,若AST和MST中短的左子樹節(jié)點為空節(jié)點則轉(zhuǎn)6),否則轉(zhuǎn)3.1);5.1)設(shè)ST當(dāng)前葉子節(jié)點為P,ST左子樹新建葉子節(jié)點Q,正向鏈表P指向Q,反向鏈表根節(jié)點指向Q,Q指向P。AST,MST同一層的節(jié)點值相加,和為Q節(jié)點的值;5.2)取AST,MST的下一個節(jié)點,轉(zhuǎn)5);6)若AST和MST中長的左分支為空節(jié)點則轉(zhuǎn)7),否則轉(zhuǎn)6.1);6.1)設(shè)ST當(dāng)前葉子節(jié)點為P,ST右子樹新建葉子節(jié)點Q,正向鏈表P指向Q,反向鏈表根節(jié)點指向Q,Q指向P。將AST和MST長分支中的節(jié)點值復(fù)制給節(jié)點Q;6.2)取AST或MST的下一個節(jié)點,轉(zhuǎn)6);7)初始化進(jìn)位變量C為0,判斷AST和MST根節(jié)點的和,若和大于255轉(zhuǎn)9),若和小于255則轉(zhuǎn)10),否則轉(zhuǎn)7.1);7.1)對和樹ST的左子樹反向遍歷,右子樹正向遍歷,找到第一個值不為100的節(jié)點;7.2)若節(jié)點值大于100轉(zhuǎn)9),否則轉(zhuǎn)11);8)將和樹ST根節(jié)點的值修改為AST根節(jié)點的值;9)對ST的右子樹反向遍歷,若是空節(jié)點轉(zhuǎn)10),否則轉(zhuǎn)9.1);9.1)將ST當(dāng)前節(jié)點值保存為N,若N+C≥100則將ST當(dāng)前節(jié)點值改為(N+C)-100,進(jìn)位變量C修改為0;否則將進(jìn)位變量C修改為99;9.2)取ST的下一個節(jié)點,轉(zhuǎn)9);10)對ST的左子樹正向遍歷,若是空節(jié)點轉(zhuǎn)14),否則轉(zhuǎn)10.1);10.1)將ST當(dāng)前節(jié)點值保存為N,若N+C≥100則將ST當(dāng)前節(jié)點值改為(N+C)-100,進(jìn)位變量C修改為0;否則將進(jìn)位變量C修改為99;10.2)取ST的下一個節(jié)點,轉(zhuǎn)10);11)將和樹ST根節(jié)點的值修改為MST根節(jié)點的值;12)對ST的右子樹反向遍歷,若是空節(jié)點轉(zhuǎn)13),否則轉(zhuǎn)12.1);12.1)將ST當(dāng)前節(jié)點值保存為N,若N+C≥100則將ST當(dāng)前節(jié)點值改為(N+C)-100,進(jìn)位變量C修改為99;否則將進(jìn)位變量C修改為0;12.2)取ST的下一個節(jié)點,轉(zhuǎn)12);13)對ST的左子樹正向遍歷,若是空節(jié)點轉(zhuǎn)14),否則轉(zhuǎn)10.1);13.1)將ST當(dāng)前節(jié)點值保存為N,若N+C≥100則將ST當(dāng)前節(jié)點值改為(N+C)-100,進(jìn)位變量C修改為99;否則將進(jìn)位變量C修改為0;13.2)取ST的下一個節(jié)點,轉(zhuǎn)13);14)輸出和樹ST按根節(jié)點、左子樹反向遍歷、右子樹正向遍歷得到求和函數(shù)SUM的輸出,其值為編碼形式;上述算法描述從第3)到6)求出了AST和MST對應(yīng)節(jié)點的和,存到和樹ST;若求和函數(shù)SUM的和是正數(shù),則按步驟9)和10)校正;若求和函數(shù)SUM的和是負(fù)數(shù),則按步驟12)和13)校正。上述算法得到求和函數(shù)SUM值的編碼形式后再進(jìn)行解碼。設(shè)數(shù)字組N在編碼中的順序為k,順序編號從1開始,則解碼式為∑N×100(F-192-K)其中F為標(biāo)志位。解碼后的結(jié)果可能在最高位和最低位出現(xiàn)多余的0,這部分無意義的0可直接去掉不影響結(jié)果。上述實施例為本發(fā)明較佳的實施方式,但本發(fā)明的實施方式并不受上述實施例的限制,其他的任何未背離本發(fā)明的精神實質(zhì)與原理下所作的改變、修飾、替代、組合、簡化,均應(yīng)為等效的置換方式,都包含在本發(fā)明的保護(hù)范圍之內(nèi)。當(dāng)前第1頁1 2 3