廣東工業(yè)大學(xué)網(wǎng)絡(luò)工程實(shí)驗(yàn)報(bào)告-對稱密碼算法DES_第1頁
廣東工業(yè)大學(xué)網(wǎng)絡(luò)工程實(shí)驗(yàn)報(bào)告-對稱密碼算法DES_第2頁
廣東工業(yè)大學(xué)網(wǎng)絡(luò)工程實(shí)驗(yàn)報(bào)告-對稱密碼算法DES_第3頁
廣東工業(yè)大學(xué)網(wǎng)絡(luò)工程實(shí)驗(yàn)報(bào)告-對稱密碼算法DES_第4頁
廣東工業(yè)大學(xué)網(wǎng)絡(luò)工程實(shí)驗(yàn)報(bào)告-對稱密碼算法DES_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 PAGE word文檔可自由復(fù)制編輯一實(shí)驗(yàn)?zāi)康耐ㄟ^用DES算法對實(shí)際的數(shù)據(jù)進(jìn)行加密和解密來深刻了解DES的運(yùn)行原理。二實(shí)驗(yàn)軟件環(huán)境運(yùn)行Windows或Linux操作系統(tǒng)的PC機(jī),具有g(shù)cc(Linux)、VC(Windows)等C語言編譯環(huán)境。三實(shí)驗(yàn)內(nèi)容1.算法分析根據(jù)所提供的程序分析DES算法的實(shí)現(xiàn)過程。DES程序包括一個(gè)頭文件和一個(gè)實(shí)現(xiàn)DES算法的C文件。頭文件里主要是一些宏定義和函數(shù)聲明,其中還包括保證可移植性的一些定義。DES程序通過宏定義可選擇小代碼模式(#define small code)或者選擇大代碼模式。在大代碼模式下,程序定義了多個(gè)表,從而使DES算法中的很多運(yùn)算都可以通

2、過查表實(shí)現(xiàn),速度較快,但要求有較多的存儲(chǔ)空間;在小代碼模式運(yùn)行時(shí),可以不查表,從而節(jié)省了存儲(chǔ)空間,但是速度較慢。讀者可以根據(jù)自己的需求來選擇不同的運(yùn)行模式。加密解密時(shí)主要用到下面5個(gè)函數(shù)。(l)int des_setup(const unsigned char *key,int keylen,int num_rounds,des_key *skey)函數(shù)名稱:密鑰生成函數(shù)。參數(shù)說明:key是一個(gè)指針,指向用戶輸入的初始密鑰。keylen是輸入密鑰的長度,以字節(jié)為單位。num_rounds是加密輪數(shù),當(dāng)輸入0時(shí),使用算法默認(rèn)的輪數(shù)。skey是一個(gè)指向結(jié)構(gòu)體變量的指針,變量里面存儲(chǔ)加密和解密時(shí)每輪

3、使用的子密鑰。當(dāng)密鑰生成時(shí),返回值為CRYPT_OK(0),結(jié)果保留在Skey指向的結(jié)構(gòu)體。des_key的定義如下:typedef struct des_keyulong32 ek32, dk32;des_key結(jié)構(gòu)體里的ek存儲(chǔ)加密時(shí)用的子密鑰,dk存儲(chǔ)解密時(shí)用的子密鑰。結(jié)構(gòu)體中用2個(gè)32位的整數(shù)來存儲(chǔ)一輪的48位密鑰,每一個(gè)32位整數(shù)被分成4個(gè)8位,每個(gè)8位的第6位存儲(chǔ)密鑰。如果把48位密鑰分成8組,則這8組按存儲(chǔ)的順序從高到低分別為1、3、5、7、2、4、6、8。這樣做是為了加密時(shí)可以把擴(kuò)展和查表運(yùn)算結(jié)合起來。(2)void des_ecb_encrypt(const unsigned

4、 char *pt, unsigned char *ct, des_key *key)函數(shù)名稱:加密函數(shù)。參數(shù)說明;pt是指向待加密的明文數(shù)組的指針。ct是指向存儲(chǔ)加密結(jié)果的指針。key是調(diào)用密鑰生成函數(shù)后存儲(chǔ)每一輪子密鑰的結(jié)構(gòu)體變量。加密成功時(shí),返回CRYPT_OK。(3)void des_ecb_decrypt(const unsigned char *ct,unsigned char *pt,des_key *key)函數(shù)名稱:解密函數(shù)。參數(shù)說明:ct是指向待解密的密文數(shù)組的指針。pt是指向存儲(chǔ)解密結(jié)果的指針。key是調(diào)用密鑰生成函數(shù)后存儲(chǔ)每一輪子密鑰的結(jié)構(gòu)體變量。解密成功時(shí),返回CRY

5、PT_OK。加密和解密時(shí),pt和ct可以指向同一塊內(nèi)存。(4)int des_test(void)函數(shù)名稱:測試函數(shù)。這個(gè)函數(shù)用來對加密算法進(jìn)行測試。函數(shù)體內(nèi)部定義了對應(yīng)的明文和密文數(shù)組,并且進(jìn)行了多輪加密和解密。這個(gè)函數(shù)還可以用來測試函數(shù)的運(yùn)行時(shí)間。(5)nit des_keysize(int *desired_keysize)函數(shù)名稱:密鑰長度檢驗(yàn)函數(shù)。參數(shù)說明:desired_keysize是使用者所想要的密鑰長度。當(dāng)密鑰長度小于所需密鑰長度時(shí),返回值為CRYPT_INVALID_KEYSIZE,否則,desired_keysize指向的變量被置為 8。2 使用實(shí)例分析#include

6、des.hint main(int argc, char *argv)unsigned char pt9=abcdefg,ct9,key8= a,b,c,d,a,b,c,d ;des_key skey;pt9l=ct9=0;des_setup(key,8,0,&skey);des_ecb_encrypt(pt.ct,&skey);des_ecb_decrypt(ct.pt,&skey);printf(%sn,pt);prinif(%sn,ct);system(PAUSE);retun 0;說明:這個(gè)程序演示了對一組8Byte的數(shù)據(jù)進(jìn)行加密和解密的過程。pt指向明文數(shù)組,ct指向密文數(shù)組,ske

7、y是密鑰數(shù)組。pt和ct數(shù)組長度設(shè)為9,是為了方便控制臺(tái)字符串輸出。對文件加密時(shí),可以指定讀取和寫入的字符數(shù),這兩個(gè)數(shù)組長度應(yīng)該定義為8。四、實(shí)驗(yàn)結(jié)果:(1)使用附錄提供的程序?qū)σ粋€(gè)文件進(jìn)行加密和解密,提交程序代碼和執(zhí)行結(jié)果。修改程序,添加main函數(shù),使程序能夠正常運(yùn)行,并作修改如下:int main(int argc, char *argv)int choice; system(color f0); coutendl; cout選項(xiàng): endl; cout1.文件加密 2.文件解密 endl; coutendl; coutchoice; coutendl; if(choice=1) cha

8、r a;char ifn10;char ofn10;/文件名cout輸入需要加密的文件名:ifn;cout輸入加密后想要的文件名:ofn;ifstream f1(ifn); /從文件中讀出ofstream f2(ofn); /寫到到文件中unsigned char pt9,ct9,nt50,mt9,key8= a,b,c,d,a,b,c,d ;symmetric_key skey;int n=0;int nn=0;while(!f1.eof()a=f1.get();ntn=a;n+;ntn=0;for(int count=0;count=(n-1)/8;count+)mt8=0;ct8=0;p

9、t8=0;for(int i=0;i8;i+)pti=ntnn;nn+;des_setup(key,8,0,&skey);des_ecb_encrypt(pt,ct,&skey);for(int m=0;m8;m+)f2.put(ctm);cout加密完成!endl;f1.close() ;f2.close() ;system(PAUSE); else if(choice=2) char a;char ifn10;char ofn10;/文件名cout輸入需要解密的文件名:ifn;cout輸入解密后想要的文件名:ofn;ifstream f1(ifn); /從文件中讀出ofstream f2(

10、ofn); /寫到到文件中unsigned char pt9,ct9,nt50,mt9,key8= a,b,c,d,a,b,c,d ;symmetric_key skey;int n=0;int nn=0;while(!f1.eof()a=f1.get();ntn=a;n+;ntn=0;for(int count=1;count=(n-1)/8;count+)mt8=0;ct8=0;pt8=0;for(int i=0;i8;i+)cti=ntnn;nn+;ct8=0;des_setup(key,8,0,&skey); des_ecb_decrypt(ct,pt,&skey);for(int m

11、=0;m8;m+)if(ptm=255) break;f2.put(ptm);cout解密完成!endl;f1.close() ;f2.close() ; else if(choice=3) unsigned char pt50=i love c,ct50,mt50,key8= a,b,c,d,a,b,c,d ;symmetric_key skey;pt8=ct8=0;mt8=0;des_setup(key,8,0,&skey);des_ecb_encrypt(pt,ct,&skey);printf(%sn,pt);printf(%sn,ct); des_ecb_decrypt(ct,mt,&

12、skey); printf(%sn,ct);printf(%sn,mt); else cout輸入錯(cuò)誤!;return 0; 運(yùn)行結(jié)果:初始文件:123.txt對123.txt進(jìn)行加密加密后文件:321.txt再對經(jīng)過加密的文件321.txt解密解密后文件:111.txt(2)使用附錄提供的程序?qū)斎氲氖M(jìn)制數(shù)加密(把輸入的字符轉(zhuǎn)化成整數(shù)。例如,輸入兩個(gè)字符1F,轉(zhuǎn)化成二進(jìn)制數(shù)000lllll),比較輸入和輸出。當(dāng)把輸入的數(shù)改變一個(gè)位時(shí)(如把1F變?yōu)?E),比較輸出的變化,并說明原因。程序修改如下:int main( )/生成密鑰unsigned char key 8 = a,b,c,d,a

13、,b,c,d ;des_key skey;des_setup( key, 8, 0, &skey );cout n加密前輸入原文:;string bufferString1;void inputData( string &input );inputData( bufferString1 );/加密數(shù)據(jù)string bufferString2;void encodeHexadecimal( string &input, string &output, des_key &skey );encodeHexadecimal( bufferString1, bufferString2, skey );/

14、輸出加密數(shù)據(jù)cout n加密后輸出密文:;void outputData( string &output );outputData( bufferString2 );/解密數(shù)據(jù)void decodeHexadecimal( string &input, string &output, des_key &skey );decodeHexadecimal( bufferString2, bufferString1, skey );/輸出解密數(shù)據(jù)cout n解密后輸出原文:;outputData( bufferString1 );return 0;/輸入 16 進(jìn)制數(shù)據(jù),轉(zhuǎn)換為按字節(jié)存儲(chǔ)的字符串,即

15、待加密的數(shù)據(jù)void inputData( string &input )for ( char tempChar1= cin.get( ); tempChar1 != 10; tempChar1= cin.get( ) )char ascToHexadecimal( char asc );tempChar1= ascToHexadecimal( tempChar1 ) 4;char tempChar2= cin.get( );if ( tempChar2 = 10 )tempChar2= 48;input+= ascToHexadecimal( tempChar2 ) + tempChar1;

16、return;input+= ascToHexadecimal( tempChar2 ) + tempChar1;/將需要輸出的數(shù)據(jù)轉(zhuǎn)換為 16 進(jìn)制數(shù)并輸出void outputData( string &output )for ( int i= 0; i output.length( ); i+ )char hexadecimalToAsc( char hexadecimal );cout 4 & 0 x0f );cout hexadecimalToAsc( output i & 0 x0f );cout endl;/用 DES 算法加密 input 中的數(shù)據(jù),存放在 output 中vo

17、id encodeHexadecimal( string &input, string &output, des_key &skey )for ( int i= 0; i input.length( ); i+= 8 )char bufferChar1 9 , bufferChar2 9 ;for ( int j= 0; j 8; j+ )if ( i + j input.length( ) )bufferChar1 j = input i + j ;elsebufferChar1 j = 0;bufferChar2 j = 0;bufferChar1 8 = bufferChar2 8 =

18、0;des_ecb_encrypt( (unsigned char *)bufferChar1, (unsigned char *)bufferChar2, &skey );for ( j= 0; j 8 & bufferChar2 j ; j+ )output+= bufferChar2 j ;/用 DES 算法解密 input 中的數(shù)據(jù),存放在 output 中void decodeHexadecimal( string &input, string &output, des_key &skey )output= ;for ( int i= 0; i input.length( ); i+= 8 )char bufferChar1 9 , bufferChar2 9 ;for ( int j= 0; j 8; j+ )if ( i + j input.length( ) )bufferChar1 j = input i + j ;elsebufferChar1 j = 0;bufferChar2 j = 0;bufferChar1 8 = bufferChar2 8 = 0;des_ecb_decrypt( (unsigned char *)bufferChar1, (unsigned char *)bufferChar2, &skey );for ( j= 0; j

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論