DES加密解密算法的實現(xiàn)(Java基本要求)_第1頁
DES加密解密算法的實現(xiàn)(Java基本要求)_第2頁
DES加密解密算法的實現(xiàn)(Java基本要求)_第3頁
DES加密解密算法的實現(xiàn)(Java基本要求)_第4頁
DES加密解密算法的實現(xiàn)(Java基本要求)_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGE成都信息工程學院課程設計報告DES加密解密算法的實現(xiàn)(Java)課程名稱:應用密碼算法程序設計學生姓名:李文浩學生學號:2007122054專業(yè)班級:信安072班任課教師:萬武南2009年11附件:課程設計成績評價表附件:課程設計成績評價表學習與工作態(tài)度(30%)選題的價值與意義(10%)文獻綜述(10%)研究水平與設計能力(20%)課程設計說明說(論文)撰寫質(zhì)量(20%)學術水平與創(chuàng)新(10%)總分指導老師簽名:年月日課程設計答辯記錄及評價表學生講述情況教師主要提問記錄學生回答問題情況答辯評分評分項目分值評價參考標準評分總分優(yōu)良中及格差選題的價值與意義1098764文獻綜述1098764研究水平與設計能力201917151310課程設計說明書(論文)撰寫質(zhì)量201917151310學術水平與創(chuàng)新1098764答辯效果302825221915是否同意論文(設計)通過答辯□同意□不同意答辯小組成員簽名答辯小組組長簽名:年月日課程設計成績評定表成績匯總評分項目評分比例分數(shù)課程設計總分指導老師評分50%答辯小組評分50%

目錄1.引言 11.1背景 11.2目的 11.3本設計的主要任務 12.系統(tǒng)設計 22.1系統(tǒng)主要目標 22.1.1主要軟件需求(運行環(huán)境) 22.2系統(tǒng)結構 22.2.2軟件操作流程 22.2.3功能模塊 33系統(tǒng)功能程序設計 33.1循環(huán)移位 33.2獲取RoundKey 43.3IP置換,逆置換,E擴展,置換P 53.4Fnew函數(shù)(F函數(shù)) 53.5異或 73.6S盒代替 73.7十六進制轉二進制 73.8二進制轉十六進制 83.9加密 93.10解密 93.11程序界面預覽 104.測試報告 115.結論 14參考文獻 14第13頁共14頁1.引言1.1背景數(shù)據(jù)加密標準(DataEncryptionStandard,,DES)曾被美國國家標準局(NBS,現(xiàn)為國家標準與技術研究所NIST)確定為聯(lián)邦信息處理標準(FIPSPUB46),得到過廣泛使用,特別是在金融領域,曾是對稱密碼體制事實上的世界標準。目前在國內(nèi),隨著三金工程尤其是金卡工程的啟動,DES算法在POS,ATM,智能卡,加油站,高速公路收費站等領域被廣泛使用,以此來實現(xiàn)關鍵數(shù)據(jù)加密,如信用卡持卡人的PIN的加密傳輸,IC卡與POS間的雙向認證、金融交易數(shù)據(jù)包的MAC校驗等,均用到DES算法。DES起源于1973年美國國家標準局NBS征求國家密碼標準方案。IBM就提交了其在20世紀60年代末設立的一個計算機密碼編碼學方面的研究項目的結果,這個項目在1971年結束時研制出了一種稱為Lucifer算法。它是當時提出來的最好的算法,因而在1977年被選為數(shù)據(jù)加密標準,有效期為5年,隨后在1983年、1987年、和1993年三次再度授權該算法續(xù)用5年。DES使用一個56位的密鑰以及附加的8位奇偶校驗位,產(chǎn)生最大64位的分組大小。這是一個迭代的分組密碼,使用稱為Feistel的技術,其中將加密的文本塊分成兩半。使用子密鑰對其中一半應用循環(huán)功能,然后將輸出與另一半進行“異或”運算;接著交換這兩半,這一過程會繼續(xù)下去,但最后一個循環(huán)不交換。DES使用16個循環(huán)。1.2目的在一些特殊場合,人們交換信息并不希望被其他人知道,需要把消息進行一系列轉換后在公共信道中傳輸,接收方再通過一些手段將消息轉換回來,本程序用DES對稱密鑰加密算法加解密一組長度為64bit的十六進制數(shù),達到保密傳遞信息的目的.1.3本設計的主要任務根據(jù)DES加密算法實現(xiàn)一組長度為64bit的十六進制數(shù)加密解密。向用戶提供良好的交互,具有良好的操作性??赏瓿梢粋€明文分組的加解密,明文和密鑰是十六進制,長度都為64比特(16個16進制數(shù)),輸入明文和密鑰,輸出密文,進行加密后,能夠進行正確的解密;程序運行時,要求輸出每一輪使用的密鑰,以及每一輪加密或解密之后的16進制表示的值。2.系統(tǒng)設計2.1系統(tǒng)主要目標2.1.1主要軟件需求(運行環(huán)境)本軟件適用java語言編寫,編譯成功后的.class文件可以在裝有JDK開發(fā)環(huán)境的任何計算機上使用。本軟件設計符合DES程序設計基本要求:(1)在深入理解DES加密/解密算法理論的基礎上,設計一個DES加密/解密軟件系統(tǒng);(2)完成一個明文分組的加解密,明文和密鑰是十六進制,長度都為64比特(16個16進制數(shù)),輸入明文和密鑰,輸出密文,進行加密后,能夠進行正確的解密;(3)程序運行時,要求輸出每一輪使用的密鑰,以及每一輪加密或解密之后的16進制表示的值;(4)要求提供所設計系統(tǒng)的報告及完整的軟件。輸入: 加密:8字節(jié)定長的十六進制明文(16個十六進制數(shù))。 解密:8字節(jié)定長的十六進制密文(16個十六進制數(shù))。輸出: 加密:8字節(jié)定長的十六進制已加密的密文(16個十六進制數(shù))。 解密:8字節(jié)定長的十六進制的正常解密的明文(16個十六進制數(shù))。測試平臺:WindowsVistaHomeBasic/WindowsXPProfessional2.2系統(tǒng)結構2.2.2軟件操作流程加密:(1)按提示選擇“1”進行加密過程,程序將正常執(zhí)行下面的加密過程。(2)按提示輸入你加密所需要的長度為16個十六進制的密鑰。(3)按提示輸入你要加密的長度為16個十六進制的明文。(4)加密后,每輪加密結果和最終加密結果(即密文)將顯示給用戶。解密:(1)按提示選擇“0”進行解密過程,程序將正常執(zhí)行下面的解密過程。(2)按提示輸入你解密所需要的長度為16個十六進制的密鑰。(3)按提示輸入你要解密的長度為16個十六進制的密文。(4)解密后,每輪解密的結果和最終解密出的明文將顯示給用戶。2.2.編號模塊名稱模塊標識1循環(huán)移位LwhDES::LeftBitMove2獲取RoundKeyLwhDES::KeyInitialize3IP,IP_1,P置換,E擴展IP[],IP_1[],P[],E[]4Fnew函數(shù)(F函數(shù))LwhDES::Fnew5異或無6S盒代替S_Box[][]7十六進制轉二進制LwhDES::changeHtoB8二進制轉十六進制LwhDES::changeBtoH9加密LwhDES::Encrypt10解密LwhDES::Encrypt3系統(tǒng)功能程序設計3.1循環(huán)移位實現(xiàn)循環(huán)移位,由于DES算法涉及到得只有循環(huán)左移一位或者兩位,我考慮用窮舉的方法,因為只有兩種情況,因此用if條件語句判斷每輪循環(huán)的位數(shù)。我定義了4個中間變量co,do,c1,d1存放中間結果。VoidLwhDES::LeftBitMove(int[]k,intoffset){inti;//循環(huán)移位操作函數(shù)int[]c0=newint[28];int[]d0=newint[28];int[]c1=newint[28];int[]d1=newint[28];for(i=0;i<28;i++){c0[i]=k[i];d0[i]=k[i+28];}if(offset==1){for(i=0;i<27;i++){//循環(huán)左移一位 c1[i]=c0[i+1]; d1[i]=d0[i+1]; } c1[27]=c0[0];d1[27]=d0[0];}elseif(offset==2){for(i=0;i<26;i++){//循環(huán)左移兩位c1[i]=c0[i+2];d1[i]=d0[i+2];}c1[26]=c0[0];d1[26]=d0[0];c1[27]=c0[1];d1[27]=d0[1];}for(i=0;i<28;i++){k[i]=c1[i];k[i+28]=d1[i];}}3.2獲取RoundKey生成輪子密鑰前調(diào)用了PC1變換函數(shù),循環(huán)過程中調(diào)用了循環(huán)移位函數(shù)和PC2變換函數(shù),最終生成了KeyArray[16][48]的輪子密鑰。int[][]LwhDES::KeyInitialize(int[]key){inti;intj;int[][]keyarray=newint[16][48];int[]K0=newint[56];for(i=0;i<56;i++){K0[i]=key[PC_1[i]-1];//密鑰進行PC-1變換}for(i=0;i<16;i++){LeftBitMove(K0,LeftMove[i]);for(j=0;j<48;j++){keyarray[i][j]=K0[PC_2[j]-1];//生成子密鑰keyarray[i][j]}}returnkeyarray;}3.3IP置換,逆置換,E擴展,置換P置換使用的是簡單的查表置換,table置換,即將輸出的數(shù)據(jù)與輸入的數(shù)據(jù)相應的數(shù)組的對應項查出來。IP置換:for(i=0;i<64;i++){ M[i]=timeData[IP[i]-1];//明文IP變換,IP[]為IP置換表 ……}IP逆置換:for(i=0;i<64;i++){MIP_1[i]=M[IP_1[i]-1];//進行IP-1運算,IP_1[]為IP逆置換表……}E擴展:for(i=0;i<48;i++){ RE[i]=R0[E[i]-1];//經(jīng)過E變換擴充,由32位變?yōu)?8位}置換P:for(i=0;i<32;i++){ RP[i]=sValue[P[i]-1];//經(jīng)過P變換,P[]為P置換表……}3.4Fnew函數(shù)(F函數(shù))F函數(shù)為該加密程序最關鍵的地方,里面涉及到E擴展,與密鑰異或,S盒壓縮,P置換,每輪都要使用此函數(shù),此函數(shù)編寫的好壞很大程度上影響整個程序的執(zhí)行效率。注意,此處的Fnew函數(shù)與標準F函數(shù)略有不同,F(xiàn)new函數(shù)將F函數(shù)后Lo,Ro的異或和換位都已經(jīng)實現(xiàn)。VoidLwhDES::privatevoidLoopF(int[]M,inttimes,intflag,int[][]keyarray){inti,j;int[]L0=newint[32];int[]R0=newint[32];int[]L1=newint[32];int[]R1=newint[32];int[]RE=newint[48];//存放經(jīng)過E擴展的消息int[][]S=newint[8][6];//存放成8行六列,以便進行S盒壓縮int[]sBoxData=newint[8];//每一行查出的數(shù)int[]sValue=newint[32];//int[]RP=newint[32];//經(jīng)過置換P的數(shù)for(i=0;i<32;i++){ L0[i]=M[i];//明文左側的初始化 R0[i]=M[i+32];//明文右側的初始化}for(i=0;i<48;i++){ RE[i]=R0[E[i]-1];//經(jīng)過E變換擴充,由32位變?yōu)?8位 RE[i]=RE[i]+keyarray[times][i];//與KeyArray[times][i]按位作不進位加法運算if(RE[i]==2){//與48位密鑰異或 RE[i]=0;}}for(i=0;i<8;i++){ //48位分成8組 for(j=0;j<6;j++){ /每組六位 S[i][j]=RE[(i*6)+j]; }//下面經(jīng)過S盒,得到8個數(shù) sBoxData[i]=S_Box[i][(S[i][0]<<1)+S[i][5]][(S[i][1]<<3)+(S[i][2]<<2)+(S[i][3]<<1)+S[i][4]];//8個數(shù)變換輸出二進制 for(j=0;j<4;j++){ sValue[((i*4)+3)-j]=sBoxData[i]%2;//從右邊一位一位的取數(shù)存放 sBoxData[i]=sBoxData[i]/2; }}for(i=0;i<32;i++){ RP[i]=sValue[P[i]-1];//經(jīng)過P變換 L1[i]=R0[i];//右邊移到左邊R1[i]=L0[i]+RP[i];if(R1[i]==2){//異或 R1[i]=0;}//重新合成M,返回數(shù)組M//最后一次變換時,左右不進行互換。此處采用兩次變換實現(xiàn)不變if(((flag==0)&&(times==0))||((flag==1)&&(times==15))) { M[i]=R1[i]; M[i+32]=L1[i];} else { M[i]=L1[i]; M[i+32]=R1[i];}}}3.5異或Java語言我使用”^”符號進行異或,結果沒有成功,于是利用循環(huán)實現(xiàn)各個位相加,再每位檢查,若等于2,則置為0。for(i=0;i<48;i++){…… RE[i]=RE[i]+keyarray[times][i];//兩個數(shù)進行不進位加法if(RE[i]==2)//若加出的結果為2則置為0,實現(xiàn)了異或{ RE[i]=0;}}3.6S盒代替S盒替換采用了將48個bit數(shù)先分為8組,每一組對應一個S盒,再通過行列計算查出S表里的十進制值,再轉化為二進制。int[]RE=newint[48];int[][]S=newint[8][6];int[]sBoxData=newint[8];int[]sValue=newint[32];for(i=0;i<8;i++) //48位分成8組{ for(j=0;j<6;j++) //每組6位 { S[i][j]=RE[(i*6)+j]; }//下面經(jīng)過S盒,得到8個數(shù) sBoxData[i]=S_Box[i][(S[i][0]<<1)+S[i][5]][(S[i][1]<<3)+(S[i][2]<<2)+(S[i][3]<<1)+S[i][4]];//8個數(shù)變換輸出二進制 for(j=0;j<4;j++) { sValue[((i*4)+3)-j]=sBoxData[i]%2; sBoxData[i]=sBoxData[i]/2; }}3.7十六進制轉二進制本函數(shù)主要用于十六進制數(shù)向二進制數(shù)的轉換,十六進制數(shù)只有十六種情況,本程序使用窮舉方法,利用switch、case語句實現(xiàn)十六進制對二進制的轉換,避免移位出現(xiàn)不可預計的錯誤。int[]LwhDES::changeHtoB(Strings)//實現(xiàn)十六進制到二進制的轉換; { int[]Message=newint[64]; StringBufferbuf=newStringBuffer(); Stringstr=s; Stringmessage=""; inti,j; for(i=0;i<str.length();i++){ charch=str.charAt(i); switch(ch){ case'0':message="0000";break;case'1':message="0001";break; case'2':message="0010";break;case'3':message="0011";break; …… case'e':message="1110";break;case'f':message="1111";break; default:break; }buf=buf.append(message); } //System.out.print(buf); for(j=0;j<64;j++) { if(buf.charAt(j)=='0') {Message[j]=0;} elseMessage[j]=1; } returnMessage;}3.8二進制轉十六進制本函數(shù)主要用于將結果二進制數(shù)轉換成十六進制向用戶輸出,實現(xiàn)二進制轉十六進制數(shù),即4個bool型變量轉化為一個十六進制數(shù),先將bool流寫入StringBuffer,再調(diào)用toString轉化成字符串,對字符串進行取子串,再調(diào)用Integer.toHexString方法轉換為十六進制。StringLwhDES::changeBtoH(int[]data){//實現(xiàn)二進制到十六進制的轉換;StringBufferbuf=newStringBuffer();Strings=newString();for(inti=0;i<data.length;i++) { if(data[i]==0)buf.append('0'); elseif(data[i]==1)buf.append('1'); }Stringstring=buf.toString();//形成一個全是bool變量(0或1)的字符串inttemp=0;StringBufferoutputbuf=newStringBuffer();Strings1=string.substring(0,data.length);for(inti=0;i<s1.length()/4;i++) //每四位取一次,表示一個十六進制數(shù) {temp=Integer.valueOf(s1.substring(i*4,(i+1)*4),2);outputbuf=outputbuf.append(Integer.toHexString(temp));}//System.out.print(outputbuf);s=outputbuf.toString();returns;}3.9加密加密過程其實就是調(diào)用以寫好的模塊,對消息進行16次迭代加密,但在每一輪中要進行中間一些加密結果的顯示,又因為加密和解密我寫在了同一個Encrypt函數(shù)里,因此只用標志位flag區(qū)別加解密,1為加密,0為解密。int[]LwhDES::Encrypt(int[]timeData,intflag,int[][]keyarray){inti;intflags=flag;int[]M=newint[64];int[]MIP_1=newint[64];for(i=0;i<64;i++){ M[i]=timeData[IP[i]-1];//明文IP變換}if(flags==1){//加密 for(i=0;i<16;i++) {Fnew(M,i,flags,keyarray); //注意,LoopF函數(shù)將每輪迭代運算的Li=Ri-1,//Ri=Li-1^F(Ri-1,Ki)一起寫了進去……//顯示中間結果 }}3.10解密解密過程與加密相逆,其實也是調(diào)用寫好的模塊,對密文進行16次迭代解密,但在每一輪中要進行中間一些加密結果的顯示,又因為加密和解密我寫在了同一個Encrypt函數(shù)里,因此只用標志位flag區(qū)別加解密,1為加密,0為解密。int[]LwhDES::Encrypt(int[]timeData,intflag,int[][]keyarray){elseif(flags==0){//解密for(i=15;i>-1;i--){ Fnew(M,i,flags,keyarray);//關鍵的解密步驟,下面代碼都是為顯示中間結果 intn,j; int[]k=newint[48]; System.out.println("第"+(16-(i+1))+"輪輸出的密文的十六進制形式:"); System.out.println(changeBtoH(M)); for(j=0;j<48;j++) { k[j]=keyarray[i]

溫馨提示

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

評論

0/150

提交評論