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