java文件加密課程設計_第1頁
java文件加密課程設計_第2頁
java文件加密課程設計_第3頁
java文件加密課程設計_第4頁
java文件加密課程設計_第5頁
已閱讀5頁,還剩21頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、 結業報告 課程名稱: 網絡安全技術 設計題目: java實現文件加密 系 別: *學院 專 業: * 組 員: * 起止日期* 指導教師: * 摘要目前世界范圍內的信息安全問題越來越嚴重。解決信息安全問題涉及面很廣,它包括技術,管理制度,人員和法律等諸多方面,但最核心部分是密碼技術。密碼技術是實現一種變換,它使得對大量信息的保護變為對少量密鑰的保護。本次結業設計以文件的加密與解密問題為主要研究討論方向。先對加密技術進行查找資料。然后對加密方法進行概述,而后對3DES加密進行詳細介紹何分析,并對結業設計成果進行演示,最后附上代碼。由于本次結業設計時間倉促外加能力有限,有諸多不足之處以及可能存在

2、某些為發現錯誤還請批評指正。感謝之至。關鍵詞:加密 解密 密鑰 3DESAbstractAt present, the problem of information security is more and more serious in the world. To solve the problem of information security involves a wide range, including technology, management, system, personnel and law, etc., but the most important part is the

3、 password technology. Password technology is to achieve a transformation, which makes the protection of a large number of information into a small number of key protection.The graduation project to document encryption and decryption issues as the main research and discussion. First, the encryption t

4、echnology to find information. Then the encryption method is outlined, and then the 3DES encryption for detailed analysis, and the completion of the design results are demonstrated, and finally attached to the code. Due to the limited capacity of the completion of this graduation project, there are

5、many deficiencies and there may be some to find errors also please criticism. Thanks to.目錄ABSTRACT一背景分析- 1 -二 DES算法- 1 -2.1 DES算法思想- 1 -2.2 DES算法原理- 2 -2.3 兩個密鑰的三重DES- 3 -2.4 Java語言編程實現DES算法- 3 -三調試結果與說明- 5 -四課程設計總結與體會- 7 -參考文獻- 7 -代碼附錄:- 8 -項目總體分工 項目名稱Java文件實現文件加密項目協調人設計時間指導教師姓 名學 號專業班級項目分工資料收集,論文查

6、找姓 名學號專業班級項目分工總體協調安排,代碼編寫姓 名學 號專業班級項目分工整理資料,論文編寫姓 名學 號專業班級項目分工程序驗證,測試可行性一背景分析隨著Internet的高速發展,很多日常工作和數據傳輸都放在Internet網上進行,大大提高了效率,降低了成本,創造了良好的效益。但是,由于Internet網絡協議本身存在著重要的安全問題(IP包本身并不繼承任何安全特性很容易偽造出IP包的地址、修改其內容、重播以前的包以及在傳輸途中攔截并查看包的內容),使網上的信息傳輸存在巨大的安全風險:很可能傳輸的信息被別人截取,造成巨大的損失。針對這些問題,IETF(因特網工程任務組)發布了IP層安全

7、標準IPSec(IP Security)其目的是為在Internet上的數據傳輸提供具有較強的互操作能力、高質量和基于密碼的安全實現方法。IPSec提供了一種標準的、完善的以及包容廣泛的機制,可用它為IP及上層協議(如UDP和TCP)提供安全保證。IPSec可保證主機之問、網絡安全網關(如路由器或防火墻)之間或主機與安全網關之間的數據包的安全。因此,利用IPSec協議在公用網絡上通過對傳輸的數據進行加密和驗證,從而達到安全保密的目的,這已經成為網絡安全的一個重要手段。本文主要介紹使用常用的對稱算法數據加密標準DES(Data Encryption Standard)在Java環境下實現數據的加

8、密與解密。二 DES算法2.1 DES算法思想DES(Data Encryption Standard)算法 是1977年 得 到 美 國政府正式許可的一種用56位密鑰來加密64位數據的加 密方 法 。DES是一種特殊類型的迭代密碼。簡單說來,DES是采用傳統的替換和移位的方法加密的分組密碼,其算法是對稱的,這樣既可以用于加密也可以用于解密。DES用56位密鑰對64位的明文數據塊進行加密,每次加密可以對64位的明文數據進行16輪編碼,經過一系列替換和移位后,輸出完全不同的64位密紋數據。 DES入口參數有3個:Key、Data、Mode,其中Key為7個字節共56位(另有8位作為奇偶校驗位,這

9、樣保證了明文與密鑰長度的一致性),是DES算法的工作密鑰;Data為8位字節64位, 是要被加密或解密的數據;Mode為DES的工作方式,由兩種:加密、解密。由于DES算法使用64位的標準算法和邏輯運算、運算速度快、密鑰產生容易,因此適合當前大多數計算機上用軟件方法實現。2.2 DES算法原理DES是一種分組加密算法。明文分組長度為64位。加密得到的密文分組長度為64位。密鑰長度64位,8個字節。每一個字節的最高位用于奇偶效驗,所以有效密鑰長度為56位。其分組加密過程描述如下:子密鑰Ki的生成。64位的明文經過一個初始置換IP后,被分成左右兩半部分,每個部分32位,以L0和R0表示。進行16輪

10、迭代變換:第i 輪變換將上一輪變換所得到的結果的右半部分與第i個子密鑰Ki結合,這個過程稱為f函數。第i輪變換結果的左半部分為上一輪變換結果的右半部分(即:Li=Ri-1),其右半部分為上一輪變換結果的左半部與上一輪變換結果的右半部經過F函數處理所的結果的異或:Ri=Li-1F(Ri-1,Ki)。16輪變換之后左右兩部分再連接起來,經過一個初始逆置換IP-1得到密文。 其加密過程如圖1所示。DES的解密算法與加密算法完全相同,只需要將密鑰的應用次序與加密時相反應用即可。即解密過程是初始置換函IP數接受長度為64比特的密文輸入, 將16個子密鑰按照K16到K1的順序應用與F函數的16輪迭代運算中

11、, 然后將迭代的結果經由末置換函數IP-1得到64位的明文輸出。2.3 兩個密鑰的三重DES由于DES密鑰只有56bit,易于遭受窮舉時攻擊。作為一種替代加密方案,Tuchman提出使用兩個密鑰的三重DES加密方法,并在1985年成為美國的一個商用加密標準。該方法使用兩個密鑰,執行三次DES算法。加密的過程是加密-解密-加密,解密的過程是解密-加密-解密。采用兩個密鑰進行三重加密的好處有:兩個密鑰合起來有效密鑰長度有112bit,可以滿足商業應用的需要,若采用總長為168bit的三個密鑰,會產生不必要的開銷。加密時采用加密-解密-加密,而不是加密-加密-加密的形式,這樣有效的實現了與現有DES

12、系統的向后兼容問題。因為當K1=K2時,三重DES的效果就和原來的DES一樣,有助于逐漸推廣三重DES。三重DES具有足夠的安全性,目前還沒有關于攻破三重DES的報道。2.4 Java語言編程實現DES算法1、 子密鑰的生成1) PC-1變換。將原密鑰的各位按照PC-1矩陣重新排列,這一過程剔除了奇偶校驗位。PC-1如下:57 49 41 33 25 17 91 58 50 42 34 26 1810 2 59 51 43 35 2719 11 3 60 52 44 3663 55 4739 31 23 157 62 54 46 38 30 2214 6 61 53 45 37 2921 13

13、 5 28 20 12 42) 將排好的密鑰分成兩部分,前面28位為C0,后面28位為D0。3) 從i=1開始,循環執行16次以下步驟得到16個子密鑰。 對Ci-1和Di-1進行相同位數的循環左移,得到Ci和Di左移的位數為:i取數值: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16移 動 數: 1 1 2 2 2 2 2 2 1 2 2 22 221 連接Ci和Di,按照矩陣PC-2排列選擇合適的位,構成子密鑰Ki,該過程將56位壓縮到48位,PC-2如下:14 17 11 24 1 53 28 15 6 21 1023 19 12 4 26 816 7 27

14、20 13 241 52 31 37 47 5530 40 51 45 33 4844 49 39 56 34 5346 42 50 36 29 32 i=i+1,轉到 ,直到生成16個全部自密鑰。2、 對64位明文分組加密1) 取得64位明文,不足補齊(補0)2) 對明文各位按照IP矩陣進行排列,矩陣為:58 50 42 34 26 18 10 260 52 44 36 28 20 12 462 54 46 38 30 22 14 664 56 48 40 32 24 16 857 49 41 33 25 17 9 159 51 43 35 27 19 11 361 53 45 37 29

15、21 13 563 55 47 39 31 23 15 73) 將得到的結果分為左右各32位兩部分,稱為L0, R04) 從i=1開始,循環執行16次下列的加密過程 按照下面矩陣E將32位的Ri-1擴展為48位,所得結果稱為E( Ri-1),E陣為:32 1 2 3 4 54 5 6 7 8 98 9 10 11 12 1312 13 14 15 16 1716 17 18 19 20 2120 21 22 23 24 2524 25 26 27 28 2928 29 30 31 32 1 將E( Ri-1)和Ki按位異或 將所得結果分為8個部分,每個部分6位,形成B1,B8 S盒替代。S盒是

16、8個子矩陣,稱為S1,.S8,替代如下:將Bi的第1位和第6位組成一個數稱為R,第2、3、4、5位組成一個數稱為C,用Si中對應的(R,C)中的4位數替換Bi,這樣就將原來的48位替換成32位。 P盒置換 ,按照下面的矩陣重新排列上面的結果16 7 20 2129 12 28 171 15 23 265 18 31 102 8 24 1432 2 3 919 13 30 622 11 4 25 將上一步處理的結果與Li-1按位異或,得到新的Ri,該過程可以簡單記為:Ri=Li-1F(Ri-1,Ki) i=i+1 轉的第一步,直到完成16次循環 進行IP-1置換,將上面得到的L16R16按照下面

17、的矩陣進行置換:40 8 48 16 56 24 64 3239 7 47 15 55 23 63 3138 6 46 14 54 22 62 3037 5 45 13 53 21 61 2936 4 44 12 52 20 60 2835 3 43 11 51 19 59 2734 2 42 10 50 18 58 2633 1 41 9 49 17 57 25加密過程結束,解密過程是用K16,K15,.K13、DES 算法的偽代碼表示C0d0=PC1(KEY)FOR I=1 TO 16CI=LSI(CI-1)DI=LSI(DI-1)KI=PC2(CIDI)L0R0=IP(PLAIN BLO

18、CK)FOR I=1 TO 16LI=RI-1RI=LI-1 F(RI-1,KI)CIPHER BLOCK=FP-1(L16R16)4、 算法安全性分析DES算法具有相當高的復雜性,密碼函數F的非線性性質非常好, 起到的“ 擾亂” 效果非常顯著, 并且還遵循了嚴格雪崩準則和比特獨立準則, 這使得要破譯它的開銷要超過可能獲得的利益。再加上其便于理解掌握,經濟有效, 因此, 得到了廣泛的應用。算法具有極高的安全性, 到目前為止, 除了用窮舉搜索法對算法進行攻擊外, 還沒有發現更有效的辦法。而56位長的密鑰的窮舉空間為256, 這意味著如果一臺計算機的速度是每一秒種檢測一百萬個密鑰, 則它搜索完全部

19、密鑰就需要將近2300年的時間。而采用三重DES,破譯它就更可想而知了。當然, 這并不等于說是不可破解的。而實際上, 隨著硬件技術和網絡的發展, 其破解的可能性越來越大, 而且所需要的時間越來越少。DES算法的有效密鑰長度為56位,因此,在實際應用中,我們應避開使用第8,16,24,64位作為有效數據位,才能保證DES算法安全可靠地發揮作用。如果不了解這一點,將不能保證DES加密數據的安全性,對運用DES來達到保密作用的系統產生數據被破譯的危險,這正是DES算法在應用上的誤區,留下了被人攻擊、被人破譯的極大隱患。三調試結果與說明 1 運行程序選擇一個明文為本次加密的文件。演示文件為new1.t

20、xt,文件內容為:hello DES 選擇文件隨機生成(48位秘鑰)進行加密 2 生成加密文件 new1.txt.tdes打開文件為亂碼,表示為加密成功3解密文件選擇文件(剛才加密的文件new1.txt.tdes)產生秘鑰窗口輸入剛才的秘鑰(48位秘鑰)解密文件輸入對應的密鑰314 輸入要保存的文件的名字,獲得對應的系統解密成功提示。5 打開對應文件,得到對應結果。表示解密成功。 6 錯誤密鑰進行測試解密 四課程設計總結與體會本次課程設計使用了3DES加密算法對文件進行加密,重新對DES加密算法有了一個了解,雖然加密過程是由系統中的 crypto類庫完成的。但是對java的圖形界面也是一個很好

21、的進一步熟悉的過程。在參看相關文件的時候也對相關的加密解密不走也有了一個很好地了解。對密碼學也有了進一步的認識。對今后學習打下一定基礎。參考文獻1蔡皖東.網絡與信息安全M.陜西:西北工業大學出版社,2004.2數字時代工作室.個人用網安全與黑客防范技術M.北京:人民郵電出3董清潭,三重DES加密算法原理與實現.電腦知識與技術:學術交流,2011,0(4X)4梁雅,劉嵐,基于Java卡DES及3DES算法的實現.武漢理工大學學報:信息與管理工程版,2006,28(11)代碼附錄:package p_3gai;import java.awt.*; import java.awt.event.*;

22、import javax.swing.*; import java.io.*; import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; public class FileEncrypter extends JFrame public static final int WIDTH = 600; public static final int HEIGHT = 200; public static void main(String args) FileEncrypter fe = new FileEncr

23、ypter(); fe.show(); FileEncrypter() this.setSize(WIDTH,HEIGHT); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); Toolkit tk = Toolkit.getDefaultToolkit(); Dimension screenSize = tk.getScreenSize(); this.setLocation(screenSize.width - WIDTH)/2, (screenSize.height - HEIGH

24、T)/2); this.setTitle("- java文件加密課程設計 -"); Container c = this.getContentPane(); c.setLayout( new FlowLayout(); final FilePanel fp = new FilePanel("加/解密文件:"); c.add(fp); final KeyPanel pp = new KeyPanel("產生秘鑰"); c.add(pp); JButton jbE = new JButton("進行加密"); c.ad

25、d(jbE); jbE.addActionListener(new ActionListener() public void actionPerformed(ActionEvent event) File file = new File(fp.getFileName(); if (file.exists() encrypt(file.getAbsoluteFile(),pp.getKey(); else JOptionPane.showMessageDialog( null,"請選擇文件!","提示",JOptionPane.OK_OPTION); );

26、 JButton jbD = new JButton("解密文件"); c.add(jbD); jbD.addActionListener(new ActionListener() public void actionPerformed(ActionEvent event) File file = new File(fp.getFileName(); if (file.exists() decrypt(file.getAbsoluteFile(),pp.getKey(); else JOptionPane.showMessageDialog( null,"請選擇文

27、件!","提示",JOptionPane.OK_OPTION); ); /* 加密函數 輸入: 要加密的文件,密碼(由0-F組成,共48個字符,表示3個8位的密碼)如: AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746 其中: AD67EA2F3BE6E5AD DES密碼一 D368DFE03120B5DF DES密碼二 92A8FD8FEC2F0746 DES密碼三 輸出:對輸入的文件加密后,保存到同一文件夾下增加了".tdes"擴展名的文件中。*/ private void encrypt(F

28、ile fileIn,String sKey) try if(sKey.length() = 48) /截取密鑰串為三重加密做準備byte bytK1 = getKeyByStr(sKey.substring(0,16); byte bytK2 = getKeyByStr(sKey.substring(16,32); byte bytK3 = getKeyByStr(sKey.substring(32,48); FileInputStream fis = new FileInputStream(fileIn); byte bytIn = new byte(int)fileIn.length()

29、; for(int i = 0;i<fileIn.length();i+) bytIni = (byte)fis.read(); /加密文件 byte bytOut = encryptByDES(encryptByDES( encryptByDES(bytIn,bytK1),bytK2),bytK3); /調用DES加密String fileOut = fileIn.getPath() + ".tdes" FileOutputStream fos = new FileOutputStream(fileOut); for(int i = 0;i<bytOut.le

30、ngth;i+) fos.write(int)bytOuti); fos.close(); JOptionPane.showMessageDialog(this,"恭喜!加密成功!","提示",JOptionPane.OK_OPTION); else JOptionPane.showMessageDialog( this,"秘鑰長度必須等于48!","錯誤信息",JOptionPane.ERROR_MESSAGE); catch(Exception e)e.printStackTrace();/* 解密函數 輸入:

31、要解密的文件,密碼(由0-F組成,共48個字符,表示3個8位的密碼)如: AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746 其中: AD67EA2F3BE6E5AD DES密碼一 D368DFE03120B5DF DES密碼二 92A8FD8FEC2F0746 DES密碼三 輸出:對輸入的文件解密后,保存到用戶指定的文件中。*/ private void decrypt(File fileIn,String sKey) try if(sKey.length() = 48) String strPath = fileIn.getPath(); if

32、(strPath.substring(strPath.length()-5).toLowerCase().equals(".tdes") strPath = strPath.substring(0,strPath.length()-5); else JOptionPane.showMessageDialog( this,"請添加合法的加密文件!","提示",JOptionPane.OK_OPTION); return; JFileChooser chooser = new JFileChooser(); chooser.setCurr

33、entDirectory(new File("."); chooser.setSelectedFile(new File(strPath); /用戶指定要保存的密文文件 int ret = chooser.showSaveDialog(this); if(ret=JFileChooser.APPROVE_OPTION) byte bytK1 = getKeyByStr(sKey.substring(0,16); byte bytK2 = getKeyByStr(sKey.substring(16,32); byte bytK3 = getKeyByStr(sKey.subs

34、tring(32,48); FileInputStream fis = new FileInputStream(fileIn); byte bytIn = new byte(int)fileIn.length(); for(int i = 0;i<fileIn.length();i+) bytIni = (byte)fis.read(); /解密密文 byte bytOut = decryptByDES(decryptByDES( decryptByDES(bytIn,bytK3),bytK2),bytK1); File fileOut = chooser.getSelectedFile

35、(); fileOut.createNewFile(); FileOutputStream fos = new FileOutputStream(fileOut); for(int i = 0;i<bytOut.length;i+) fos.write(int)bytOuti); fos.close(); JOptionPane.showMessageDialog( this,"恭喜!解密成功!","提示",JOptionPane.OK_OPTION); else JOptionPane.showMessageDialog( this,"

36、秘鑰長度必須等于48!","錯誤信息",JOptionPane.ERROR_MESSAGE); catch(Exception e)JOptionPane.showMessageDialog( this,"解密失敗,請核對秘鑰!","提示",JOptionPane.OK_OPTION); /* 用DES方法加密輸入的字節 bytKey需為8字節長,是加密的密碼 */ private byte encryptByDES(byte bytP,byte bytKey) throws Exception DESKeySpec des

37、KS = new DESKeySpec(bytKey); SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); SecretKey sk = skf.generateSecret(desKS); Cipher cip = Cipher.getInstance("DES"); cip.init(Cipher.ENCRYPT_MODE,sk); return cip.doFinal(bytP); /* 用DES方法解密輸入的字節 bytKey需為8字節長,是解密的密碼 */ private b

38、yte decryptByDES(byte bytE,byte bytKey) throws Exception DESKeySpec desKS = new DESKeySpec(bytKey); SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); SecretKey sk = skf.generateSecret(desKS); Cipher cip = Cipher.getInstance("DES"); cip.init(Cipher.DECRYPT_MODE,sk); retu

39、rn cip.doFinal(bytE); /* 輸入密碼的字符形式,返回字節數組形式。 如輸入字符串:AD67EA2F3BE6E5AD 返回字節數組: 173,103,234,47,59,230,229,173 */ private byte getKeyByStr(String str) byte bRet = new bytestr.length()/2; for(int i=0;i<str.length()/2;i+) Integer itg = new Integer(16*getChrInt(str.charAt(2*i) + getChrInt(str.charAt(2*i

40、+1); bReti = itg.byteValue(); return bRet; /* 計算一個16進制字符的10進制值 輸入:0-F */ private int getChrInt(char chr) int iRet=0; if(chr="0".charAt(0) iRet = 0; if(chr="1".charAt(0) iRet = 1; if(chr="2".charAt(0) iRet = 2; if(chr="3".charAt(0) iRet = 3; if(chr="4"

41、;.charAt(0) iRet = 4; if(chr="5".charAt(0) iRet = 5; if(chr="6".charAt(0) iRet = 6; if(chr="7".charAt(0) iRet = 7; if(chr="8".charAt(0) iRet = 8; if(chr="9".charAt(0) iRet = 9; if(chr="A".charAt(0) iRet = 10; if(chr="B".charAt(0)

42、iRet = 11; if(chr="C".charAt(0) iRet = 12; if(chr="D".charAt(0) iRet = 13; if(chr="E".charAt(0) iRet = 14; if(chr="F".charAt(0) iRet = 15; return iRet; /* 文件選擇組件。 */ class FilePanel extends JPanel FilePanel(String str) JLabel label = new JLabel(str); JTextFiel

43、d fileText = new JTextField(35); JButton chooseButton = new JButton("選擇文件"); this.add(label); this.add(fileText); this.add(chooseButton); clickAction ca = new clickAction(this); chooseButton.addActionListener(ca); public String getFileName() JTextField jtf = (JTextField)this.getComponent(1

44、); return jtf.getText(); private class clickAction implements ActionListener clickAction(Component c) cmpt = c; public void actionPerformed(ActionEvent event) JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new File("."); int ret = chooser.showOpenDialog(cmpt); if(re

45、t=JFileChooser.APPROVE_OPTION) JPanel jp = (JPanel)cmpt; JTextField jtf = (JTextField)jp.getComponent(1); jtf.setText(chooser.getSelectedFile().getPath(); private Component cmpt; /* 密碼生成組件。 允許實現隨機生成*/ class KeyPanel extends JPanel KeyPanel(String str) JLabel label = new JLabel(str); JTextField fileText = new JTextField(35); JButton chooseButton = new JButton("隨機生成"); this.add(label); this.add(fileText); this.add(chooseButton); clickAction ca = new clickAction(this); chooseButton.addActionListener(ca); /返回生成的密碼(48個字符長度) public S

溫馨提示

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

評論

0/150

提交評論