摘要:針對流密碼在文件加密時存在的一些實際問題,例如占用過多內存、加密文件大小受到內存大小限制等,提出將滑動窗口協議中的一些思想應用到流密碼文件加密中來,將流密碼加密中文件加密和文件寫入兩個模塊拆分開來,分別視為“發送方”和“接收方”,利用該協議思想使兩模塊協同工作,在一個稱為“窗口”的緩存區中分別對數據進行讀取加密和寫入保存的操作,以提高加密程序的性能。
關鍵詞:滑動窗口協議;流密碼;多線程;窗口;文件加密
中圖分類號:TP309文獻標識碼: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
滑動窗口協議是在計算機網絡應用領域中的一個用于計算機之間通過網絡傳輸文件的協議。該協議的主要思想是收發雙發都維持一個指定大小N的窗口,要發送的數據分為若干有序塊。開始發送文件后,發送方首先發送前N塊文件塊,然后等待接收方的回復。當接收方依次對接收到的文件塊進行接收確認后,發送方的窗口根據接收到的有序回復依次向后滑動,從而進行后續文件塊的發送。如果發送方暫時沒有接收到有序回復,則發送方的窗口停留在當前狀態進行等待,一直到窗口滑動到下一個塊。
流密碼也稱序列密碼。序列密碼一直是軍隊和政府使用的主要密碼技術之一。其主要原理是通過偽隨機序列發生器產生性能優良的偽隨機序列,使用該序列與明文信息流逐比特異或得到密文序列[1]。偽隨機序列發生器是指輸入真隨機的較短的密鑰(種子)通過某種復雜的運算產生大量的偽隨機位流[2]。由于流密碼長度可靈活變化,且具有運算速度快、密文傳輸中沒有差錯或只有有限的錯誤傳播等優點,目前仍是國際密碼應用的主流,而基于偽隨機序列的流密碼是當今最通用的密碼系統[3]。流密碼加密流程如圖1所示。
從理論上說,數據流的潛在大小是無界的,系統存儲的數據相對數據流大小則是非常有限的[4]。在處理明文信息流的過程中,通常并不是對所有已經到達的數據都感興趣,而是只對最近到達的部分數據感興趣,這樣就需要引入滑動窗口模型[5]。
1 加密程序設計及實現
加密程序應用模塊設計思想,在VS2008開發平臺上,對程序“窗口”模塊、程序的兩個線程模塊即“接收方”線程和“發送方”線程采用MFC框架下的C++語言進行設計開發。
1.1 “窗口”的設計
本文設計了一個大小N為7的“窗口”緩沖區,即該“窗口”緩沖區擁有7個塊單元。每一個塊單元由一個存儲數據的數組和若干標志位組成,具體定義如下:
struct Block{
char Data[50000];
int Flag;
int NextFlag;
BOOL HaveData;
BOOL AbleToWrite;
int IsFinal;
};
7個塊單元首尾相接,形成一個循環隊列。當7個塊依次循環滾動讀取文件數據時,“窗口”緩沖區則依次向后移動。
在塊結構中,Data數組用于緩存文件數據。Flag標志位用于標示本塊序號。NextFlag標志位用于標示本塊指向的下一塊的序號。HaveData標志位用于標示本塊中是否有數據需要寫出,初始值為1。AbleToWrite標志位用于標示本塊是否可以寫入,初始值為true。IsFinal標志位用于標示本塊是否為最后一塊,初始值為0。
1.2 “發送方”與“接收方”的工作流程設計
采用多線程的技術,在程序中使用雙線程來模擬收發雙方。“發送方”的功能定義為文件分塊讀取以及進行加密,“接收方”的功能定義為從塊中讀取數據并寫入加密后的文件。當加密開始后,雙發各自完成各自的工作,互不干擾。
1.2.1 “發送方”線程具體流程設計
“發送方”線程開始時,需將當前塊序號初始化為0。在寫入塊的時候,需判斷該塊是否可寫,即AbleToWrite標志是否為true。在當前塊寫完后,需修改該塊的標志位,即將AbleToWrite置為1,HaveData置為true。如果是最后一塊,還要修改IsFinal標志,將塊內剩余數據長度賦值給該標志。具體的程序流程如圖2所示:
1.2.2 “接收方”線程具體流程設計
“接收方”線程與“發送方”線程同時啟動,并且初始化“接收方”線程當前塊序號為0。但有所不同的是,“接收方”線程啟動之后一段時間一直處于等待狀態,以等待“發送方”線程將窗口中第一塊的讀取加密操作完成。當檢測到當前序號塊的HaveData標志位為true時,即開始從窗口中將數據寫入加密后的文件。如此依次循環,一旦檢測到當前塊的IsFinal標志位為true時,即開始將最后一塊中的數據寫入文件并完成文件寫入。具體的流程如圖3所示。
1.2.3 雙線程協同工作具體流程設計
在“發送方”和“接收方”線程都啟動之后,兩個線程除了完成自己所需完成的任務之外,還要兩者協同工作才能順利的完成文件加密的工作。在滑動窗口思想下兩個線程的協同工作具體流程如圖4所示。
雙線程啟動后,窗口(即一個由塊組成的循環隊列緩存區)位于文件最前端。“發送方”線程開始對窗口內第一個塊緩存數據進行加密,“接收方”線程則處于等待狀態。當“發送方”線程完成第一塊的操作之后,“接收方”檢測到第一塊緩存內有數據需要寫出,“接收方”。
線程停止等待,開始將數據寫出到加密后的文件中。同時,“發送方”線程仍然繼續依次向后對塊緩存中的數據進行加密。當“接收方”線程將窗口最前塊緩存中的數據完全寫出后,窗口向后移動一個塊單位,即循環隊列滾動一個塊單位。在此過程中,如果“發送方”線程寫完了最后一塊緩存而窗口仍未移動的話,“發送方”線程將進行等待,直到窗口向后移動而出現新的塊緩存。窗口移動到最后一個塊緩存則停止移動,當兩個線程完成對窗口緩存中的數據處理操作后,雙線程終止,加密結束。
2 測試結果及分析
所述設計在實現時采用RC4流密碼。測試環境:windows7操作系統;機器配置:2.4Ghz雙核處理器以及2G的內存。
通過實際程序測試,得到以下的結果:1) 在需加密文件大小線程方面,所設計的加密方式適合任意大小的文件,并在實際測試中得到驗證;2) 在文件加密速度方面,所設計加密方式的文件加密速度最低值約為16MB/s,最高值約為20MB/s;3) 在系統資源占用方面,所設計的加密方式占用內存資源保持在設定值,不受文件大小影響。
3 結論與討論
本文介紹了基于滑動窗口協議思想的流密碼多線程文件加密設計。通過實際測試,證明該設計能較好的解決流密碼在加密文件時存在的某些問題,如:1)當需加密文件過大并且不分割文件時,加密程序容易占用過多的內存資源,造成電腦響應緩慢甚至無響應,如果文件大小超過內存大小的話,甚至會造成加密后的文件丟失數據的情況出現。2)如果程序針對1)中所提的問題采用加密一部分保存一部分的話,則會影響加密算法的性能。本文提出的設計實現方案較好的保證了加密的速度,在加密中不至于過多占用內存,并且使需加密的文件大小不受內存大小的限制,因此具有一定的使用價值。
滑動窗口協議思想還可以應用在更多的領域,例如數據流查詢等[6-7]。在各個領域的工作流程中,如果需要使用兩個功能模塊對同一個對象進行操作而兩個功能模塊的工作又必須有一個先后順序時,都可以使用滑動窗口協議思想進行流程設計,這主要因為它具有處理模。
塊間的超強調度能力[8]。當然,在如何進一步提高加密速度等性能方面,還有待于進一步的研究。
參考文獻:
[1] 曹天杰,張永平,畢發明.計算機系統安全[M].北京:高等教育出版社,2007:49.
[2] 曹天杰,張永平,畢發明.計算機系統安全[M].北京:高等教育出版社,2007:49.
[3] 羅啟彬,張 健.流密碼的現狀和發展[J].信息與電子工程,2006,4(1):75-80.
[4] 陳磊松.數據流處理系統的調度策略研究[J].計算機工程與設計,2007,28(8):1845-1847.
[5] 杜威,鄒先霞.基于數據流的滑動窗口機制的研究[J].計算機工程與設計,2005,26(11):2922-2924.
[6] 劉學軍,胡平,徐宏炳,等.基于滑動窗口的在線數據流增量聚集查詢[J].計算機工程,2007,33(21):45-47.
[7] 王偉平,李建中,張冬冬,等.基于滑動窗口的數據流連續J-A查詢的處理方法[J].軟件學報,2006,17(4):740-749.
[8] 裴曉華,張璟,李軍懷.基于滑動窗口協議思想的報表引擎設計與實現[J].微電子學與計算機,2009,26(5):196-199.