??? 摘 要: 在對DES分組密碼算法詳細介紹的基礎上,基于MFC設計實現了DES算法的可視化演示平臺。該平臺動態顯示DES加密過程中每一階段密文和密鑰的變換情況,通過再現DES加/解密過程的途徑,使人們容易理解這一復雜的迭代過程.?
??? 關鍵詞: MFC; DES; 可視化; 密鑰
?
??? 隨著計算機和Internet技術的普及,網絡通信已經滲透到社會的各個方面,信息安全問題已受到人們極大的關注。如何保證信息在傳送時不會被竊密者竊取并破譯,是網絡技術人員以及密碼學家們所面臨的問題。要想使信息可靠傳輸,發信者必須對所發的數據(即明文)通過加密系統變成密文,收信者收到密文后再用相應的解密系統對密文解密恢復成明文。而《密碼學新動向》的發表和美國數據加密標準DES的頒布實施標志著密碼學的誕生,密碼學在網絡安全方面發揮著越來越重要的作用。?
??? 目前常用的密碼系統根據其加密方式,可分為基于信息理論的密碼系統和基于復雜性理論的密碼系統,前者是以香農定理為理論依據,后者則是通過復雜算法來實現,主要有RSA公鑰密碼算法和DES分組密碼算法. 在國內,隨著三金工程(金橋工程、金關工程和金卡工程)、尤其是金卡工程的啟動,DES算法在Pos、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收費站等領域被廣泛使用,以此來實現關鍵數據的保密。如信用卡持卡人的PIN加密傳輸、IC卡與Pos間的雙向認證、金融交易數據包的MAC校驗等均用到DES算法。本文將詳細介紹DES分組密碼算法,并且設計實現基于MFC的DES算法可視化演示平臺。該平臺的設計與實現能方便觀測DES算法加/解密過程中密文和密鑰在各階段的變化過程,形象地再現了DES算法加/解密的迭代過程。?
1 DES分組密碼算法?
??? DES (Data Encryption Standard )算法是1977年由美國國家標準局NBS(National Bureau of Standard)頒布的標準,用于商業和非機密的政府應用領域的加密,是在IBM的Lucifer算法的基礎上設計的,后被國家標準局采用[2]。?
??? 簡單地說,密碼算法只不過是兩種基本加密技術——混亂和擴散的組合。DES基本分組也是這些技術的組合(先代替后置換),它基于密鑰作用于明文。DES有16輪,這意味著要在明文分組上16次實施相同的組合技術,如圖1所示。?
?
?
??? DES算法的入口參數有Key、Data、Mode三個,其中Key為8 B,共64 bit,是DES算法的工作密鑰;Data是8 B、64 bit的被加/解密的數據;Mode為工作方式,有解密和加密兩種。 ?
??? 在通信網絡的兩端,雙方約定一致的Key,在通信的源點用Key對核心數據進行加密,然后以密文形式在公共通信網(如電話網)中傳輸到目的地后,用同樣的Key對密文進行解密,便再現了明文形式的核心數據。這樣就保證了核心數據在公共網絡中傳輸的安全性和可靠性。通過定期同時更新通信網絡中源端和目的端的Key,便能提高數據的保密性。?
1.1? DES算法概述?
??? DES是一個分組加密算法,一次加密64 bit的明文分組,輸出是64 bit的密文分組。DES對64 bit的明文分組進行操作,首先通過一個初始置換,將明文分成左半部分和右半部分,各長32 bit,然后進行16輪完全相同的運算。經過16輪后,左、右半部分合在一起經過一個末置換(初始置換的逆過程),這樣就完成了該算法。?
??? 其中Bi是第i次迭代結果,Li和Ri是Bi的左半部分和右半部分,Ki是第i輪的密鑰,F是實現代替、置換及密鑰異或等運算的函數。 ?
??? 如圖2所示,從密鑰的56 bit中選出48 bit,通過一個擴展置換將數據的右半部分擴展成48 bit,并通過一個異或操作與48 bit密鑰結合;通過8個S盒將48 bit替代成新的32 bit數據,再將其置換一次,這四步運算構成了函數F(Ri,Ki+1)。通過一個異或運算將函數F(Ri, Ki+1)的輸出與左半部分結合,原來的右半部分即成為左半部分。將該操作重復16次便實現了DES的16輪運算。?
?
?
1.2 函數F(Ri,Ki+1)的計算?
??? 如圖3所示,E盒擴展置換、與密鑰間的異或運算、S盒壓縮替代和P盒置換構成了函數F(Ri,Ki+1),函數的計算過程為: ?
??? (1)利用固定擴展E將Ri擴展成一個長度為48 bit的串E(Ri)。 ?
??? 并將結果分成8個長度為6的bit串。?
??? (3) 48? bit的輸入數據通過8個S盒S1、S2、S3、S4、S5、S6、S7、S8后,輸出32? bit的數據Y。?
??? (4)將長度為32?? bit的串Y通過一個固定置換P,將最終的置換結果記為F(Ri,Ki+1)(0≤i≤15)。?
?
?
1.3 密鑰置換?
??? DES算法一開始,由于不考慮每個字節的第8 bit,DES的密鑰由64 bit減至56 bit,每個字節的第8 bit作為奇偶校驗位以確保密鑰不發生錯誤。在DES的每一輪中,從56 bit的密鑰產生出不同的48 bit子密鑰, 這些子密鑰根據文獻[3]中給出的置換方式確定。?
??? 首先,56 bit密鑰被分成兩部分,每部分28 bit。其次根據輪數,這兩部分分別循環左移1 bit或28 bit。從第1輪到第16輪的移動位數分別為:1、1、2、2、2、2、2、2、1、2、2、2、2、2、2、1,最后從56 bit中選出48 bit。因為這個運算不僅置換了每位的順序,同時也選擇了密鑰,因而被稱為壓縮置換,這個運算提供了一組48 bit的集。文獻[4]中給出具體的壓縮置換方法。例如將處在第33 bit的那一位在輸出時移動到第35 bit的位置,而處于第18 bit的那一位被略去。圖4所示為DES算法密鑰的生成過程。?
?
?
??? 對于每一個i(0≤i≤16),有Ci=LSi(Ci-1)、Di=LSi(Di-1)、Ki=PC-2(CiDi),其中LSi表示一個或兩個位置的左循環移位,不同輪次移位的位數不同。PC-1和PC-2是兩種不同的基本置換。?
1.4? S盒壓縮?
??? S盒是DES算法強大功能的源泉,?? S盒定義了DES算法的替換模式,每個S盒有16列和4行,它的每個元素是一個4? bit的塊,通常用十進制表示。S盒的列號為0~15,而行號為0~3,共有8種不同的S盒。48? bit的輸入數據經過S盒壓縮替代后變為32 bit的輸出數據。S盒的壓縮替代原理為:對于每個S盒而言有6 bit的輸入數據,假如輸入數據為b1b2b3b4b5b6b7b8,Si盒以b1b6的值為行標,以b2b3b4b5的值為列標,在Si盒中找出相應位置的值作為輸出。該值的二進制表示長度為4 bit,這樣Si盒就將6 bit的輸入數據壓縮替代為4 bit輸出數據。?
??? 參考文獻[5]中詳細描述了8個S盒的內部設計形式,并且總結出S盒的特征為:?
??? (1) S盒的每行是列號的一個非線性映射,這種非線性特征給定了一個輸入輸出值的集合,很難預計S盒的輸出。 ?
??? (2) 改變S盒的一個輸入位,至少會改變兩位輸出。?
1.5 DES算法安全性描述?
??? DES分組加密算法具有極高的安全性,到目前為止,除了窮舉搜索法對DES算法攻擊外,還沒有發現更有效的方法。而56 bit長密鑰的窮舉空間為256,這就意味著,如果一臺計算機的速度為一秒鐘檢測一百萬個密鑰,則它搜索完所有的密鑰需要2 285年的時間,可見,這是很難實現的,隨著科學技術的發展,當出現高速計算機后,可以考慮把DES密鑰的長度增長一些,以提高算法的安全性,達到更高的保密程度,如3DES。?
??? DES算法中只用到64 bit密鑰中的56 bit,而第8、16、24、32、40、48、56和64 bit并沒有參與DES運算,即DES的安全性是基于除這8 bit以外的其余56 bit的組合空間256得以保證的。在實際應用中,應避開這8 bit作為有效數據,才能保證DES算法安全可靠的發揮作用。如果使用密鑰Key的這8 bit作為有效數據,將不能保證DES加密數據的安全性,會對運用DES來達到保密作用的系統產生的數據帶來被破譯的危險,留下被攻擊的極大隱患。這8 bit的作用只是作為密鑰的奇偶校驗位,在實際應用中能比較容易地避開這8 bit用其他56 bit作為有效數據。?
2? 演示平臺功能模塊設計?
??? 根據DES算法的加/解密過程,基于MFC的DES算法可視化演示平臺包含如圖5所示的模塊。?
?
?
??? 該演示平臺主要有兩大功能模塊,即加密模塊和解密模塊,其中加密模塊是將輸入的8 B明文在密鑰的作用下經過一系列的變換轉化為十六進制的密文,在該模塊中動態實現DES算法16輪中每輪密鑰和密文的輸出,同時給出每輪密文的內部變換過程。而解密模塊是加密模塊的逆過程,該模塊將十六進制的密文在密鑰的作用下還原為初始的明文。?
3 技術實現?
3.1 加密模塊?
??? (1) 密鑰的產生
??? 加密模塊是對輸入平臺的8 bit明文進行加密,產生16進制密文的過程,這一過程中需要密鑰與密文進行16輪的相關操作,而該密鑰可以由用戶自主輸入8 B的字符,也可以由平臺隨機產生。密鑰的隨機產生函數如下:?
??? void GetChar()??????????????????????????????????? //獲取隨機密鑰?
??? {??? ……?
??? CString String_Array='1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';?
??? ??? str= new char[5200];??????? ????????????????????? //申請內存?
??????? for(i=0;i<100;i++)//構建輔助數組,限制密鑰的形式?
????for(j=0;j<52;j++)?
???? ?? str[i*52+j]= String_Array [j];?? ???????? //形成序列數組?
??? srand(GetTickCount());? ??????????????? //用時間做隨機種子?
??? ??? for(i=0;i<5200;i++)?
????{ ?
????? k=(rand()+i)%5200;? ? //隨機生成序號以便交換?
? ?????? ……?????????????????? //交換數組中str[i]和str[k]的值?
????? }?
??? ……??????? //從輔助數組中隨機選取8個字符作為密鑰?
??? delete[] str;????????????????????????????????????????????? //釋放空間?
}?
??? (2) 加密過程?
??? 加密過程要求輸入64 bit的明文數據,首先對該明文數據進行初始置換,在密鑰控制下對輸入的明文進行16輪的迭代,最后對迭代后的輸出結果經過末置換變換后輸出64 bit的密文數據。因為這一過程對所有傳輸的數據都進行了加密,所以加密過程對用戶是透明的。本文加密函數的主要部分如下所示:?
??? void DES_JiaMiFunction() ?
??? {??? ……?
???? ?DES_Process(); //DES處理,獲取密鑰與左右各32 bit密文?
??? ? FinalIP(Lbts,Rbts,outbts);??????????????? ????????????//末置換?
??? ……?
??? Show_Text(m_cfile);?????????????????? //顯示最后的加密密文?
}?
??? void DES_Process() ?
{??? ……?
??? GetDlgItemText(IDC_EDIT2,m_mfile);?? //獲取明文字符串?
??? ……?? //判斷明文是否是8 B,將明文存儲在數組中?
??? chartobits(inch,inbts);???????????? //明文字符轉化為比特流?
??? GetDlgItemText(IDC_EDIT1,m_key); //獲取密鑰字符串,m_key位存放密鑰的數組?
??? ……//判斷密鑰是否是8 B,?? 將密鑰存儲在數組中?
??? chartobits(inkey,keybts);????????? //密鑰字符轉化為比特流?
??? InitIP(inbts,Lbts,Rbts);?? //初始置換,把明文比特流分成左右各32 bit分別保存在Lbts、Rbts中?
??? pc1tran(keybts,Cbts28,Dbts28);???? ???????????????//pc-1置換?
??? for(cnt=0;cnt<16;cnt++)?
{?
??????? leftshift(Cbts28,ls[cnt]);??????????????????????? //循環左移?
??????? leftshift(Dbts28,ls[cnt]);??????????????????????? //循環左移?
??????? pc2tran(Cbts28,Dbts28,Kbts48);???????????? //pc-2置換?
??????? subkey[cnt]=Kbts48;?
??? }????????? //16輪密鑰循環,pc-2置換后保存在數組中?
??? for(cnt=0;cnt<16;cnt++)?
??? {//經過16輪運算過后得到的Lbts、Rbts
? ??????? oldLbts=Lbts[cnt];?
??? ????? Lbts[cnt+1]=Rbts[cnt];?
??? ????? ftran(Rbts,subkey.bitarr[cnt],fRes);?
??? //F()函數運算?
??? }?
??? flag=1; //flag為全局變量,標記過程所處的階段?
}?
??? (3) 密文內部變換過程的實現?
??? 平臺需顯示出每一輪操作中密文和密鑰具體的變換過程,本文在實現該功能時,采用定義全局變量flag來標記變換過程所到達的階段。因為F(Ri,Ki+1)函數中的各操作之間具有一定的先后順序性,所以必須保證各操作按其相應的先后順序進行。當點擊相應的操作按鈕(如圖8所示)時,平臺首先會對flag的值進行判斷,根據flag的值,補充尚未進行的操作或者還原多余的操作。不同的flag值對應不同的操作階段:flag=1加密結束;flag=2表示E盒置換完畢;flag=3表示與密鑰進行了異或操作;flag=4表示S盒代替結束;flag=5表示P盒置換完成。?
3.2 解密模塊?
??? 在經過所有的代替、置換、異或和循環移動之后,會認為解密算法和加密算法完全不同,且像加密算法一樣具有很強的混亂效果。其實恰恰相反,經過選擇的各種操作,獲得了一個非常有用的性質:加密和解密可使用相同的算法,即DES算法是對稱的。?
??? DES使用相同的函數來加密或解密每個分組是可能的,二者唯一的不同之處在于密鑰的次序相反。就是說,如果各輪的加密密鑰分別是K1、K2、K3……K16,則解密密鑰就是K16、K15、K14、……K1,為各輪產生密鑰的算法也是循環的。密鑰向右移動,每次移動的次數分別是0、1、2、2、2、2、2、2、1、2、2、2、2、2、2、1。?
??? void DES_JieMiFunction()?
??? {??? ……?
??????? GetDlgItemText(IDC_EDIT2,m_cfile);?????? //獲取密文???????? ……//判斷密文是否是8 B?
??????? GetDlgItemText(IDC_EDIT1,m_key);??????? //獲取密鑰?
??? ……?? //判斷密鑰是否是8 B,將密鑰保存到數組中?
??????? chartobits(inkey,keybts);?? ? //密鑰字符轉化為比特流?
??? ……???????????????????? //將密文字符串中的空格去掉?
??? ……??????????? //將十六進制的密文數轉化為二進制?
??????? InitIP(inbts,Rbts,Lbts);//初始置換?
??????? pc1tran(keybts,Cbts28,Dbts28);//pc-1置換?
??????? ……//16輪密鑰循環,pc-2置換?
??????? ……//經過16輪運算后得到Lbts,Rbts?
??????? FinalIP(Rbts,Lbts,outbts);//末置換?
??? ……//將明文二進制結果轉化為字符?
??????? Show_Text(m_mfile);?????????? //在文本框中顯示明文?
??? }?
4 系統功能與測試?
4.1 界面介紹?
??? 本平臺主要包括加密和解密兩大基本模塊,下面將對平臺的設計過程做詳細介紹。?
??? (1) 加密模塊界面?
??? 在加密模塊中,將16輪變換過程中的密文和密鑰顯示出來,同時該模塊還將加密過程的內部變化過程,如E盒擴充、與密鑰進行異或、S盒替換、P盒置換等操作單獨顯示其變換前后密文的變化情況,方便了解加密的具體過程;加密模塊可以同時顯示出每一輪的密鑰和密文。經過一系列變換后,加密模塊顯示出最終的十六進制密文。?
??? (2) 解密模塊界面?
??? 該解密模塊界面中將接收到的經過加密后的密文與密鑰輸入到該界面的文本框中,該模塊經過變換后將密文還原成與其對應的明文。?
4.2 演示效果測試?
??? 平臺實現后,分別對該平臺的加密和解密模塊的效果進行了測試。?
??? (1) 加密效果測試?
??? 本文使用系統隨機產生的密鑰對輸入的明文進行加密效果測試。點擊加密界面的“點擊此處產生隨機密鑰” 按鈕產生隨機密鑰:wlO6214G,同時輸入明文:12點總攻。如圖6所示,可以查看16輪變換過程中每一輪密鑰和密文的具體值。點擊“產生十六進制密文”按鈕,平臺顯示最終的加密密文:fa 59 9f f0 1a f4 d7 11。?
?
?
??? 圖7所示為加密過程中,某一輪函數F(Ri,Ki+1)計算過程中密文內部變換的演示,點擊“E盒擴充”、“與密鑰進行異或” “S盒替換”和“P盒置換”等按鈕,文本框中將顯示出該輪變換中相應操作前后密文的變化情況。?
?
?
??? (2) 解密效果測試?
??? 加密過程結束后,記住加密過程所使用的密鑰與密文,在解密模塊的界面上相應文本框中輸入密鑰與密文,如圖8所示。點擊“解密”按鈕,平臺顯示出與密文相對應的明文:12點總攻。 ?
?
?
??? 基于MFC的DES算法的可視化演示平臺,可方便觀測DES加/解密操作中各階段密文和密鑰的變化過程,本文提供了可用于網絡安全教學過程的DES算法可視化演示平臺。今后將進一步完善該平臺,使其可以實現3DES過程的可視化演示;同時還將使平臺能夠通過自動讀取文件實現批量數據的加密,將最終的密文寫入到文件中。?
參考文獻?
[1]?中國互聯網絡發展狀況統計報告[EB/OL]. http://tech.qq.com/a/20080724/000277.htm. 2008-9-27.?
[2]?趙戰生,杜虹,呂述望. 信息安全保密教程[M]. 合肥:中國科學技術大學出版社,2006:278-284.?
[3] 許茂智,游林.信息安全與密碼學[M]. 北京: 清華大學出版社,2007:61-70.?
[4]?SPILLMAN R. 經典密碼學與現代密碼學[M]. 葉阮健,曹英,張長富,譯.北京:清華大學出版社,2005:125-141.?
[5]?BAUER F L. 密碼編碼和分析學原理與方法[M].吳世忠,宋曉龍,李守鵬,譯. 北京:機械工業出版社, 2001.