摘要:在利用對稱加密算法時,密鑰管理是安全系統考慮的主要問題。現有保存密鑰的方法大都需要借助物理介質來保存,給用戶帶來了不便。為了解決這個問題,該文提出了一種基于口令的加密方案,能很好的解決密鑰保護問題。最后在.Net平臺下編程實現了一個基于口令的加密工具;實現創建自提取的可執行加密文件,使得基于口令的加解密可以獨立的進行。
關鍵詞:信息安全;PE文件;口令加密;Blowfish加密算法; 密碼學
Design and Implementation of the Password Encryption Tool
ZHAI Shuo
(College of Computer Science, China University of Mine and Technology, Xuzhou 221116, China)
Abstract: When using symmetric encryption algorithms, key management is the main issue to security system. Existing ways to save the key almost need to through physical media, bringing users the inconvenience. In order to solve the problem, this paper proposed a password-based encryption scheme; it can be a good solution to the key protection issues. Finally, coding the program to implement a password-based encryption tool on the .Net platform; On this basis, to achieve and create a self-extracting executable encrypted file, so that password-based encryption and decryption can conduct independently.
Key words: information security; PE file; password encryption; blowfish encryption algorithm; cryptography
在信息化的當代社會,計算機和通信網絡已日益結合并得到廣泛應用,在給人們的生活和工作帶來方便的同時,也帶來了許多需要解決的問題,最突出的就是信息安全保密問題[1]。從大的方面來說,已威脅到國家的政治、經濟、軍事、文化、意識形態等領域。從小的方面來說,信息安全問題也是人們能否保護自己個人隱私的關鍵。信息作為一種重要的戰略資源,國際上圍繞信息的獲取、使用和控制的斗爭愈演愈烈。一些發達國家正是利用其信息技術的優勢,一方面向其他國家大肆傾銷其信息產品,另一方面,在其出口的信息系統中植入“陷阱”和“后門”,以控制、破壞和截取別國的信息[2]。對于廣大用戶來說,更為直接、更為有效的方法就是使用信息加密技術。
密鑰管理是安全系統主要考慮的問題。保護密鑰的一個辦法是把它保存在軟盤或U盤中,只有在文件加解密時才使用它;另一個辦法是使用智能卡,存儲密鑰,通過連接在計算機上的特殊讀取裝置進行加解密操作。用軟盤、U 盤或智能卡保存密鑰有一些不方便之處,需要外在的物理媒介來保存密鑰。
1 相關理論
1.1 PE文件格式
PE(Portable Executable) 文件格式是32 位Windows 操作系統引入的可執行文件格式。所有win32 執行體(除了Vxd 和16 位的Dll) 都使用PE文件格式,包括NT 的內核模式驅動程序( kernel mode drivers) 。在PE 文件中,可執行代碼、已初始化的數據、文件資源和重定位信息等數據被按照屬性的不同而放到不同的節中。掌握了PE 文件的結構就可以根據需要來實現對PE 文件數據的修改。PE 文件格式是以自頂而下的順序解釋的,詳見文獻[3]。
2.2 Blowfish算法
Blowfish算法是一個對稱的分組加密密碼算法,執行速度很快,在32位的微處理器上,它加密一個字節數據只需要18個時鐘周期。它還是一種非常緊湊的算法,可以在小于5KB的內存上運行。而且,Blowfish結構簡單、易于實現。
Blowfish是一個64位分組及可變密鑰長度的分組密碼算法,算法由兩部分組成:密鑰擴展和數據加密。密鑰擴展把長度可達到448位的密鑰轉變成總共4168字節的幾個子密鑰。數據加密由一個簡單函數迭代16輪,每一輪由密鑰相關的置換,密鑰相關和數據相關的代替組成。所有的運算都是32位字的加法和異或,僅有的另一個運算是每輪的四個查表。Blowfish使用了大量的子密鑰,這些密鑰必須在加密及解密之前進行預計算,算法的詳細描述見文獻[4]。
2 文件的加密及其實現
2.1 基于口令的加密的實現
密鑰管理是安全系統主要考慮的問題。用軟盤、U 盤或智能卡保存密鑰有一些不方便之處,需要外在的物理媒介來保存密鑰。在保證安全性的前提下,較簡便的方法是將密鑰保存在計算機文件系統中,使用基于口令的加密(Password Based Encryption,PBE)技術對密鑰加密,然后用本地文件系統的權限加以保護。
在本文設計中將口令作用于對稱加密算法的密鑰擴展以實現基于口令的加密,加密的關鍵代碼如下:
// 加密實現
void BlowFishEnc::BlowFishEnc_encipher(DWORD *xl, DWORD *xr)
{
union awordXl, Xr; Xl.dword = *xl;
Xr.dword = *xr; Xl.dword ^= PArray[0];
//16輪迭代
ROUND(Xr, Xl, 1);ROUND(Xl, Xr, 2);
ROUND(Xr, Xl, 3);ROUND(Xl, Xr, 4);
ROUND(Xr, Xl, 5);ROUND(Xl, Xr, 6);
ROUND(Xr, Xl, 7);ROUND(Xl, Xr, 8);
ROUND(Xr, Xl, 9);ROUND(Xl, Xr, 10);
ROUND(Xr, Xl, 11); ROUND(Xl, Xr, 12);
ROUND(Xr, Xl, 13); ROUND(Xl, Xr, 14);
ROUND(Xr, Xl, 15); ROUND(Xl, Xr, 16);
Xr.dword ^= PArray[17];*xr = Xl.dword;
*xl = Xr.dword;
}
3 文件自解密的實現
文件的自解密實現了解密的獨立,本文中將經過加密的源文件附加到一個可執行文件((Encrypted).exe)上,然后通過運行這個可執行文件實現文件的自解密。
3.1 創建自提取的可執行加密文件
由PE文件的格式,當操作系統正在執行一個可執行文件時,根據PE的頭執行文件,所以PE的頭是一個很大的表格,其中包含了許多PE 文件裝載器要用到的重要域。在PE 頭中包含了PE 文件標識(Signature)、PE 文件頭(File header)和PE 可選頭(Optional header)三部分。因為不允許修改可執行本身,所以我們以文件的末尾為出發點。
為了使附加方法和分離方法使用相同的方式,需要設置格式如表1所示。
使用此格式,我們不會限制在文件名或者文件內容的特定大小中。
很明顯,當我們從合并后的文件(可執行程序+附后)分離文件時,文件的結尾是新的文件結尾,所以結尾的大小是固定并將為我們提供有關所附文件的信息,這一點是非常重要的。上表中固定的部分是“文件名長度指針”和“簽名”部分。
為了執行這樣的任務,我們需要兩個基本方法:
Attach File —附加文件,以自我提取可執行文件;Detach File —獲取附加文件,并寫入到磁盤;另外可以使上述方法方便實現Check Signature—檢查文件是否有文件附加于它;利用上述方法,可以容易的創建一個自提取可執行文件。
自解密類的定義如下:
class SelfExtract
{ public:
//構造函數, filename是想要附加或分離的文件
SelfExtract(const char *filename = 0);
~SelfExtract(void);
//自提取文件名賦予構造函數中給出的文件
//如果成功完成返回值是0 ,如果失敗了,返回值大于0
int attachFile(const char *filename, const char *writeName = 0);
//分離文件到指定的文件夾
//空的輸出文件夾將導致分離到當前文件夾
//如果你想知道分離文件的文件名,detachedFile是輸出參數。
// detachedSize是detachedFile的大小。
//如果成功完成返回值是0 ,如果失敗了,返回值大于0
int detachFile(const char *writeFile, char *detachedFile = 0, int detachedSize = 0);
//檢查是否 _sourceFile 有附加的文件
bool checkSignature();
//改變文件名給構造函數
void setFilename(const char *filename) { strcpy(_sourceFile, filename); }
//使用detachFile方法獲得分離文件的最后文件名
char *getDetached() { return _lastDetached; }
private:
char _sourceFile[MAX_PATH];
char _lastDetached[MAX_PATH];
};
4 文件加解密測試
選擇“加密”功能,點擊“未加密文件瀏覽按鈕”選擇測試文本文件為E:\\MyDocuments\\s01\\測試\est1.txt,選擇加密test1.txt,創建可執行加密文件test1.txt[Encrypted].exe并刪除源文件,操作如圖1所示;加密后,文件夾里的文件如圖2 所示。
運行可執行文件,提示輸入解密密碼,如圖3所示;解密之后就可以瀏覽文件內容了,如圖4所示;為保證安全性,也可以在閱讀后刪除文件。
5 結論
本文提出的文件加密技術所使用的加密算法屬于對稱加密算法。該算法主要采用一個簡單函數迭代16輪,每一輪由密鑰相關的置換,密鑰相關和數據相關的代替組成來實現對數據的加密。并使用口令對算法的密鑰進行加密來保證密鑰的安全管理。工具還實現了自提取可執行文件的創建,使得加密文件的解密可以獨立的完成。除此之外,工具中多線程的應用提高了加解密的速度。因此該工具能夠實現重要文件的安全、快速地加解密,同時能保證信息的完整性。
參考文獻:
[1] 胡志遠.口令破解與加密技術[M].北京:機械工業出版社,2003.
[2] Schneier B.應用密碼學:協議、算法與C源程序[M].吳世忠,祝世雄,張文政,等,譯.北京:機械工業出版社,2000.
[3] 郭小晉,沈春林.32位Windows系統下PE文件的軟件加密解密方法[J].計算機與數字工程,2006,34(3):51-53.
[4] 鐘黔川,朱清新.Blowfish密碼系統分析[J].計算機應用,2007,24(12):2940-2944.