陳栩睿
(西南大學(xué)電子信息工程學(xué)院,重慶 400715)
隨著數(shù)字化信息技術(shù)的不斷發(fā)展,信息安全問題也日顯突出,企業(yè)或個人的部分敏感數(shù)據(jù)應(yīng)該加密保存或發(fā)布,在特定裝置中才能被解密使用,例如嵌入式設(shè)備的程序升級文件。同時,移動互聯(lián)網(wǎng)內(nèi)容消費時代正在普及,越來越多的用戶愿意為優(yōu)質(zhì)內(nèi)容付費,企業(yè)或個人為保護自己的數(shù)字內(nèi)容不被竊取,需要對內(nèi)容進行加密傳輸,最后在智能終端解密使用。另外,應(yīng)用中還要求數(shù)據(jù)解密過程應(yīng)盡量不消耗額外的硬件資源,否則會降低用戶的體驗感。
目前,主流的加密方式有單密鑰模式、雙密鑰模式兩種。單密鑰模式采用的是對稱加密算法,即加密密鑰和解密密鑰相同,加密產(chǎn)生密文,其長度和明文大致相同,一般包括 DES、3DES、AES等。雙密鑰模式也稱為公鑰模式,其采用的是非對稱加密算法,加密和解密所使用的是不同的密鑰,即通常所說的“公鑰”和“私鑰”,公鑰與私鑰是一對,如果用公鑰對數(shù)據(jù)進行加密,只有用對應(yīng)的私鑰才能解密;如果用私鑰對數(shù)據(jù)進行加密,那么只有用對應(yīng)的公鑰才能解密。但嚴(yán)格意義上說,只能使用公鑰加密,使用私鑰來解密。而使用私鑰加密更多的起到簽名的作用,讓公鑰解密來驗證身份,因為公鑰是要傳遞的,有泄露風(fēng)險。 RSA算法、 Elgamal算法、橢圓離散對數(shù)算法等就屬于雙密鑰模式。
然而,單密鑰加密方式中,由于加密和解密使用的是同一個密鑰,一旦加密方或解密方泄露了密鑰,就會喪失安全,因此,安全性較低。雙密鑰加密方式的計算壓力較大,而且,采用雙密鑰加密方式加密后,密文的數(shù)據(jù)長度會增長,保存和傳輸壓力會加大。因此,上述傳統(tǒng)的主流加密方式不適用于嵌入式平臺的智能終端程序和文件的在線升級應(yīng)用。針對嵌入式平臺的智能終端中的程序和文件的在線升級應(yīng)用,本文提出了一種無密鑰的加解密方法及算法。
嵌入式平臺的智能終端中程序和文件在線升級的無密鑰加密方法,主要是在確保算法安全性的基礎(chǔ)上考慮算法的便捷性。本文提出的無密鑰加密方法是通過選用不同的摘要算法來得到類密鑰信息,并通過異或運算來生成密文;同時,通過選用相應(yīng)的長度算法,來確保數(shù)據(jù)塊的分割不易被反譯識別。
具體過程是:先將程序和文件數(shù)據(jù)分割為n個不固定字節(jié)長度的數(shù)據(jù)塊,自數(shù)據(jù)的起始到結(jié)尾依次為DB1、DB2……DBn,DBn的長度為Ln,其中,n≥1。再從每個數(shù)據(jù)塊的起始地址開始,選取不少于一個字節(jié)作為頭部,DBn的頭部為Hn,數(shù)據(jù)塊的起始地址是通過迭代的方式獲取,即數(shù)據(jù)塊DBn的地址取決數(shù)據(jù)塊DBn-1的地址和長度,數(shù)據(jù)塊DB1的起始地址為整個數(shù)據(jù)文件的首地址。
接著,從Hn任取不少于一個比特作為摘要算法的輸入元素Xn。然后,使用摘要算法fH(·)計算出每個數(shù)據(jù)塊頭部的類密鑰信息,再將該類密鑰信息與頭部明文進行相應(yīng)的異或運算,得到頭部密文。同時,利用長度算法fL(·)計算數(shù)據(jù)塊長度,利用不同的摘要算法fK(·)計算數(shù)據(jù)塊內(nèi)所有字節(jié)數(shù)據(jù)流的摘要信息來作為數(shù)據(jù)塊內(nèi)的類密鑰信息,再利用該類密鑰信息與每一個字節(jié)數(shù)據(jù)進行相應(yīng)的異或運算得到密文。

圖1 數(shù)據(jù)塊及其頭部劃分示意圖
摘要算法主要是指數(shù)據(jù)摘要算法,它表示輸入任意長度的數(shù)據(jù),輸出固定長度的數(shù)據(jù),相同的輸入數(shù)據(jù)始終得到相同的輸出,不同的輸入數(shù)據(jù)盡量得到不同的輸出。數(shù)據(jù)摘要算法具有不可逆性,其主要功能有數(shù)據(jù)簽名、數(shù)據(jù)完整性驗證等,這里我們主要是利用它來計算生成類密鑰信息。常用的數(shù)據(jù)摘要算法有:CRC、MD5、SHA等,可以根據(jù)實際應(yīng)用的便捷或復(fù)雜程度的要求進行選擇。
解密方法與加密方法對稱,先提取第一個數(shù)據(jù)塊的頭部密文和元素,通過摘要算法計算出第一個數(shù)據(jù)塊的頭部明文,并通過長度算法fL(·)計算第一個數(shù)據(jù)塊的長度,然后計算第一個數(shù)據(jù)塊中除頭部外每一個字節(jié)的類密鑰信息和明文,接著再提取第二個數(shù)據(jù)塊的頭部密文和元素,依次進行解密計算。
整個無密鑰加解密算法的具體流程如下:
(1)提取數(shù)據(jù)塊DB1的頭部H1。
(2)從H1中任意選不少于一個比特作為所選摘要算法的輸入元素X1,數(shù)據(jù)塊長度和字節(jié)的類密鑰信息計算均以該元素作為輸入。
(3)按如下摘要算法計算 H1的類密鑰信息,并通過異或運算得到密文C1:

式中,數(shù)據(jù)塊頭部密文摘要算法fH使用前一個數(shù)據(jù)塊的頭部密文Cn-1,計算本數(shù)據(jù)塊的頭部類密鑰信息,并通過與頭部明文Hn進行異或運算得到密文Cn。當(dāng)n=1時,Cn-1即C0為一個約定的初值M。注意,使用頭部密文時,不能覆蓋X1所在的比特位。
(4)計算數(shù)據(jù)塊DB1的長度L1:

(5)計算數(shù)據(jù)塊DB1內(nèi)除頭部外的每一個字節(jié)Dk的類密鑰信息Sk和密文Ek,數(shù)據(jù)塊中每一個字節(jié)Dk使用不同的摘要算法,計算出第k個字節(jié)的類密鑰信息Sk:
(6)提取下一數(shù)據(jù)塊的頭部,重復(fù)步驟(2)-(5),直到所有數(shù)據(jù)塊加密完成即可。流程圖如圖2所示。

圖2 無密鑰加密算法流程圖

圖3 無密鑰解密算法流程圖
(1)從數(shù)據(jù)塊DB1的頭部中提取出密文C1。
(2)從數(shù)據(jù)塊DB1的頭部中提取出元素X1。
(3)按如下算法解密生成數(shù)據(jù)塊DB1的頭部明文H1:

其中,明文不覆蓋X1。
(4)計算數(shù)據(jù)塊 DB1長度L1:

(5)計算數(shù)據(jù)塊DB1內(nèi)除頭部外的每一個字節(jié)密文Ek的類密鑰信息Sk,然后與密文Ek進行異或運算得到明文Dk:

(6)提取下一數(shù)據(jù)塊的頭部密文和元素,重復(fù)步驟(2)-(5),直到所有數(shù)據(jù)解密完成即可。流程圖如圖3所示。
由于該無密鑰加解密方法先將數(shù)據(jù)分割為n個不固定長度的數(shù)據(jù)塊;再從每個數(shù)據(jù)塊的起始地址開始,選取不少于一個字節(jié)作為頭部;接著從數(shù)據(jù)塊的頭部中任取不少于一個比特作為摘要算法的輸入元素;然后使用摘要算法和異或運算,從每個數(shù)據(jù)塊的頭部計算出頭部類密鑰信息和密文、數(shù)據(jù)塊長度以及數(shù)據(jù)塊所有字節(jié)的類密鑰信息,使用該類密鑰信息與每一個字節(jié)的明文進行異或運算得到密文,從而完成加密。解密是通過與加密過程對稱的解密過程實現(xiàn)。這種加解密方法的加密過程中數(shù)據(jù)塊長度和每個字節(jié)的類密鑰信息具備隨機性,所以逆向“碰撞”難以破解,而且本方法屬于算法流程不公開的加密方法,只是應(yīng)用在專屬的智能終端等設(shè)備上,并很好地利用了多種數(shù)據(jù)摘要算法,安全性高。
同時,本方法按字節(jié)順序計算密文,不用緩存數(shù)據(jù),沒有復(fù)雜的運算,計算壓力較小。另外,采用本方法加密后不會改變密文的數(shù)據(jù)長度,從而不會增加數(shù)據(jù)的保存和傳輸壓力。我們已將該方法應(yīng)用于專用智能終端的嵌入式軟件的在線升級中,一年共完成了4版軟件的在線升級,流程很順暢,用戶體驗感很好,沒有發(fā)生軟件被破譯后盜用的現(xiàn)象。