本發(fā)明涉及計(jì)算機(jī)信息安全
技術(shù)領(lǐng)域:
,是一種基于Zlib開源壓縮和解壓縮項(xiàng)目,對(duì)其進(jìn)行優(yōu)化,加入AES解密算法。由應(yīng)用程序調(diào)用Zlib的動(dòng)態(tài)鏈接庫(kù)來對(duì)AES加密的ZIP包進(jìn)行解密解壓的方法。
背景技術(shù):
:科技的發(fā)展使計(jì)算機(jī)深入到我們生活的方方面面,而壓縮作為一種非常典型的技術(shù),應(yīng)用到很多場(chǎng)合,比如文件系統(tǒng),數(shù)據(jù)庫(kù),消息傳輸?shù)雀黝悎?chǎng)合。壓縮可以分為無損壓縮和有損壓縮;有損,指的是在壓縮之后無法完整地還原原始信息,但壓縮率高;無損壓縮則用于文件等必須完整還原信息的場(chǎng)合,本文提到的ZIP文件就是一種無損壓縮。在實(shí)際應(yīng)用中,經(jīng)常需要實(shí)現(xiàn)對(duì)各個(gè)網(wǎng)站的上網(wǎng)數(shù)據(jù)進(jìn)行讀取和分析,提取出感興趣的信息。但各個(gè)網(wǎng)站的上網(wǎng)數(shù)據(jù)文件內(nèi)容非常龐大,需要對(duì)數(shù)據(jù)進(jìn)行壓縮;為了防止信息泄露,還對(duì)數(shù)據(jù)進(jìn)行了加密處理。AES(TheAdvancedEncrypionStandard)是美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究所用于加密電子數(shù)據(jù)的規(guī)范。它被廣泛應(yīng)用到金融、電信和政府?dāng)?shù)字信息等領(lǐng)域。AES是一個(gè)迭代的,對(duì)稱密鑰分組的密碼,它可以使用128,192,256位密鑰,并且用128位(16字節(jié))分組加密和解密數(shù)據(jù)。Zlib是一個(gè)免費(fèi)、通用、不受任何法律阻礙的、無損的數(shù)據(jù)壓縮開發(fā)庫(kù),而且還是跨平臺(tái)的開源項(xiàng)目。這意味著任何人都可以修改、使用而無需交納任何費(fèi)用,這也是對(duì)各個(gè)網(wǎng)站的上網(wǎng)數(shù)據(jù)進(jìn)行讀取和分析時(shí),通常使用Zlib庫(kù)進(jìn)行開發(fā)的主要原因,并且ZIP格式屬于幾種主流的壓縮格式之一。在使用Zlib庫(kù)對(duì)各個(gè)網(wǎng)站的上網(wǎng)數(shù)據(jù)進(jìn)行讀取和分析時(shí),通常采用Linux自帶的Zlib庫(kù)函數(shù)對(duì)數(shù)據(jù)進(jìn)行壓縮和解壓,一些網(wǎng)站上報(bào)的數(shù)據(jù)采用7-zip軟件加密壓縮成ZIP包,而7-zip軟件采用AES算法對(duì)數(shù)據(jù)進(jìn)行加密。但Zlib只支持簡(jiǎn)單的加密算法,并不支持AES加密解密算法;所以隨之帶來的問題是Zlib庫(kù)不能正常處理網(wǎng)站上報(bào)的采用AES加密的數(shù)據(jù)。技術(shù)實(shí)現(xiàn)要素:本發(fā)明的目的是提供一種基于Zlib開源庫(kù),結(jié)合AES解密算法,能自動(dòng)且準(zhǔn)確地對(duì)7-zip軟件加密壓縮的文件進(jìn)行解密解壓,通過僅添加libz.so動(dòng)態(tài)鏈接庫(kù)和libaes.a靜態(tài)鏈接庫(kù)即可處理網(wǎng)站上報(bào)加密的ZIP包。本發(fā)明采用的技術(shù)方案如下:一種基于Zlib庫(kù)和AES算法解壓ZIP包的方法,包括以下步驟:1)獲取網(wǎng)站的ZIP包數(shù)據(jù),從ZIP包中讀取文件并判斷其是否采用AES算法進(jìn)行加密;2)對(duì)于采用AES算法進(jìn)行加密的ZIP包數(shù)據(jù),在Zlib庫(kù)基礎(chǔ)上添加AES算法來對(duì)ZIP包進(jìn)行解密和解壓。進(jìn)一步地,步驟2)將AES算法封裝在靜態(tài)庫(kù)文件中,將Zlib庫(kù)封裝在libz.so動(dòng)態(tài)庫(kù)文件中。進(jìn)一步地,所述AES加密解密算法包括:a.AES加密過程:SubBytes(字節(jié)替代),ShiftRows(行移位),MixColumns(列混淆),AddRoundKey(輪密鑰加);b.AES解密過程:InvSubBytes(逆字節(jié)替代),InvShiftRows(逆行移位),InvMixColumns(逆列混淆)AddRoundKey(輪密鑰加)。本發(fā)明的優(yōu)點(diǎn)和積極效果如下:由于本發(fā)明中,對(duì)開源壓縮Zlib項(xiàng)目進(jìn)行改進(jìn)和優(yōu)化,加入AES解密算法;這正是7-zip的加密算法,從而對(duì)于網(wǎng)站運(yùn)營(yíng)商上報(bào)的數(shù)據(jù)可以準(zhǔn)確并快速處理。另外,Zlib解壓算法采用libz.so動(dòng)態(tài)庫(kù)的方式,而AES算法采用封裝成靜態(tài)庫(kù)方式,在處理網(wǎng)站上報(bào)的數(shù)據(jù)時(shí)可以自動(dòng)安裝,不需要升級(jí)系統(tǒng)的Zlib庫(kù),這樣避免了操作系統(tǒng)版本過低帶來另外問題;最后本發(fā)明采用的Zlib解壓算法具有比7-zip算法效率高、占有CPU少的優(yōu)點(diǎn)。附圖說明圖1是處理網(wǎng)站上報(bào)數(shù)據(jù)的流程圖;圖2是調(diào)用Zlib解壓ZIP文件流程圖;圖3是AES加密解密流程圖;圖4是SubBytes(字節(jié)替代)矩陣示意圖;圖5是ShiftRows(行移位)示意圖;圖6是7zip和Zlib解壓時(shí)間對(duì)比圖。具體實(shí)施方式下面通過具體實(shí)施例和附圖,對(duì)本發(fā)明做進(jìn)一步說明。圖1是展示了現(xiàn)有技術(shù)中處理網(wǎng)站上報(bào)數(shù)據(jù)的整個(gè)流程。如該圖所示,首先從現(xiàn)場(chǎng)的搬運(yùn)程序接收到ZIP包數(shù)據(jù),掃描相應(yīng)的目錄,然后解壓ZIP包文件,再掃描解壓ZIP包文件后的bcp文件和實(shí)體文件,最后對(duì)bcp文件進(jìn)行格式轉(zhuǎn)換,即取得無效數(shù)據(jù)和對(duì)有效的數(shù)據(jù)進(jìn)行校驗(yàn),再?gòu)倪@些有效的數(shù)據(jù)中提取特定的信息;實(shí)體文件入全文數(shù)據(jù)庫(kù)。本文發(fā)明是在原有Zlib庫(kù)基礎(chǔ)上,添加AES算法來解壓ZIP包的方法,位于圖1的第三個(gè)環(huán)節(jié)。一.解壓模塊設(shè)計(jì)盡管7zip的壓縮率很高,且支持AES加密和解密,但7zip占用cpu很高,這會(huì)很大程度上影響其在處理網(wǎng)站上報(bào)數(shù)據(jù)時(shí)的實(shí)時(shí)性,所以本方法中采用Zlib庫(kù)來解壓ZIP文件。Zlib庫(kù)屬于開源庫(kù),采用DEFLATE壓縮算法,只支持簡(jiǎn)單加密解密功能;但不支持AES加解密算法,所以要想解壓AES算法加密的ZIP包,就必須修改開源庫(kù)Zlib代碼添加AES加解密算法。為了不影響之前調(diào)用的接口,把AES算法封裝在libaes.a靜態(tài)庫(kù)文件中(libaes.a為本發(fā)明自己定義的靜態(tài)庫(kù)名稱);Zlib庫(kù)封裝在libz.so動(dòng)態(tài)庫(kù)文件中。這么做的好處是無論怎么修改代碼,只需更新這兩個(gè)庫(kù)文件不必修改其他的程序。修改unzip.c文件,增加修改unzOpenCurrentFilePassword函數(shù),此函數(shù)主要功能獲得ZIP文件信息;判斷HEADID若是0x9901則ZIP包采用AES加密;讀取版本號(hào);讀取兩字節(jié)判斷是否為‘A’和‘E’;讀取ZIP包加密模式,這里應(yīng)該是AES;讀取ZIP包壓縮模式。修改unzReadCurrentFile函數(shù),此函數(shù)主要功能讀取ZIP包中的文件內(nèi)容,判斷之前讀取的ZIP加密模式;若是AES則調(diào)用libaes.a靜態(tài)庫(kù)進(jìn)行解密,用已知的密鑰進(jìn)行解密得到明文。解壓流程:如圖2所示,包括:打開ZIP流,獲取ZIP文件的信息,打開當(dāng)前定位的文件,循環(huán)讀取文件(若是AES加密則對(duì)讀取數(shù)據(jù)進(jìn)行AES解密),關(guān)閉當(dāng)前文件,關(guān)閉ZIP流。具體步驟如下:1.以文件流的方式打開ZIP包;2.定位到壓縮文件中的第一個(gè)文件;3.獲得ZIP相關(guān)的文件信息,若是目錄則繼續(xù)遞歸,若是文件則創(chuàng)建文件;4.打開當(dāng)前定位到文件,獲取ZIP信息,判斷是否是AES加密,若是則初始化AES信息結(jié)構(gòu)體,本發(fā)明將該結(jié)構(gòu)體稱為aes_cox;5.從當(dāng)前ZIP包中讀取文件,循環(huán)讀取,判斷是否是AES加密,若是將內(nèi)容解密讀出,并將讀到的內(nèi)容寫入到之前創(chuàng)建的文件中;6.設(shè)置文件時(shí)間戳;7.關(guān)閉當(dāng)前讀取的文件,釋放之前動(dòng)態(tài)分配的AES信息結(jié)構(gòu)的內(nèi)存;8.若ZIP包中還存在其他文件,定位到下一個(gè)文件;9.關(guān)閉打開的流。二.AES加密和解密算法構(gòu)成如圖3所示,AES加密算法的核心部分包括:SubBytes(字節(jié)替代),ShiftRows(行移位),MixColumns(列混淆),AddRoundKey(輪密鑰加)。AES解密算法是加密的逆過程,所以除了AddRoundKey(輪密鑰加)不變外,其余的都需要進(jìn)行逆變換,InvSubBytes(逆字節(jié)替代),InvShiftRows(逆行移位),InvMixColumns(逆列混淆)。1.字節(jié)代替字節(jié)代替的主要功能是通過S盒完成一個(gè)字節(jié)到另外一個(gè)字節(jié)的映射。它是一個(gè)關(guān)于字節(jié)的非線性變換,它將狀態(tài)中的每一個(gè)字節(jié)非線性地變換為另一個(gè)字節(jié),代替表S盒是可逆的;如圖4所示。字節(jié)代替分為:正向字節(jié)代替和逆向字節(jié)代替。2.行移位行移位的功能是實(shí)現(xiàn)一個(gè)4*4矩陣內(nèi)部字節(jié)之間的置換。行移位分為:正向行移位和逆向行移位。正向行移位的操作即是:第一行保存不變,第二行循環(huán)左移1個(gè)字節(jié),第三行循環(huán)左移2個(gè)字節(jié),第四行循環(huán)左移3個(gè)字節(jié),如圖5所示。逆向行移位即是相反的操作。3.列混淆列混淆:是對(duì)一個(gè)狀態(tài)逐列進(jìn)行變換,即使用線性轉(zhuǎn)換來混合每列的四個(gè)字節(jié)。列混淆分為:正向列混淆和逆向列混淆。4.輪密鑰加在輪密鑰加過程中,使用簡(jiǎn)單的按位異或操作,通過密鑰調(diào)度過程對(duì)密鑰進(jìn)行擴(kuò)展而得到輪密鑰,然后明文與相應(yīng)的子密鑰異或即可,即每輪的輸入與輪密鑰異或一次;因此,解密時(shí)再異或上該輪的密鑰即可恢復(fù)輸入。5.密鑰調(diào)度密鑰調(diào)度包括兩部分:密鑰擴(kuò)展和輪密鑰選取。密鑰擴(kuò)展的作用是在數(shù)據(jù)加密/解密前得到輪變換中使用的輪密鑰。綜上所述,從AES加密解密流程圖也可以得知,AES加密和解密都是一個(gè)迭代的過程;在迭代過程中對(duì)數(shù)據(jù)進(jìn)行重復(fù)置換,直到得到最后的明文或密文。三.程序中調(diào)用的APIAPI1:解壓文件voidunzip_extract(char*pZipFile,char*pExtractDir)輸入?yún)?shù):1)解壓文件名稱,2)解壓目錄名稱;返回值:無。API2:打開文件流void*unzOpen(char*pZipFile)輸入?yún)?shù):1)解壓文件名稱;返回值:1)轉(zhuǎn)換成void*形式的文件流指針。API3:定位到第一個(gè)文件intunzGoToFirstFile(void*uf)輸入?yún)?shù):1)文件流指針;返回值:1)0成功,2)-1失敗。API4:打開當(dāng)前文件intunzOpenCurrentFilePassword(void*uf,char*pwd)輸入?yún)?shù):1)文件流指針,2)密鑰(網(wǎng)站加密壓縮ZIP時(shí)的密鑰),返回值:1)0成功,2)-1失敗。API5:讀取當(dāng)前文件內(nèi)容intunzReadCurrentFile(void*uf,char*buf,size_tsize)輸入?yún)?shù):1)文件流指針,2)讀取內(nèi)容,3)內(nèi)容大??;返回值:1)0成功,2)-1失敗。API6:關(guān)閉當(dāng)前文件intunzCloseCurrentFile(void*uf)輸入?yún)?shù):1)文件流指針;返回值:1)0成功,2)-1失敗。API7:定位到下一個(gè)文件intunzGoToNextFile(void*uf)輸入?yún)?shù):1)文件流指針;返回值:1)0成功,2)-1失敗。API8:關(guān)閉文件流intunzClose(void*uf)輸入?yún)?shù):1)文件流指針;返回值:1)0成功,2)-1失敗。API9:逆向列混淆voidcontrary_mixColumns(unsignedchar*col)輸入?yún)?shù):1)處理數(shù)據(jù)(ZIP包中文件的內(nèi)容);返回值:1)混淆處理后的數(shù)據(jù)。API10:逆向字節(jié)替換voidcontrary_subBytes(unsignedchar*col)輸入?yún)?shù):1)處理數(shù)據(jù)(ZIP包中文件的內(nèi)容);返回值:1)逆向字節(jié)替換處理后的數(shù)據(jù)。API11:逆向行移位voidcontrary_shiftRows(unsignedchar*col)輸入?yún)?shù):1)處理數(shù)據(jù)(ZIP包中文件的內(nèi)容);返回值:1)逆向行移位處理后的數(shù)據(jù)。API12:輪密鑰加voidadd_roundKey(unsignedchar*col,unsignedchar*key,intround)輸入?yún)?shù):1)處理數(shù)據(jù)(ZIP包中文件的內(nèi)容),2)密鑰(網(wǎng)站加密壓縮ZIP時(shí)的密鑰),3)輪詢次數(shù);返回值:1)輪密鑰加處理后的數(shù)據(jù)。本發(fā)明分別使用7zip和Zlib對(duì)網(wǎng)站上報(bào)數(shù)據(jù)進(jìn)行解壓測(cè)試,測(cè)試得到的時(shí)間單位為微秒,如下面表1所示;并對(duì)解壓結(jié)果進(jìn)行分析對(duì)比,如圖6所示,該圖的橫坐標(biāo)表示不同文件,縱坐標(biāo)表示解壓所用的時(shí)間。表1.測(cè)試結(jié)果列表文件名/解壓方法7zip(us)Zlib(us)data_1471449694.zip6177002922data_1471453015.zip2563643209data_1471453608.zip1831815564data_1471451806.zip1931806083data_1471450007.zip16939118622data_1471450907.zip25013415472data_1471452105.zip18023136974data_1471451507.zip18455315633data_1471450307.zip2069647315從圖6可得出結(jié)論,采用本發(fā)明的方法,應(yīng)用Zlib庫(kù)進(jìn)行解壓,其在時(shí)間級(jí)上遠(yuǎn)遠(yuǎn)優(yōu)于采用7zip庫(kù)進(jìn)行解壓。以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案而非對(duì)其進(jìn)行限制,本領(lǐng)域的普通技術(shù)人員可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護(hù)范圍應(yīng)以權(quán)利要求書所述為準(zhǔn)。當(dāng)前第1頁(yè)1 2 3