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

下載本文檔

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

文檔簡(jiǎn)介

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論