摘要:針對流密碼在文件加密時(shí)存在的一些實(shí)際問題,例如占用過多內(nèi)存、加密文件大小受到內(nèi)存大小限制等,提出將滑動(dòng)窗口協(xié)議中的一些思想應(yīng)用到流密碼文件加密中來,將流密碼加密中文件加密和文件寫入兩個(gè)模塊拆分開來,分別視為“發(fā)送方”和“接收方”,利用該協(xié)議思想使兩模塊協(xié)同工作,在一個(gè)稱為“窗口”的緩存區(qū)中分別對數(shù)據(jù)進(jìn)行讀取加密和寫入保存的操作,以提高加密程序的性能。
關(guān)鍵詞:滑動(dòng)窗口協(xié)議;流密碼;多線程;窗口;文件加密
中圖分類號:TP309文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2009)35-9887-02
Application of Sliding Window Protocols Thinking in Files Encryption with Stream Cipher
CHEN Xi, YANG Ji-long, ZHANG Qiong-wen, YANG Wei-kang
(College of Computer Science and Engineering University of Electronic Science and Technology of China, Chengdu 611731,China)
Abstract: In connection with some problems in the fields of files encryption with stream cipher, for example, taking too much memory and, limiting encrypted file's size, explains the application of sliding window protocols to encrypting files. In order to improve the performance of encryption, the files encryption should be divided into two parts, the file encryption part and file writing part, regarded them as a sender and a receiver. With the thinking of the protocols, the two parts work together in a cache called \"window\", and data is read and encrypted, then written and stored separately. The capability of encryption program is improved.
Key words: sliding window protocols; stream cipher; multi-threading; window; file encryption
滑動(dòng)窗口協(xié)議是在計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用領(lǐng)域中的一個(gè)用于計(jì)算機(jī)之間通過網(wǎng)絡(luò)傳輸文件的協(xié)議。該協(xié)議的主要思想是收發(fā)雙發(fā)都維持一個(gè)指定大小N的窗口,要發(fā)送的數(shù)據(jù)分為若干有序塊。開始發(fā)送文件后,發(fā)送方首先發(fā)送前N塊文件塊,然后等待接收方的回復(fù)。當(dāng)接收方依次對接收到的文件塊進(jìn)行接收確認(rèn)后,發(fā)送方的窗口根據(jù)接收到的有序回復(fù)依次向后滑動(dòng),從而進(jìn)行后續(xù)文件塊的發(fā)送。如果發(fā)送方暫時(shí)沒有接收到有序回復(fù),則發(fā)送方的窗口停留在當(dāng)前狀態(tài)進(jìn)行等待,一直到窗口滑動(dòng)到下一個(gè)塊。
流密碼也稱序列密碼。序列密碼一直是軍隊(duì)和政府使用的主要密碼技術(shù)之一。其主要原理是通過偽隨機(jī)序列發(fā)生器產(chǎn)生性能優(yōu)良的偽隨機(jī)序列,使用該序列與明文信息流逐比特異或得到密文序列[1]。偽隨機(jī)序列發(fā)生器是指輸入真隨機(jī)的較短的密鑰(種子)通過某種復(fù)雜的運(yùn)算產(chǎn)生大量的偽隨機(jī)位流[2]。由于流密碼長度可靈活變化,且具有運(yùn)算速度快、密文傳輸中沒有差錯(cuò)或只有有限的錯(cuò)誤傳播等優(yōu)點(diǎn),目前仍是國際密碼應(yīng)用的主流,而基于偽隨機(jī)序列的流密碼是當(dāng)今最通用的密碼系統(tǒng)[3]。流密碼加密流程如圖1所示。
從理論上說,數(shù)據(jù)流的潛在大小是無界的,系統(tǒng)存儲(chǔ)的數(shù)據(jù)相對數(shù)據(jù)流大小則是非常有限的[4]。在處理明文信息流的過程中,通常并不是對所有已經(jīng)到達(dá)的數(shù)據(jù)都感興趣,而是只對最近到達(dá)的部分?jǐn)?shù)據(jù)感興趣,這樣就需要引入滑動(dòng)窗口模型[5]。
1 加密程序設(shè)計(jì)及實(shí)現(xiàn)
加密程序應(yīng)用模塊設(shè)計(jì)思想,在VS2008開發(fā)平臺(tái)上,對程序“窗口”模塊、程序的兩個(gè)線程模塊即“接收方”線程和“發(fā)送方”線程采用MFC框架下的C++語言進(jìn)行設(shè)計(jì)開發(fā)。
1.1 “窗口”的設(shè)計(jì)
本文設(shè)計(jì)了一個(gè)大小N為7的“窗口”緩沖區(qū),即該“窗口”緩沖區(qū)擁有7個(gè)塊單元。每一個(gè)塊單元由一個(gè)存儲(chǔ)數(shù)據(jù)的數(shù)組和若干標(biāo)志位組成,具體定義如下:
struct Block{
char Data[50000];
int Flag;
int NextFlag;
BOOL HaveData;
BOOL AbleToWrite;
int IsFinal;
};
7個(gè)塊單元首尾相接,形成一個(gè)循環(huán)隊(duì)列。當(dāng)7個(gè)塊依次循環(huán)滾動(dòng)讀取文件數(shù)據(jù)時(shí),“窗口”緩沖區(qū)則依次向后移動(dòng)。
在塊結(jié)構(gòu)中,Data數(shù)組用于緩存文件數(shù)據(jù)。Flag標(biāo)志位用于標(biāo)示本塊序號。NextFlag標(biāo)志位用于標(biāo)示本塊指向的下一塊的序號。HaveData標(biāo)志位用于標(biāo)示本塊中是否有數(shù)據(jù)需要寫出,初始值為1。AbleToWrite標(biāo)志位用于標(biāo)示本塊是否可以寫入,初始值為true。IsFinal標(biāo)志位用于標(biāo)示本塊是否為最后一塊,初始值為0。
1.2 “發(fā)送方”與“接收方”的工作流程設(shè)計(jì)
采用多線程的技術(shù),在程序中使用雙線程來模擬收發(fā)雙方?!鞍l(fā)送方”的功能定義為文件分塊讀取以及進(jìn)行加密,“接收方”的功能定義為從塊中讀取數(shù)據(jù)并寫入加密后的文件。當(dāng)加密開始后,雙發(fā)各自完成各自的工作,互不干擾。
1.2.1 “發(fā)送方”線程具體流程設(shè)計(jì)
“發(fā)送方”線程開始時(shí),需將當(dāng)前塊序號初始化為0。在寫入塊的時(shí)候,需判斷該塊是否可寫,即AbleToWrite標(biāo)志是否為true。在當(dāng)前塊寫完后,需修改該塊的標(biāo)志位,即將AbleToWrite置為1,HaveData置為true。如果是最后一塊,還要修改IsFinal標(biāo)志,將塊內(nèi)剩余數(shù)據(jù)長度賦值給該標(biāo)志。具體的程序流程如圖2所示:
1.2.2 “接收方”線程具體流程設(shè)計(jì)
“接收方”線程與“發(fā)送方”線程同時(shí)啟動(dòng),并且初始化“接收方”線程當(dāng)前塊序號為0。但有所不同的是,“接收方”線程啟動(dòng)之后一段時(shí)間一直處于等待狀態(tài),以等待“發(fā)送方”線程將窗口中第一塊的讀取加密操作完成。當(dāng)檢測到當(dāng)前序號塊的HaveData標(biāo)志位為true時(shí),即開始從窗口中將數(shù)據(jù)寫入加密后的文件。如此依次循環(huán),一旦檢測到當(dāng)前塊的IsFinal標(biāo)志位為true時(shí),即開始將最后一塊中的數(shù)據(jù)寫入文件并完成文件寫入。具體的流程如圖3所示。
1.2.3 雙線程協(xié)同工作具體流程設(shè)計(jì)
在“發(fā)送方”和“接收方”線程都啟動(dòng)之后,兩個(gè)線程除了完成自己所需完成的任務(wù)之外,還要兩者協(xié)同工作才能順利的完成文件加密的工作。在滑動(dòng)窗口思想下兩個(gè)線程的協(xié)同工作具體流程如圖4所示。
雙線程啟動(dòng)后,窗口(即一個(gè)由塊組成的循環(huán)隊(duì)列緩存區(qū))位于文件最前端?!鞍l(fā)送方”線程開始對窗口內(nèi)第一個(gè)塊緩存數(shù)據(jù)進(jìn)行加密,“接收方”線程則處于等待狀態(tài)。當(dāng)“發(fā)送方”線程完成第一塊的操作之后,“接收方”檢測到第一塊緩存內(nèi)有數(shù)據(jù)需要寫出,“接收方”。
線程停止等待,開始將數(shù)據(jù)寫出到加密后的文件中。同時(shí),“發(fā)送方”線程仍然繼續(xù)依次向后對塊緩存中的數(shù)據(jù)進(jìn)行加密。當(dāng)“接收方”線程將窗口最前塊緩存中的數(shù)據(jù)完全寫出后,窗口向后移動(dòng)一個(gè)塊單位,即循環(huán)隊(duì)列滾動(dòng)一個(gè)塊單位。在此過程中,如果“發(fā)送方”線程寫完了最后一塊緩存而窗口仍未移動(dòng)的話,“發(fā)送方”線程將進(jìn)行等待,直到窗口向后移動(dòng)而出現(xiàn)新的塊緩存。窗口移動(dòng)到最后一個(gè)塊緩存則停止移動(dòng),當(dāng)兩個(gè)線程完成對窗口緩存中的數(shù)據(jù)處理操作后,雙線程終止,加密結(jié)束。
2 測試結(jié)果及分析
所述設(shè)計(jì)在實(shí)現(xiàn)時(shí)采用RC4流密碼。測試環(huán)境:windows7操作系統(tǒng);機(jī)器配置:2.4Ghz雙核處理器以及2G的內(nèi)存。
通過實(shí)際程序測試,得到以下的結(jié)果:1) 在需加密文件大小線程方面,所設(shè)計(jì)的加密方式適合任意大小的文件,并在實(shí)際測試中得到驗(yàn)證;2) 在文件加密速度方面,所設(shè)計(jì)加密方式的文件加密速度最低值約為16MB/s,最高值約為20MB/s;3) 在系統(tǒng)資源占用方面,所設(shè)計(jì)的加密方式占用內(nèi)存資源保持在設(shè)定值,不受文件大小影響。
3 結(jié)論與討論
本文介紹了基于滑動(dòng)窗口協(xié)議思想的流密碼多線程文件加密設(shè)計(jì)。通過實(shí)際測試,證明該設(shè)計(jì)能較好的解決流密碼在加密文件時(shí)存在的某些問題,如:1)當(dāng)需加密文件過大并且不分割文件時(shí),加密程序容易占用過多的內(nèi)存資源,造成電腦響應(yīng)緩慢甚至無響應(yīng),如果文件大小超過內(nèi)存大小的話,甚至?xí)斐杉用芎蟮奈募G失數(shù)據(jù)的情況出現(xiàn)。2)如果程序針對1)中所提的問題采用加密一部分保存一部分的話,則會(huì)影響加密算法的性能。本文提出的設(shè)計(jì)實(shí)現(xiàn)方案較好的保證了加密的速度,在加密中不至于過多占用內(nèi)存,并且使需加密的文件大小不受內(nèi)存大小的限制,因此具有一定的使用價(jià)值。
滑動(dòng)窗口協(xié)議思想還可以應(yīng)用在更多的領(lǐng)域,例如數(shù)據(jù)流查詢等[6-7]。在各個(gè)領(lǐng)域的工作流程中,如果需要使用兩個(gè)功能模塊對同一個(gè)對象進(jìn)行操作而兩個(gè)功能模塊的工作又必須有一個(gè)先后順序時(shí),都可以使用滑動(dòng)窗口協(xié)議思想進(jìn)行流程設(shè)計(jì),這主要因?yàn)樗哂刑幚砟!?/p>
塊間的超強(qiáng)調(diào)度能力[8]。當(dāng)然,在如何進(jìn)一步提高加密速度等性能方面,還有待于進(jìn)一步的研究。
參考文獻(xiàn):
[1] 曹天杰,張永平,畢發(fā)明.計(jì)算機(jī)系統(tǒng)安全[M].北京:高等教育出版社,2007:49.
[2] 曹天杰,張永平,畢發(fā)明.計(jì)算機(jī)系統(tǒng)安全[M].北京:高等教育出版社,2007:49.
[3] 羅啟彬,張 健.流密碼的現(xiàn)狀和發(fā)展[J].信息與電子工程,2006,4(1):75-80.
[4] 陳磊松.數(shù)據(jù)流處理系統(tǒng)的調(diào)度策略研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2007,28(8):1845-1847.
[5] 杜威,鄒先霞.基于數(shù)據(jù)流的滑動(dòng)窗口機(jī)制的研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2005,26(11):2922-2924.
[6] 劉學(xué)軍,胡平,徐宏炳,等.基于滑動(dòng)窗口的在線數(shù)據(jù)流增量聚集查詢[J].計(jì)算機(jī)工程,2007,33(21):45-47.
[7] 王偉平,李建中,張冬冬,等.基于滑動(dòng)窗口的數(shù)據(jù)流連續(xù)J-A查詢的處理方法[J].軟件學(xué)報(bào),2006,17(4):740-749.
[8] 裴曉華,張璟,李軍懷.基于滑動(dòng)窗口協(xié)議思想的報(bào)表引擎設(shè)計(jì)與實(shí)現(xiàn)[J].微電子學(xué)與計(jì)算機(jī),2009,26(5):196-199.