姜文超,林德熙,郭楚謀,武繼剛,孫傲冰
1.廣東工業(yè)大學(xué) 計(jì)算機(jī)學(xué)院,廣州 510006 2.廣東電子工業(yè)研究院,廣東 東莞 523808
加密強(qiáng)度可定制的新型文本加解密算法*
姜文超1+,林德熙1,郭楚謀1,武繼剛1,孫傲冰2
1.廣東工業(yè)大學(xué) 計(jì)算機(jī)學(xué)院,廣州 510006 2.廣東電子工業(yè)研究院,廣東 東莞 523808
各類信息服務(wù)系統(tǒng)在生活中各領(lǐng)域的廣泛應(yīng)用導(dǎo)致用戶需要管理和記憶越來(lái)越多的賬號(hào)和密碼,設(shè)計(jì)一種讓用戶能夠根據(jù)實(shí)際需求自定制的、加密強(qiáng)度可調(diào)節(jié)的賬戶和密碼管理方法成為急需解決的問(wèn)題。提出了一種加密強(qiáng)度可定制與調(diào)節(jié)的加密策略,并設(shè)計(jì)、實(shí)現(xiàn)了一個(gè)加密算法實(shí)例。算法分為3個(gè)步驟:哈希映射、空白填補(bǔ)、字符加密。哈希映射用于制作密碼本,負(fù)責(zé)把明文根據(jù)密碼本放到密文緩沖區(qū),或根據(jù)密碼本把明文從密文緩沖區(qū)讀取出來(lái);空白填補(bǔ)把密文緩沖區(qū)空白部分填上隨機(jī)字符,進(jìn)一步增加保密級(jí)別;字符加密允許用戶采用自己特定的加密算法對(duì)每個(gè)明文字符進(jìn)行加密。理論分析和實(shí)驗(yàn)測(cè)試均表明該加/解密算法靈活、便捷,同時(shí)可以有效保證用戶隱私數(shù)據(jù)的安全性,允許用戶根據(jù)實(shí)際需求自定制專屬自己的獨(dú)特的保密方法,并且證明在不知道密鑰的情況下無(wú)法使用蠻力窮舉法破解。
加密強(qiáng)度可定制;文本加密;哈希映射
隨著各類信息系統(tǒng)的廣泛應(yīng)用,人們擁有越來(lái)越多的賬號(hào)和密碼,但是人的記憶力是有限的,記住眾多的賬號(hào)和密碼會(huì)給用戶帶來(lái)很大困擾。通用的數(shù)據(jù)加密算法雖然可以保護(hù)用戶的隱私信息,但理論上仍然具有被破解的可能,倘若某一加密算法被破解,所有使用該方法的信息系統(tǒng)和用戶都將面臨突發(fā)的泄密災(zāi)難。因此在數(shù)據(jù)保護(hù)需求強(qiáng)度越來(lái)越高的情況下,能否設(shè)計(jì)一種用戶可自定義的、加密強(qiáng)度可調(diào)的加密算法,使廣大非加解密領(lǐng)域和IT領(lǐng)域?qū)<业钠胀ㄓ脩艨梢栽O(shè)計(jì)、開(kāi)發(fā)具有自己個(gè)人特色的且每個(gè)用戶都互不相同的加密方法成為一種迫切需求。另外,目前各類信息系統(tǒng)的賬戶和密碼均采用數(shù)字和字符組合的方式,而沒(méi)有利用中文漢字?jǐn)?shù)量大且方便記憶的獨(dú)特優(yōu)勢(shì)。設(shè)計(jì)一種新型的、可自定義的、加密強(qiáng)度可定制的、結(jié)合中文復(fù)雜性的加密策略可以在保證用戶隱私數(shù)據(jù)安全的同時(shí),使用戶容易記憶賬戶、密碼等高度隱私的數(shù)據(jù)信息。
本文提出了一種加密強(qiáng)度可自主定制與調(diào)節(jié)的加密策略,并實(shí)現(xiàn)了一個(gè)加/解密算法實(shí)例,讓用戶根據(jù)自己的需求和特色輕松設(shè)計(jì)專屬于自己的加密算法。對(duì)于任何一段數(shù)據(jù),該方法分為3個(gè)步驟:哈希映射、空白填補(bǔ)、字符加密。哈希映射用于制作密碼本,負(fù)責(zé)把明文根據(jù)密碼本放到密文緩沖區(qū),或根據(jù)密碼本把明文從密文緩沖區(qū)讀取出來(lái);空白填補(bǔ)把密文緩沖區(qū)空白部分填上隨機(jī)字符,進(jìn)一步增加保密級(jí)別;字符加密允許用戶采用自己特定的加密算法對(duì)每個(gè)明文字符進(jìn)行加密。理論分析和實(shí)驗(yàn)測(cè)試均表明本文加密算法可以有效保證用戶隱私數(shù)據(jù)的安全性,在不知道密鑰的情況下無(wú)法使用蠻力窮舉法破解。
本加密策略考慮到使廣大非加/解密領(lǐng)域和IT領(lǐng)域?qū)<业钠胀ㄓ脩艨梢栽O(shè)計(jì)、開(kāi)發(fā)具有自己個(gè)人特色的且每個(gè)用戶都互不相同的加密方法的原型,需要讓加密過(guò)程簡(jiǎn)單、靈活,且加密強(qiáng)度可以調(diào)節(jié),為描述其加/解密原理,定義基本術(shù)語(yǔ)如表1所示。
如圖1所示,加密過(guò)程由校驗(yàn)密碼模塊、哈希映射[1]模塊、填補(bǔ)空白模塊和加密字符模塊構(gòu)成。校驗(yàn)密碼模塊包括檢查密碼是否能作為密鑰和是否能對(duì)明文進(jìn)行分解兩個(gè)功能。明文分解是把明文分解為多個(gè)子明文進(jìn)行加密,在明文長(zhǎng)度過(guò)大情況下,轉(zhuǎn)換為小于一定長(zhǎng)度的明文作為輸入。其中,哈希映射需要申請(qǐng)一段內(nèi)存空間作為緩沖區(qū),哈希映射根據(jù)密鑰把明文字符亂序放在緩沖區(qū)。
Table 1 Basic definitions表1 基本術(shù)語(yǔ)定義
填補(bǔ)空白模塊負(fù)責(zé)在緩沖區(qū)空白位置填補(bǔ)隨機(jī)字符。字符加密模塊對(duì)每個(gè)字符運(yùn)用用戶特定的加密算法進(jìn)行加密,保證攻擊者無(wú)法猜測(cè)明文信息。只要緩沖區(qū)足夠大,填補(bǔ)空白使明文和填補(bǔ)組成的密文無(wú)法知道給定一段字符是輸入填補(bǔ)還是明文。
加密過(guò)程實(shí)例偽代碼描述如下。
1.encryption(str,key)
2.input str,key//明文,密碼
3.get temp_length//獲得緩沖區(qū)長(zhǎng)度
4.if(IsNullorEmptyorWhitechar(str))//明文判斷不空
5.return str
6.hstr=md5(key)+end_string//后綴
7.get per//獲得緩沖區(qū)使用率
clearstr=distribution(str,temp_length*per)//分割明文函數(shù),輸入字符串和分割字符串長(zhǎng)度temp_length*per,可以把字符串str分割為長(zhǎng)度不大于temp_length*per的多個(gè)字符串
8.foreach(temp in clearstr)//分割的明文分別進(jìn)行加密
9.ciphertext+=encryption_string(temp,temp_length,hstr,key)
10.return ciphertext
加密子明文需先申請(qǐng)緩沖區(qū),長(zhǎng)度temp_length,明文后面加上后綴,對(duì)明文每個(gè)字符,使用哈希映射得到其在緩沖區(qū)的位置,如果哈希映射得到位置沖突,則使用沖突函數(shù)得到一個(gè)沒(méi)有沖突的位置。之后通過(guò)fill_gaps填補(bǔ)空白,輸入緩沖區(qū)temp和密鑰,對(duì)temp填補(bǔ)空白,填補(bǔ)空白之后對(duì)temp每個(gè)字符加密。其偽代碼描述如下。
1.encryption_string(str,temp_length,hstr,key)
2.temp=char[temp_length]//申請(qǐng)緩沖區(qū)
3.str=str+hstr//明文后綴
4.for i=0 to str.length
5.position=hash(i,key);//哈希映射
6.temp[position]=str[i]
7.fill_gaps(temp,key)//填補(bǔ)空白
8.for i=0 to temp_length
9.temp[i]=encryption_character(temp[i],key,i)
10.return temp
如圖2所示,解密過(guò)程包括校驗(yàn)密鑰、哈希映射、字符解密3個(gè)模塊。當(dāng)存在多個(gè)密文需要進(jìn)行解密且費(fèi)時(shí)較長(zhǎng)時(shí)需要驗(yàn)證密鑰,一旦密鑰錯(cuò)誤,校驗(yàn)密鑰模塊可以停止解密以節(jié)約時(shí)間,可對(duì)原密鑰進(jìn)行特定加密過(guò)程,比如MD5[2],然后用加密算法使用經(jīng)過(guò)MD5加密后的密鑰。首先用經(jīng)過(guò)驗(yàn)證的密鑰對(duì)密文解密,然后比較要驗(yàn)證密鑰的MD5和明文是否相同來(lái)驗(yàn)證密鑰。
Fig.1 Encryption圖1 加密過(guò)程
解密過(guò)程中的哈希映射和加密過(guò)程類似,除了沖突處理conflict之外,用于判斷當(dāng)前位置在緩沖區(qū)是否已經(jīng)存在字符,如果不存在字符,那么解密沖突。這和加密過(guò)程相反,加密過(guò)程是存在字符時(shí)發(fā)生沖突。使用哈希映射得到密文字符在明文中的位置,哈希映射和密鑰以及明文的字符所在位置有關(guān),和明文本身無(wú)關(guān),用相同的密鑰可以得到處于相同明文位置的字符在緩沖區(qū)唯一位置。
字符解密模塊包括加密哈希映射得到的結(jié)果和截取密文,也可以對(duì)隨機(jī)字符解密。截取密文根據(jù)后綴截取,字符解密后可以得到明文加上后綴、隨機(jī)字符后的字符串,對(duì)字符串截取后綴后即可得到明文。
解密過(guò)程實(shí)例偽代碼描述如下。
1.decryption(str,key)
2.get temp_length
3.if(IsNullorEmptyorWhitechar(str))
4.return str
5.hstr=md5(key)+end_string
6.ciphertext=distribution(str,temp_length)//分割密文
7.foreach(temp in ciphertext)
8.clearstr+=decryption_string(temp,temp_length,hstr,key)//對(duì)分割的密文解密
9.return clearstr
1.decryption_string(str,temp_length,hstr,key)
2.tempclearstr=char[temp_length]//申請(qǐng)緩沖區(qū)
3.tempciphertext=char[temp_length]
4.for i=0 to temp_length
5.tempciphertext[i]=decryption_character(str[i],key,i)//解密字符
6.position=hash(i,key)//哈希路徑
7. count=0
8.while(!IsNull(temp[position]))//沖突處理
9. position=conflict(count,position,key,temp_length)
10.tempclearstr[i]=tempciphertext[position[i]]
11.return subhstr(tempclearstr,hstr)//去后綴
根據(jù)加/解密原理,一個(gè)加密算法需要分別對(duì)加密過(guò)程和解密過(guò)程用到的校驗(yàn)密碼、哈希映射、填補(bǔ)空白、字符加密子模塊分別加以實(shí)現(xiàn)。
校驗(yàn)密碼包括密碼長(zhǎng)度檢驗(yàn)[3]、重復(fù)字符檢驗(yàn)兩個(gè)模塊。因?yàn)樵诩用苓^(guò)程需要一個(gè)正確的密碼,如果一個(gè)長(zhǎng)度過(guò)短并且有很多重復(fù)字符的密碼,使用哈希映射將會(huì)容易產(chǎn)生沖突,導(dǎo)致性能差。經(jīng)過(guò)哈希映射處理后,和明文相比,密文熵沒(méi)有足夠大,密碼長(zhǎng)度如果和緩沖區(qū)長(zhǎng)度相同,每個(gè)緩沖區(qū)數(shù)據(jù)都能分配一個(gè)密碼作為密鑰的關(guān)鍵字key,但是用戶極少能輸入這么長(zhǎng)的密碼。如果檢驗(yàn)到用戶密碼過(guò)短,可以讓用戶重新輸入或組合用戶的密碼得到密鑰。重復(fù)的字符檢驗(yàn)存在多個(gè)相同字符,在哈希映射得不到比較散列的位置,因?yàn)橛擅荑€字符決定明文在緩沖區(qū)位置,相同的字符會(huì)得到相同的位置,因而造成沖突,之后調(diào)用沖突處理conflict會(huì)降低加密性能。位置分布不夠分散導(dǎo)致密文熵不夠大,影響加密強(qiáng)度。因此緩沖區(qū)temp長(zhǎng)度temp_length與密鑰長(zhǎng)度存在一定關(guān)系temp_length=f(k_length),獲得最好的比例,temp_length越長(zhǎng)加密效果越好,需要空間越大,調(diào)用沖突處理次數(shù)越大,而temp_length越小,分割越多,加密性能越差。例如:密鑰長(zhǎng)度為l,如果沖突處理使用步長(zhǎng)為l的conflict,就會(huì)讓哈希映射失去作用??梢詫ふ业揭粋€(gè)新的起點(diǎn),排列出m,滿足m==M,從而避免步長(zhǎng)為l的沖突發(fā)生。
為滿足密鑰長(zhǎng)度和加密的要求,首先判斷密碼長(zhǎng)度,然后選擇去除重復(fù)字符。在用戶輸入過(guò)短的情況下,可以把用戶的輸入進(jìn)行MD5,得到比較長(zhǎng)的密鑰,但這種情況限于用戶輸入為英文和數(shù)字的情況,并沒(méi)有使用中文加密。而選擇使用何種哈希映射也可以依靠密碼來(lái)調(diào)整,如密碼只有英文和數(shù)字,沒(méi)有中文,則選擇對(duì)英文和數(shù)字有優(yōu)化的哈希映射。同時(shí),根據(jù)密鑰可以決定緩沖區(qū)長(zhǎng)度,但緩沖區(qū)長(zhǎng)度選擇和哈希算法有關(guān),如果使用密鑰單字符作為哈希映射關(guān)鍵字,選擇緩沖區(qū)長(zhǎng)度應(yīng)為密鑰的10倍,保證每10個(gè)明文字符所用的密鑰字符是相同的。如果選擇緩沖區(qū)長(zhǎng)度100倍,則每100個(gè)明文字符所用的密鑰字符是相同的。因此選擇多個(gè)字符作為關(guān)鍵字,明文字符所用的關(guān)鍵字相同的數(shù)量會(huì)比選擇密鑰單字符作為哈希映射關(guān)鍵字少,密鑰作為哈希關(guān)鍵字中重復(fù)數(shù)越少,加密效果會(huì)越好。
加密校驗(yàn)密鑰的算法實(shí)例如下。
1.input key//輸入密碼
2.if(IsNullorEmptyorWhitechar(key))//判斷輸入字符串是否空字符串、無(wú)效字符串、空格字符串
3.fail
4.else
5.key=remove_same_character(key)//刪除字符串的相同字符
6.if(key.length<MinLength)//判斷密碼是否小于作為密鑰最小長(zhǎng)度
7. fail
8.else
9.true
解密過(guò)程校驗(yàn)密鑰可利用已有的MD5算法,把MD5后的密文放到本算法中加密,得到密鑰key,如果保存在本地的密鑰密文解密后和輸入密鑰MD5后一樣,那么密鑰正確。
解密校驗(yàn)密鑰的一個(gè)算法實(shí)例如下。
1.input key,keystr//key是輸入密鑰,keystr是保存在本地的密鑰密文
2.str=md5(key)//MD5是已有的MD5加密算法,能對(duì)輸入的字符串輸入一段定長(zhǎng)的密文
3.str1=decryption(keystr,key)//decryption是本加密算法的解密函數(shù),需要輸入明文和密鑰,輸入密文
4.if(str==str1)
5. right
6.else
7.fail
哈希映射包括分割明文或密文模塊、哈希路徑判斷、沖突處理3個(gè)功能。哈希映射的設(shè)計(jì)目標(biāo)是讓每個(gè)明文字符對(duì)應(yīng)到緩沖區(qū)中不同位置,如圖3所示。其中,明文每個(gè)字符的位置和明文本身無(wú)關(guān),只和密鑰k、字符在明文中的位置i有關(guān)。
Fig.3 Hash mapping圖3 哈希映射過(guò)程
具體哈希映射、路徑 p和沖突處理方法有多種選擇,可以根據(jù)用戶實(shí)際需要和加密強(qiáng)度需求自主選擇和調(diào)節(jié)加密強(qiáng)度。其實(shí)現(xiàn)偽代碼描述如下。
1.hash(i,key)
2.position=p(i,key)//哈希路徑
3.while(!IsNull(temp[position]))//沖突處理,加密判斷位置不為空,解密過(guò)程判斷位置為空
4.position=conflict(count,position,key,temp_length)
5.return position
哈希映射的關(guān)鍵是產(chǎn)生哈希路徑,只要滿足輸入一個(gè)關(guān)鍵字,得到一個(gè)在緩沖區(qū)長(zhǎng)度temp_length以內(nèi)的數(shù)值即可滿足算法的哈希路徑要求。當(dāng)key和value唯一對(duì)應(yīng)時(shí)產(chǎn)生的哈希路徑效率最高。如果可以保證有大量不同的key得到不同的value,只有少量不同的key可能得到相同的value的哈希路徑即可使用,此時(shí)可以調(diào)用沖突處理函數(shù)來(lái)得到另一個(gè)確定的位置。
哈希路徑輸入關(guān)鍵字可以使用單個(gè)密鑰字符、多個(gè)密鑰字符、密鑰字符和明文字符所在明文位置的混合等多種方式。使用單個(gè)關(guān)鍵字可以把關(guān)鍵字的unicode作為返回的value參數(shù)進(jìn)行計(jì)算,比如式(1)采用除留余數(shù)法。除留余數(shù)法是將key對(duì)一個(gè)常數(shù)取模。
其中,a、b、c為常數(shù);%為取模,取模操作確保最后的value不會(huì)超過(guò)緩沖區(qū)的大小。
哈希路徑產(chǎn)生過(guò)程都依賴密鑰,可能得到一個(gè)不適合的熵值,會(huì)增加沖突處理次數(shù),進(jìn)而降低算法性能。為解決這個(gè)問(wèn)題,如式(2)所示,關(guān)鍵字key可以使用密鑰中的字符和value與明文的第i個(gè)字符的比值得到,從而使每個(gè)關(guān)鍵字都不相同,存在一個(gè)哈希路徑使value也都不同。
根據(jù)key得到value可以用傳統(tǒng)的Hash函數(shù),比如Robert Sedgwicks(RS)[4]、Justin Sobel(JS)[5]等。但是這些哈希映射不能很好地適應(yīng)本算法,因?yàn)樽罱K得到的值需要對(duì)緩沖區(qū)長(zhǎng)度取模,這樣散列映射空間很小,沖突次數(shù)增多。
為解決該問(wèn)題,本文采用密鑰排序法,能夠利用密鑰中的字符和i來(lái)得到明文第i個(gè)字符所在緩沖區(qū)位置。密鑰排序法按照密鑰字符規(guī)律先對(duì)密鑰可能的字符進(jìn)行排序,如英文的次序和漢字拼音次序。去掉密鑰中相同的字符,計(jì)算密鑰剩下字符,并更新密鑰長(zhǎng)度。把緩沖區(qū)分割為temp_length/k_length個(gè)區(qū),每個(gè)區(qū)按照字符順序,每個(gè)區(qū)長(zhǎng)度相同,多余的緩沖區(qū)字符可以放在每個(gè)區(qū)之間。明文的第i1個(gè)字符對(duì)應(yīng)密鑰第i2個(gè)字符,反之可以按照密鑰第i2個(gè)字符所在順序位置得到明文的第i1個(gè)字符首位置。密鑰第i2個(gè)字符作為i1/k_length個(gè)字符的關(guān)鍵字,明文的第i1個(gè)字符位置可以是a+b,b∈B。B是可以在分割后的緩沖區(qū)內(nèi)沒(méi)有重復(fù)數(shù)的數(shù)組。例如:密鑰只有英文,那么將存在的英文字符排序,刪除重復(fù)的字符,分割緩沖區(qū)為temp_length/k_length。如果明文的第i1個(gè)字符剛好對(duì)應(yīng)的密鑰第i2個(gè)字符是B,那么尋找B所在的位置a,則明文的i1字符首位置就是a,判斷當(dāng)前i2和i1的比,獲取的當(dāng)前明文是所在區(qū)域第i3個(gè)進(jìn)入明文,根據(jù)沖突處理放到相對(duì)的位置。
假如密鑰ABCGFKJ
明文是123456789
那么首先對(duì)密鑰進(jìn)行分析,按照ASCII對(duì)密鑰字符進(jìn)行排序??梢钥吹紸排在第1位,B排在第2位,C排在第3位,因?yàn)闆](méi)有DE,F(xiàn)排在第4位,G排在第5位,J排在第6位,K排在第7位。通過(guò)函數(shù) place(key),根據(jù)key得到所在區(qū)域,如圖4所示。
Fig.4 Zone of secret key characters圖4 每個(gè)密鑰字符區(qū)域
把緩沖區(qū)分為7部分,稱為區(qū)域,如圖5所示。這里設(shè)每個(gè)區(qū)域大小都一樣,不能被整數(shù)劃分的緩沖區(qū)空間放在最后。
Fig.5 Zone of each character圖5 每個(gè)字符區(qū)域大小
把每個(gè)明文字符根據(jù)所在位置選擇密鑰的字符,得到位置,如圖6所示。
Fig.6 Placement of plain text圖6 把明文放到區(qū)域
密鑰排序法簡(jiǎn)單,對(duì)于英文和數(shù)字加密效果不夠理想,但是中文漢字?jǐn)?shù)量大,可以充分發(fā)揮其算法優(yōu)勢(shì)。另外,對(duì)于漢字密鑰,可以依照拼音或筆畫(huà)等對(duì)漢字進(jìn)行排序,得到密鑰每個(gè)字符對(duì)應(yīng)排序后所在位置,明文的第i個(gè)字符和密鑰的第i1個(gè)字符相對(duì)應(yīng),分配到密鑰第i1個(gè)字符所在區(qū)域。漢字密鑰產(chǎn)生前必須有一套規(guī)則來(lái)對(duì)漢字排序,需要漢字庫(kù)的支持。漢字庫(kù)最簡(jiǎn)單的有按照拼音和比劃排序。普通字典也可以在排序前先加密,防止攻擊者依靠漢字庫(kù)來(lái)猜明文所在區(qū)域。
沖突處理[6]是指當(dāng)輸入相同關(guān)鍵字時(shí)就出現(xiàn)了沖突,相同關(guān)鍵字哈希路徑得到相同位置,而在加密過(guò)程把明文M放到已有明文的位置會(huì)丟失明文,不使用沖突處理可以作為摘要加密。沖突處理需要訪問(wèn)內(nèi)存尋找一個(gè)沒(méi)有沖突的位置,時(shí)間較長(zhǎng),如果加密一個(gè)字符需要訪問(wèn)沖突處理次數(shù)很多,那么效率很低。當(dāng)前可用沖突處理可以是簡(jiǎn)單使用密鑰來(lái)獲得一個(gè)數(shù),然后判斷這個(gè)數(shù)對(duì)應(yīng)位置是否沖突,如果沖突則繼續(xù)步驟。而奇數(shù)環(huán)法則是申請(qǐng)緩沖區(qū)長(zhǎng)度為奇數(shù),采用步長(zhǎng)為偶數(shù)的沖突處理方法。加密過(guò)程的沖突處理是判斷當(dāng)前位置已經(jīng)被占用,則調(diào)用沖突處理尋找其他位置。解密過(guò)程的沖突處理是判斷當(dāng)前位置如果沒(méi)有經(jīng)過(guò)加密的字符,即空區(qū)域,則調(diào)用沖突處理進(jìn)行下一個(gè)加密字符的搜索。沖突處理函數(shù)由原位置position和步長(zhǎng)step組成。
conflict(i,position)=(position+k_i)%temp_length
解密過(guò)程的沖突處理不能出現(xiàn)某些位置一直訪問(wèn)不到,如果只出現(xiàn)很少量小于temp_length/(1-per)的位置,那么明文可以全部放進(jìn)緩沖區(qū)。如果用戶需要得到一個(gè)無(wú)沖突的方法,沖突處理可以使用奇數(shù)環(huán)法。
填補(bǔ)空白把緩沖區(qū)空白部分填補(bǔ)隨機(jī)字符,可以進(jìn)一步打亂明文的持續(xù)。在填補(bǔ)空白之前,需要在明文后面添加后綴,用以區(qū)分明文和填補(bǔ)的垃圾信息,如圖7所示。
Fig.7 Filling blanks圖7 填補(bǔ)空白
后綴是區(qū)分明文和垃圾的字符串,在解密過(guò)程,通過(guò)哈希映射得到結(jié)果,從結(jié)果的末尾開(kāi)始尋找后綴所在的位置,去除后綴及之后的垃圾數(shù)據(jù),可以得到明文,故后綴的設(shè)置需要和填補(bǔ)的垃圾位置不存在沖突。后綴可以是固定的字符串,和密鑰無(wú)關(guān),也可以是和密鑰有關(guān)的字符串,根據(jù)密鑰的摘要采用MD5來(lái)得到后綴。
在加密過(guò)程中,可以通過(guò)哈希映射把垃圾填補(bǔ)在明文里面。先申請(qǐng)一個(gè)和緩沖區(qū)相同大小的空間Mtemp,利用哈希映射在Mtemp添加上temp_length-M_length個(gè)垃圾字符,然后把明文按照順序放到Mtemp,如果位置被占用,則向下尋找沒(méi)有字符的位置放入明文。解密過(guò)程則使用哈希映射找出填補(bǔ)垃圾所在的位置,然后去除垃圾字符得到明文。
填補(bǔ)空白的一個(gè)實(shí)例描述如下。
1.input temp,key
2.for i=0 to temp_length
3.if(IsNull(temp[i])
4.temp[i]=ran_char
加密字符可以根據(jù)用戶需要選擇使用目前的任何一種加密算法[7-8]。通過(guò)加密字符,攻擊者要得到原有的信息,通過(guò)排列只能得到一個(gè)和自己隨機(jī)組合得到的一樣的結(jié)果。比如將字符的unicode加上一個(gè)隨機(jī)數(shù),或?qū)γ總€(gè)字符進(jìn)行異或,或使用DES(data encryption standard)[9]加密算法對(duì)每個(gè)字符進(jìn)行加密。例如:在只有英文大寫(xiě)字符的情況,Z+1=A。對(duì)每個(gè)字符異或一個(gè)數(shù)和加上一個(gè)數(shù)相同,這個(gè)數(shù)可以是根據(jù)密鑰得到的,但是如果能保證源代碼不被攻擊者得到,加上一個(gè)固定數(shù)也是可以的。
異或操作可以讓原有的數(shù)據(jù)類型發(fā)生變化,即:原本是英文,加密后超過(guò)英文的范圍;原本是數(shù)字,加密后超過(guò)數(shù)字范圍。另外,異或操作會(huì)導(dǎo)致轉(zhuǎn)換字符編碼出現(xiàn)問(wèn)題,解密后得不到原文,異或操作的使用是對(duì)于不進(jìn)行字符編碼的加密。
字符加密算法描述如下。
1.for i=1 to temp_length
2.encryption_character(n,temp_i)
3.end for
1.encryption_character(str,key,i)
2.get type(str)up,down//獲得字符的類型Unicode最大值up,最小down
3.return range(str,key[i%key.length],up,down)//range區(qū)間加法
明文M:這是;
后綴h:明文;
密鑰:用戶。
整個(gè)加密過(guò)程如圖8所示。
哈希映射包括哈希路徑和沖突處理。哈希路徑使用密鑰相關(guān),其中:
(1)p(K0,M0)=2
(2)p(K1,M1)=5
Fig.8 Example of Hash mapping圖8 哈希映射實(shí)例
沖突處理conflict函數(shù)的作用是在原有位置加1得到新的位置。如果采用沖突處理得到的位置和原哈希路徑得到位置相同,那么可能存在某些位置沒(méi)有被訪問(wèn)到[10],這時(shí)需要更改沖突處理的方法,修改步長(zhǎng)讓沖突處理可以訪問(wèn)所有位置。
1.begin temp_position≠' 南安市| 峡江县| 新建县| 彭泽县| 黄梅县| 泸溪县| 蒙山县| 东丽区| 稷山县| 陈巴尔虎旗| 台南县| 凭祥市| 上虞市| 元朗区| 汝州市| 宁河县| 济源市| 巴塘县| 科尔| 介休市| 茶陵县| 仁布县| 彭水| 汉阴县| 牟定县| 新龙县| 章丘市| 岱山县| 双辽市| 来宾市| 龙山县| 甘肃省| 万年县| 谢通门县| 文登市| 和顺县| 民乐县| 陈巴尔虎旗| 息烽县| 稷山县| 红河县|