des密碼學(xué)課程設(shè)計報告_第1頁
des密碼學(xué)課程設(shè)計報告_第2頁
des密碼學(xué)課程設(shè)計報告_第3頁
des密碼學(xué)課程設(shè)計報告_第4頁
des密碼學(xué)課程設(shè)計報告_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 成都信息工程學(xué)院課程設(shè)計報告DES算法加密與解密的設(shè)計與實(shí)現(xiàn)課程名稱: 密碼算法程序設(shè)計 學(xué)生姓名: * 學(xué)生學(xué)號: * 專業(yè)班級: * 任課教師: * 2021年 6 月 29 日指導(dǎo)老師評閱成績表學(xué)習(xí)與工作態(tài)度30%選題意義10%研究水平與設(shè)計能力25%課程設(shè)計說明說論文撰寫質(zhì)量25%設(shè)計創(chuàng)新10%總分指導(dǎo)老師簽名: 年 月 日課程設(shè)計辯論記錄及評價表學(xué)生講述情況教師主要提問記錄學(xué)生答復(fù)問題情況辯論評分評分工程分值評價參考標(biāo)準(zhǔn)評分總分優(yōu)良中及格差選題意義1098764研究水平與設(shè)計能力252320181510課程設(shè)計說明書論文撰寫質(zhì)量252320181510設(shè)計創(chuàng)新1098764辯論效果

2、302825221915辯論小組成員簽名辯論小組組長簽名: 年 月 日課程設(shè)計成績評定表成績匯總評分工程評分比例分?jǐn)?shù)課程設(shè)計總分指導(dǎo)老師評分50%辯論小組評分50%目錄1.引言12.設(shè)計目標(biāo)13.軟件需求分析1功能需求1性能需求14.模塊劃分24.1 密鑰產(chǎn)生模塊2加密模塊3解密模塊55.程序的實(shí)現(xiàn)7開發(fā)環(huán)境和語言75.2 功能模塊程序?qū)崿F(xiàn)7密鑰產(chǎn)生模塊7加密模塊85.2.3 解密模塊125.3 文件加密135.4 文件解密156測試15測試環(huán)境156.2 測試過程157總結(jié)178.參考文獻(xiàn)171.引言DES是由美國IBM公司于20世紀(jì)70年代中期的一個密碼算法LUCIFER算法開展而來的,在

3、1977年1月15日,美國國家標(biāo)準(zhǔn)局NBS正式公布實(shí)施,并得到了ISO的認(rèn)可。在過去的近20多年的時間里,DES被廣泛的應(yīng)用于美國聯(lián)邦和各種商業(yè)信息的平安保密工作中,經(jīng)受住了各種密碼分析和攻擊,表達(dá)出了令人滿意的平安性。DES算法的加密過程非常快,是目前使用的最為普遍的對稱密碼算法。在國內(nèi),隨著三金工程尤其是金卡工程的啟動,DES算法在POS,ATM,磁卡及智能卡,加油站等領(lǐng)域被廣泛使用,以此來實(shí)現(xiàn)關(guān)鍵數(shù)據(jù)的保密。DES算法是一種采用傳統(tǒng)的代替和置換作加密的分組密碼,明文以64比特為分組,密鑰長度為64比特,有效長度為56比特,其中加密密鑰有8比特是奇偶校驗,DES算法的加密和解密密鑰使用的是

4、同一算法,它的平安性完全依賴于所有的密鑰。由于DES算法運(yùn)算速度快,密鑰產(chǎn)生容易,適合于當(dāng)前大多數(shù)計算機(jī)上使用軟件方法的實(shí)現(xiàn),同時也適用于在專用芯片上的實(shí)現(xiàn)。因此設(shè)計和實(shí)現(xiàn)一個適用簡單的des加密軟件是有必要和有意義的。2.設(shè)計目標(biāo)字符加密:完成多個明文分組的加解密,明文和密鑰是ASCII碼,明文長度為任意長度,密鑰長度為8個字符,輸入明文和密鑰,輸出密文,進(jìn)行加密后,能夠進(jìn)行正確的解密;能輸出6輪的密鑰,并以二進(jìn)制的形式輸出文件加密:從一個文件讀取加密明文,在程序中輸出加密后的密文,并能將加密密文保存在明文文件的相同磁盤目錄下。3.軟件需求分析 該程序是一個加密程序,因此程序采用des加密算

5、法,需要完成對字符和.txt文件的加密,同時還能觀察在加密過程中字密鑰的產(chǎn)生狀態(tài)。模塊劃分合理,用類對函數(shù)進(jìn)行封裝。性能需求為了方便用戶的使用,具有良好的操作界面是有必要的。因此本軟件應(yīng)采用操作性和美觀較強(qiáng)的對話框的界面。4.模塊劃分本軟件由三個主要模塊構(gòu)成:密鑰產(chǎn)生模塊,加密模塊,解密模塊。4.1 密鑰產(chǎn)生模塊子密鑰產(chǎn)生過程:用戶將初始密鑰64位輸入到子密鑰產(chǎn)生流程中,首先經(jīng)過密鑰置換A,將初始密鑰的8個奇偶校驗位去掉,留下真正的56位比特初始密鑰。然后將56比特的初始密鑰分為兩個28比特的分組C0及D0。再將兩個分組分別經(jīng)過循環(huán)左移1或2位后,連接兩個分組成56位,最后經(jīng)過密鑰置換B,進(jìn)行

6、壓縮,拋棄8位后,便可輸出16輪子密鑰的48比特。其流程圖如下: 每輪循環(huán)左移位數(shù)如下表:輪數(shù)12345678910111213141516移位數(shù)1122222212222221加密模塊加密過程分為以下幾步:1> 獲取用戶輸入信息的內(nèi)容,計算其字符長度。如果字符長度為8個字符的整數(shù)倍,那么直接分組,每組8個字符,否那么按相應(yīng)的字符填充方法進(jìn)行字符填充,使字符長度剛好為8個字符的整數(shù)倍。再將每個分組按相應(yīng)ASCII值轉(zhuǎn)化成64位二進(jìn)制。2> 對每個分組進(jìn)行處理,首先進(jìn)行初始置換IP3> 在初始置換IP后,明文組再被分成左右兩局部Li和Ri,每局部32位。4> 右邊32比特

7、Ro進(jìn)入F函數(shù)變換。F函數(shù)變化過程為首先將32位明文經(jīng)過E擴(kuò)展變成48比特后再與48位子密鑰進(jìn)行按位異或,然后將得到的48位進(jìn)行s盒代替,輸出32比特,最后將32比特進(jìn)行p盒輸出,最終得到F函數(shù)的輸出。5> 經(jīng)過F函數(shù)后,將右邊得到的32比特與左邊的32比特Li再次進(jìn)行按位異或后最終得到Ri+1,交換左右32比特,即:Li+1=Ri,Ri+1=LiFRi,Ki6> 如上重復(fù)16輪但最后一輪不進(jìn)行左右分組交換,最終完成一個明文分組的加密過程。其具體實(shí)現(xiàn)流程圖如下:節(jié)點(diǎn)1加密過程64位明文進(jìn)行IP置換后進(jìn)行分組Li32與Ri32;i=0Ri32進(jìn)行E擴(kuò)展,生成48位比特串。48位比特串

8、與子密鑰keysi+1進(jìn)行異或運(yùn)算。得到的48位比特串分為8組,進(jìn)入8個S盒中,并按照S盒的規(guī)那么輸出8個十進(jìn)制數(shù)將8個十進(jìn)制數(shù)轉(zhuǎn)換為32位比特串。節(jié)點(diǎn)132位比特串進(jìn)行P置換,產(chǎn)生新的32位比特串32位比特串與Li32進(jìn)行異或,產(chǎn)生R(i+1)32L(i+1)32=Ri32;i+R1632在前,L1632在后進(jìn)行合并,合并后進(jìn)行IP逆置換,即產(chǎn)生密文i>15NY結(jié)束開始輸入密文和密鑰密文和密鑰轉(zhuǎn)換成二進(jìn)制,存儲在文件中讀出64位密文和密鑰64位密鑰進(jìn)行pc-1置換,生成56位Ci+1與Di+1合并為56位比特串,并進(jìn)行pc-2置換,產(chǎn)生子密鑰keysi+1,i+;Ci與Di左移一位或者

9、兩位,由左移表決定左移位數(shù)Ls16.左移產(chǎn)生Ci+1與Di+156位比特串分成左右各28位。Ci與Di,i=0;i>15NY其中的輪結(jié)構(gòu)圖為:解密模塊解密過程:解密過程與加密過程完全類似,唯一不同的是子密鑰的輸入順序是由子密鑰產(chǎn)生器第16輪獲得的子密鑰作為解密程序第一輪的子密鑰輸入。其具體實(shí)現(xiàn)流程圖如下:節(jié)點(diǎn)1解密過程64位明文進(jìn)行IP置換后進(jìn)行分組Li32與Ri32;i=0Ri32進(jìn)行E擴(kuò)展,生成48位比特串。48位比特串與子密鑰keysi+1進(jìn)行異或運(yùn)算。得到的48位比特串分為8組,進(jìn)入8個S盒中,并按照S盒的規(guī)那么輸出8個十進(jìn)制數(shù)將8個十進(jìn)制數(shù)轉(zhuǎn)換為32位比特串。節(jié)點(diǎn)132位比特串

10、進(jìn)行P置換,產(chǎn)生新的32位比特串32位比特串與Li32進(jìn)行異或,產(chǎn)生R(i+1)32L(i+1)32=Ri32;i+R1632在前,L1632在后進(jìn)行合并,合并后進(jìn)行IP逆置換,即產(chǎn)生密文i>15NY結(jié)束開始輸入密文和密鑰密文和密鑰轉(zhuǎn)換成二進(jìn)制,存儲在文件中讀出64位密文和密鑰64位密鑰進(jìn)行pc-1置換,生成56位Ci+1與Di+1合并為56位比特串,并進(jìn)行pc-2置換,產(chǎn)生子密鑰keysi+1,i+;Ci與Di左移一位或者兩位,由左移表決定左移位數(shù)Ls16.左移產(chǎn)生Ci+1與Di+156位比特串分成左右各28位。Ci與Di,i=0;i>15NY 開發(fā)環(huán)境:Windows 7 旗艦

11、版 開發(fā)工具:Visual studio 2021 開發(fā)語言:VC+;5.2 功能模塊程序?qū)崿F(xiàn) 密鑰產(chǎn)生模塊 (1) 密鑰由用戶選定的任意八個字符組成。 獲取用戶輸入密鑰代碼:UpdateData(TRUE); CstringA strmiyao2 ; strmiyao2=miyao2; char smsg11000; strcpy_s(smsg1,strmiyao2);/將密鑰保存到smsg1數(shù)組中 (2)產(chǎn)生子密鑰,調(diào)用函數(shù):void makekey(char in8)該函數(shù)的實(shí)現(xiàn)如下:void des: makekey(char in8)static int out64;int out1

12、56,left28,right28,hebin56,zhihuan148;zifu_to_bit(out, in);/字符轉(zhuǎn)換成二進(jìn)制zhihuan(out1,out,EP1,56);/去除奇偶校驗位for(int i=0;i<28;i+)lefti=out1i;for(int i=28;i<56;i+)righti-28=out1i;for(int i=0;i<16;i+)loopmove(left,movei);loopmove(right,movei);for(int j=0;j<28;j+)hebinj=leftj;for(int j1=0;j1<28;j

13、1+)hebin28+j1=rightj1;zhihuan(zhihuan1,hebin,EP2,48);for(int j2=0;j2<48;j2+)keyij2=zhihuan1j2;5.2.2 加密模塊1首先獲取要加密的明文,密鑰,通過子密鑰產(chǎn)生模塊生成16輪子密鑰,首先判斷輸入的明文是不是8個字符的整數(shù)倍,如果不是,那么進(jìn)行字符填充,填充方法為:用0x00填充,最后一個字節(jié)用填充字節(jié)的個數(shù)作為填充值填充!填充字符的實(shí)現(xiàn)調(diào)用函數(shù):void tianchongzifu(char *in,int *out)。再將得到的二進(jìn)制明文進(jìn)行分組,每64位一組進(jìn)行加密。2將得到的64比特塊初始I

14、P置換,調(diào)用函數(shù):zhihuan(int *out,int *in,int *arr,int length)/各個置換的轉(zhuǎn)換。void des:zhihuan(int *out,int *in,int *arr,int length)for(int i=0;i<length;i+)/outi=ini;outi=inarri-1;3將得到的64比特分為左右各32比特,然后調(diào)用void des: lunstruct(int a32,int out32,int n)進(jìn)入輪結(jié)構(gòu),該函數(shù)是加密程序的核心局部,其實(shí)現(xiàn)代碼如下:void des: lunstruct(int a32,int out32

15、,int n)int arr48, out132,j3=0;int arr148;int arr286;int arr38,han8,lie8;int s004,s114,s224,s334,s444,s554,s664,s774;zhihuan(arr,a,EC,48);/E盒置換for(int i=0;i<48;i+)arr1i=arrikeyni;for(int i1=0;i1<8;i1+)for(int j=0;j<6;j+)arr2i1j=arr1i1*6+j; liei1=arr2i11*8+arr2i12*4+arr2i13*2+arr2i14*1; hani1

16、=arr2i10*2+arr2i15*1;/E盒查找¨° E_Find(han0,lie0,s00,s1); E_Find(han1,lie1,s11,s2); E_Find(han2,lie2,s22,s3); E_Find(han3,lie3,s33,s4); E_Find(han4,lie4,s44,s5); E_Find(han5,lie5,s55,s6); E_Find(han6,lie6,s66,s7); E_Find(han7,lie7,s77,s8); for(int j1=0;j1<4;j1+) out1j3=s00j1; j3+; for(int

17、j1=0;j1<4;j1+) out1j3=s11j1; j3+; for(int j1=0;j1<4;j1+) out1j3=s22j1; j3+; for(int j1=0;j1<4;j1+) out1j3=s33j1; j3+; for(int j1=0;j1<4;j1+) out1j3=s44j1; j3+; for(int j1=0;j1<4;j1+) out1j3=s55j1; j3+; for(int j1=0;j1<4;j1+) out1j3=s66j1; j3+; for(int j1=0;j1<4;j1+) out1j3=s77j1

18、; j3+; zhihuan(out,out1,p,32);/p盒置換4將得到的結(jié)果與明文的左32位異或for(int j3=0;j3<32;j3+) out2j3=out1j3leftj3;/按位異或¨° leftj3=rightj3; rightj3=out2j3; 5再將得到的結(jié)果左右32位交換,重復(fù)執(zhí)行16輪。最后將得到的64比特進(jìn)行逆初始置換后轉(zhuǎn)換成16進(jìn)制輸出。最終的加密函數(shù)為:void des:jiami(char *out,char *in)char sixty16='0','1','2','3&

19、#39;,'4','5','6','7','8','9','A','B','C','D','E','F'int arr64,a16,arr164;int tcresult10000,fenzu10064=0;int n=strlen(in),p,q;int m,zhifu10000,zifu18;char result100016;if(n%8!=0)/當(dāng)需要字符填充時tianchongzifu(in,t

20、cresult);/字符填充m=(8-n%8+n)/8;else/當(dāng)不需要字符填充時for( p=0;p<n;p+)zhifup=(int)inp;shito2(zhifup,zifu1,8);for( q=0;q<8;q+)tcresultp*8+q=zifu1q;m=n/8;/tcresultp*q='0'for(int i=0;i<m;i+)for(int j=0;j<64;j+)fenzuij=tcresulti*64+j;/zifu_to_bit(arr,in); zhihuan(arr1,fenzui,IP1,64); int left32,

21、right32,out132,out232,out364,out464,out5164; /分成左右兩半 for(int i1=0;i1<32;i1+) lefti1=arr1i1; for(int i2=32;i2<64;i2+) righti2-32=arr1i2; /15輪變換? for(int j2=0;j2<15;j2+) lunstruct(right,out1,j2);/輪結(jié)構(gòu)變換 for(int j3=0;j3<32;j3+) out2j3=out1j3leftj3;/按位異或 leftj3=rightj3; rightj3=out2j3; 最后一輪 l

22、unstruct(right,out1,15); for(int j4=0;j4<32;j4+) out2j4=out1j4leftj4; leftj4=rightj4; /合并左右到數(shù)組out364; for(int i3=0;i3<32;i3+) out3i3=out2i3; for(int i4=32;i4<64;i4+) out3i4=lefti4-32; /逆初始置換 zhihuan(out4,out3,IP2,64); /將out4轉(zhuǎn)化成¨16進(jìn)制 for(int i5=0;i5<16;i5+) for(int j6=0;j6<4;j6+)

23、out5i5j6=out4i5*4+j6; ai5=out5i50*8+out5i51*4+out5i52*2+out5i53*1;resultii5=sixtyai5;outi*16+i5=resultii5; 5.2.3 解密模塊 解密的實(shí)現(xiàn)和加密過程相同,唯一不同的是解密的16輪密鑰 是加密密鑰的逆序輸入,是加密的逆過程,在解密后得到二進(jìn)制明文后,還要根據(jù)二進(jìn)制明文判斷密文是否進(jìn)行了字符填充,判斷方法為:取二進(jìn)制明文最后八個bite,轉(zhuǎn)化成10進(jìn)制。如果小于8那么證明填充了字符,否那么沒有填充。如果進(jìn)行了字符填充,解密后要根據(jù)填充字符的內(nèi)容去除填充的字符,復(fù)原明文。判斷字符是否進(jìn)行了填充

24、代碼實(shí)現(xiàn):/取laststr的最后八個bite后判斷去掉填充的字符int last_8str8,*lastbite,count=0;lastbite=(int*)malloc(sizeof(int)*strlen(in)*4);int sub;for(int p=strlen(in)*4-8;p<strlen(in)*4;p+)last_8strp-strlen(in)*4+8=laststrp;/取最后八位sub=last_8str0*128+last_8str1*64+last_8str2*32+last_8str3*16+last_8str4*8+last_8str5*4+last

25、_8str6*2+last_8str7*1;/將二進(jìn)制轉(zhuǎn)化成10進(jìn)制if(sub<8)for(int i=0;i<strlen(in)*4-8*sub;i+)lastbitei=laststri;count+;maincount=count/8;5.3 文件加密1翻開文件,讀取文件的內(nèi)容作為明文。翻開文件操作主要代碼為:/.讀取文件內(nèi)容./CFile mFile;CString filename ,filetype,wenjianneirong1;CString m_path=neirong1;int a=mFile.Open(m_path,CFile:modeRead);/翻開文

26、件if(a=0)/判斷翻開文件是否成功 MessageBox(_T("翻開文件失敗或還未選擇文件"), _T("消息提示"),0); return; filename=neirong1; filetype=neirong1; filename=filename.Right(filename.GetLength()-filename.ReverseFind('')-1);/得到文件名 filetype=filetype.Right(filename.GetLength()-filename.ReverseFind('.')-

27、1);/得到文件擴(kuò)展名 if(filetype!="txt") MessageBox(_T("翻開文件不是.txt文件,請重新選擇"), _T("消息提示"),0); return; char *wenjianneirong=new charmFile.GetLength(); /wenjianneirong=(char*)malloc(sizeof(char)*(mFile.GetLength(); int num=mFile.GetLength();if(num>1000) MessageBox(_T("你選擇的文件過大,請選擇文件內(nèi)容較小的進(jìn)行加密"), _T("消息提示"),0); return; mFile.Read(wenjianneirong,mFile.GetLength();/讀取文件內(nèi)容到變量wenjianneirongfor(int i=0;i<num;i+)wenjianneirong1+=wenjianneirongi; char s1000; CStringA neirong; neirong=wenjianneirong1; strcpy_s(s,neirong);2讀取文件后判斷文件內(nèi)容長度,當(dāng)長度不是8個字節(jié)的整數(shù)倍時,進(jìn)行

溫馨提示

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

最新文檔

評論

0/150

提交評論