簡單的文件加密程序java 1_第1頁
簡單的文件加密程序java 1_第2頁
簡單的文件加密程序java 1_第3頁
簡單的文件加密程序java 1_第4頁
簡單的文件加密程序java 1_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

河南理工大學計算機科學與技術學院課程設計報告2014—2015學年第一學期課程名稱網(wǎng)絡安全設計題目實現(xiàn)加解密程序姓名_____________學號__________專業(yè)班級網(wǎng)絡1203_指導教師________2014年12月目錄1.1設計目的21.2設計要求22.1設計前提22.2關于DES算法的介紹32.3DES算法原理32.4功能需求33.1系統(tǒng)模塊圖43.2主函數(shù)流程圖43.3內(nèi)部函數(shù)流程圖 54.1程序使用運行 55.1關于對程序編寫的心得76.1參考文獻 81.1設計目的通過課程設計,使學生了解高級程序設計語言的結(jié)構(gòu),逐漸培養(yǎng)學生的編程能力、用計算機解決實際問題的能力,掌握基本的程序設計過程和技巧,掌握基本的分析問題和利用計算機求解問題的能力,具備初步的高級語言程序設計能力。為后續(xù)各門計算機課程的學習和畢業(yè)設計打下堅實基礎。程序設計的主要任務是要求學生遵循軟件開發(fā)過程的基本規(guī)范,運用結(jié)構(gòu)化程序設計的方法,按照課程設計的題目要求,分析、設計、編寫、調(diào)試和測試程序及編寫設計報告。本課程設計的目標:1.鞏固《Java面向?qū)ο蟪绦蛟O計》課程學習的內(nèi)容和加深學生對基本知識的理解和掌握。同時加深對《網(wǎng)絡信息安全》中的密碼技術有了更深得理解。2.掌握編程和程序調(diào)試的基本技能。3.掌握軟件設計的方法。4.提高運用程序設計解決實際問題的能力。5.培養(yǎng)獨立思考、綜合運用所學有關相應知識的能力。6.強化上機動手編程能力,闖過理論與實踐相結(jié)合的難關!1.2設計要求1.分析課程設計題目的要求,根據(jù)所要求的程序功能,畫出程序的流程圖。2.對系統(tǒng)功能模塊進行分析,寫出詳細設計說明文檔。3.對程序源代碼進行調(diào)試與測試,使其能正確運行。4.設計完成的軟件要便于操作和使用。5.設計完成后提交課程設計報告。2.1設計前提通過本學期對《網(wǎng)絡信息安全》這本書的學習,學到了很多關于文件數(shù)據(jù)安全方面的知識,信息化、網(wǎng)絡化普及的今天,給我們帶來了諸多方便,但隨之而來的安全問題我們不得不重視。這次設計題目是簡單的加密小程序,我是用的是java高級編程語言來做代碼的實現(xiàn)。首先要了解加密技術;它是電子商務采取的主要的安全保密措施,是最常用的安全保密手段,利用技術可以將數(shù)據(jù)變?yōu)閬y碼進行傳送;到達目的之后再將該文件以同樣的手段進行還原也就是解密,其中不會破壞數(shù)據(jù)的完整性。加密技術包括兩個元素:算法和密鑰。算法就是將普通的信息與一串數(shù)字的結(jié)合,產(chǎn)生不可理解的信息密文的步驟,密鑰是用來對數(shù)據(jù)進行編碼和解碼的一種算法。在安全保密中,可以通過適當?shù)拿荑€加密技術和管理機制來保證網(wǎng)絡的信息通訊安全。2.2關于DES算法的介紹:DES算法是美國國家標準局在1973年開始研究除國防部門外的計算機系統(tǒng)的數(shù)據(jù)加密標準;于1973年5月提供高質(zhì)量的數(shù)據(jù)保護,防止數(shù)據(jù)未經(jīng)授權(quán)的泄露和未被察覺的修改;具有較高的復雜性,使得破譯開銷超過可能獲得的利益,同時又要便于理解和掌握。DES密碼體制的安全性應該不依賴算法的保密,其安全性僅以加密密鑰的保密為基礎。實現(xiàn)經(jīng)濟,運行有效并且適用于多種不同的應用。1977年1月,美國政府正式許可以IBM公司設計的方案作為非機密數(shù)據(jù)的數(shù)據(jù)加密標準。DES算法已經(jīng)應用于許多需要安全加密的場合,UNIX的密碼保護算法就是以DES算法為基礎的。2.3.DES算法工作原理DES算法是這樣工作的:如Mode為加密,則用Key去把數(shù)據(jù)Date進行加密,生成Date的密碼形式作為DES的輸入結(jié)果;如果Mode為解密,則用Key去把密碼形式的數(shù)據(jù)Date解密,還原為Date的明碼形式作為輸出結(jié)果。在通信網(wǎng)絡的兩端,雙方約定一致的Key,在通信的源點用Key對核心數(shù)據(jù)進行加密,然后以密碼形式在公共通信網(wǎng)中傳輸?shù)酵ㄐ啪W(wǎng)絡的終點,數(shù)據(jù)到達目的地后用同樣的Key進行解密;再現(xiàn)了核心數(shù)據(jù)。保證了核心數(shù)據(jù)的安全傳輸。簡單地說,算法只不過是加密的兩個技術混亂和擴散的組合。DES基本組件分組是這些技術的一個組合。它基于密鑰作用于明文,這就是眾所周知的輪。DES有十六輪,這意味著在明文分組上16次實施相同的組合技術。DES對64bit的明文分組進行操作。通過一個初始置換,將明文分為左半部分和右半部分,各長32bit然后進行16輪完全相同的迭代,在迭代過程中數(shù)據(jù)與密鑰結(jié)合。經(jīng)過16輪后,左右部分合在一起經(jīng)過一個置換,該算法就完成了。DES的算法特點:分組比較短,密鑰太短,密碼生命周期短,運算速度慢。2.4功能需求1.首先是能夠有可視化的圖形化界面。2.能夠查看選擇本地文件。3.能夠隨機產(chǎn)生大于等于48位的隨機密碼。用戶自行輸入也可以。4.能夠?qū)⒓用芎蟮奈募暮缶Y名生成到當前文件夾中。5.能夠解密曾經(jīng)加密后的文件。3.1系統(tǒng)模塊圖文件選擇類I/O方法對象文件選擇類I/O方法對象系統(tǒng)模系統(tǒng)模塊Random方法Random方法密碼隨機產(chǎn)生類密碼隨機產(chǎn)生類DES加密/解密DES加密/解密加密類事件監(jiān)聽器/加密類事件監(jiān)聽器/響應器JavaJava中各種api方法解密類解密類3.2主函數(shù)流程圖PublicstaticvoidMain主方法在java主函數(shù)中,通過調(diào)用一個類中的方法來實現(xiàn)調(diào)用各個類方法,體現(xiàn)了PublicstaticvoidMain主方法FileEncrypterFileEncrypter方法show();IOIO讀寫方法類FileFile文件操作方法類ActionListener監(jiān)聽器ActionListener監(jiān)聽器java.awt.Container圖形化界面3.3內(nèi)部函數(shù)流程圖3.3內(nèi)部函數(shù)流程圖開始開始輸入加密碼輸入加密碼輸入解密碼輸入解密碼DES方法解密DES方法加密DES方法解密DES方法加密生成指定后綴名的加密文件生成指定后綴名的加密文件刪除制定后后綴名文件是否繼續(xù)加密?刪除制定后后綴名文件是否繼續(xù)加密?是是否否是是否解密?是是否解密?否結(jié)束否結(jié)束4.1.程序使用運行當把代碼編譯好之后,點擊運行,系統(tǒng)會彈出如下圖界面,然后根據(jù)說明就可以實現(xiàn)對指定的文件進行加密了,加密的過程中可以選擇任何類型的文件進行加密,既然是加密那么就必須輸入加密密碼,該加密密碼我們設置成48位的了,數(shù)字大寫英文字母混合的類型;用戶也可以自行的輸入自己的密碼,記住就可以。然后運行加密,這時會在這個文件夾下生成一個后綴名為.tdes文件;那么這就是你加密后的文件。要解密的話只需要選中改后綴名的文件輸入密碼解密即可。如圖一,運行后出現(xiàn)程序界面。圖二,選擇待加密的文件圖三,輸入你的密碼或者隨機產(chǎn)生圖四,加密成功并生成文件圖五,解密成功5.1關于對程序編寫的心得這個程序看起來挺簡單的,但對于對java語言還是初學者的我,還是顯得有些難度的。在編寫的過程中,由于粗心經(jīng)常出現(xiàn)一些比較簡單的錯誤,比如遺漏逗號、雙引號、小括號,以及項目名稱,從而導致出現(xiàn)亂碼。我是使用的MyEclipse5.0編輯器下編寫調(diào)試的,通過幾次摸索學習對這個軟件的使用方法逐漸熟練起來,我以前學過《Java面向?qū)ο蠡A設計》這個課程,當時只是懵懵懂懂的了解一些,知道了什么是多態(tài)什么是繼承,接口,api之類的。這次課程設計我覺得可以試試java語言水平了,非常感謝這個課程設計,它能夠把我們所學到的《網(wǎng)絡信息安全》這門課和所學的語言深入的結(jié)合,在實踐中理解了安全的原理以及java代碼的實現(xiàn)。有時候會遇到一些錯誤但不知道錯在哪,更不知道怎么解決;看著有錯的程序,不知該如何改起!但是,通過上網(wǎng)查詢還有在老師、同學的幫助下,我最終還是完成了程序的編寫。經(jīng)過一個周的網(wǎng)絡安全課程設計,我認識到編程是一項很慎密的工作,來不得一點馬虎,否則就會給編程工作帶來很多不必要的麻煩。這次的課程設計加深了我對java語言的理解,也了解了加密算法的一些原理和使用方法。并且提高了我查閱相關參考資料和獨立分析解決問題以及自己上機動手的能力。課程設計為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結(jié)合起來,鍛煉學生的分析解決實際問題的能力。應實際,實踐編程的能力。6.1參考文件:《網(wǎng)絡信息安全》安葳鵬劉沛騫主編《Java基礎程序設計》吳正江主編百度百科附錄一、源代碼:ernal.ws.api.server.Container;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.io.*;importjava.security.*;importjavax.crypto.*;importjavax.crypto.spec.*;publicclassFileEncrypterextendsJFrame{ publicstaticfinalintWIDTH=550; publicstaticfinalintHEIGHT=200; publicstaticvoidmain(Stringargs[]){ FileEncrypterfe=newFileEncrypter(); fe.show();} FileEncrypter(){ this.setSize(WIDTH,HEIGHT); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); this.setTitle("文件加密器(TriDES)"); java.awt.Containerc=this.getContentPane(); c.setLayout(newFlowLayout());finalFilePanelfp=newFilePanel("文件選擇"); c.add(fp); finalKeyPanelpp=newKeyPanel("密碼"); c.add(pp);JButtonjbE=newJButton("加密"); c.add(jbE); jbE.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){ Filefile=newFile(fp.getFileName()); if(file.exists())encrypt(file.getAbsoluteFile(),pp.getKey()); else JOptionPane.showMessageDialog(null,"請選擇文件!","提示", JOptionPane.OK_OPTION); } }); JButtonjbD=newJButton("解密"); c.add(jbD); jbD.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventevent){ Filefile=newFile(fp.getFileName()); if(file.exists

()) decrypt(file.getAbsoluteFile(),pp.getKey()); else

JOptionPane.showMessageDialog(null,"請選擇文件!

","提示", JOptionPane.OK_OPTION); } }); } /** *加密函數(shù)輸入:要加密的文件,密碼(由

0-F組成,共48個字符,表示3個8位的密碼)如: *AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746

其中:AD67EA2F3BE6E5AD *DES密碼一D368DFE03120B5DFDES密碼二92A8FD8FEC2F0746DES密碼三輸出: *對輸入的文件加密后,保存到同一文件夾下增加了".tdes"擴展名的文件中。 */ privatevoidencrypt(FilefileIn,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));FileInputStreamfis=newFileInputStream(fileIn);byte[]bytIn=newbyte[(int)fileIn.length()];for(inti=0;i<fileIn.length();i++){ bytIn[i]=(byte)fis.read(); } //加密byte[]bytOut=encryptByDES(encryptByDES(encryptByDES(bytIn, bytK1),bytK2),bytK3);StringfileOut=fileIn.getPath()+".tdes";FileOutputStreamfos=newFileOutputStream(fileOut); for(inti=0;i<bytOut.length;i++){ fos.write((int)bytOut[i]); } fos.close(); JOptionPane.showMessageDialog(this,"加密成功!","提示", JOptionPane.OK_OPTION); }else JOptionPane.showMessageDialog(this,"密碼長度必須等于48!","錯誤信息" JOptionPane.ERROR_MESSAGE); }catch(Exceptione){ e.printStackTrace(); } } /** *解密函數(shù)輸入:要解密的文件,密碼(由

0-F組成,共48個字符,表示3個8位的密碼)如: *

AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746

其中:AD67EA2F3BE6E5AD *DES密碼一D368DFE03120B5DFDES密碼二

92A8FD8FEC2F0746DES密碼三輸出: *對輸入的文件解密后,保存到用戶指定的文件中。 */ privatevoiddecrypt(FilefileIn,String

sKey){ try{ if(sKey.length()==48)

{ StringstrPath=

fileIn.getPath(); if(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=newJFileChooser();chooser.setCurrentDirectory(newFile("."));chooser.setSelectedFile(newFile(strPath)); //用戶指定要保存

的文件 intret=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.substring(32,48)); FileInputStreamfis=newFileInputStream(fileIn);byte[]bytIn=newbyte[(int)fileIn.length()];for(inti=0;i<fileIn.length();i++){ bytIn[i]=(byte)fis.read(); } //解密 byte[]

bytOut=decryptByDES(decryptByDES(decryptByDES(

bytIn,bytK3),bytK2),bytK1); File

fileOut=chooser.getSelectedFile();

fileOut.createNewFile();

FileOutputStreamfos=newFileOutputStream

(fileOut); for(int

i=0;i<bytOut.length;i++){ fos.write((int)bytOut[i]); } fos.close();

JOptionPane.showMessageDialog(this,"解密成功!","提示",JOptionPane.OK_OPTION); } }else JOptionPane.showMessageDialog(this,"密碼長度必須

等于48!","錯誤信息",

JOptionPane.ERROR_MESSAGE); }catch(Exceptione){

JOptionPane.showMessageDialog(this,"解密失敗,請

核對密碼!","提示",

JOptionPane.OK_OPTION); } } /** *用DES方法加密輸入的字節(jié)bytKey需為8字

節(jié)長,是加密的密碼 */ privatebyte[]encryptByDES(byte[]bytP,

byte[]bytKey)throwsException{ DESKeySpecdesKS=new

DESKeySpec(bytKey); SecretKeyFactoryskf=

SecretKeyFactory.getInstance("DES"); SecretKeysk=

skf.generateSecret(desKS); Ciphercip=Cipher.getInstance

("DES"); cip.init(Cipher.ENCRYPT_MODE,

sk); returncip.doFinal(bytP); } /** *用DES方法解密輸入的字節(jié)bytKey需為8字

節(jié)長,是解密的密碼 */ privatebyte[]decryptByDES(byte[]bytE,

byte[]bytKey)throwsException{ DESKeySpecdesKS=new

DESKeySpec(bytKey); SecretKeyFactoryskf=

SecretKeyFactory.getInstance("DES"); SecretKeysk=

skf.generateSecret(desKS); Ciphercip=Cipher.getInstance

("DES"); cip.init(Cipher.DECRYPT_MODE,

sk); returncip.doFinal(bytE); } /** *輸入密碼的字符形式,返回字節(jié)數(shù)組形式。

如輸入字符串:AD67EA2F3BE6E5AD返回字節(jié)數(shù)組:{ *173,103,234,47,59,230,229,173} */ privatebyte[]getKeyByStr(Stringstr){ byte[]bRet=newbyte

[str.length()/2]; for(inti=0;i<str.length()

/2;i++){ Integeritg=new

Integer(16*getChrInt(str.charAt(2*i)) +

getChrInt(str.charAt(2*i+1))); bRet[i]=itg.byteValue

(); } returnbRet; } /** *計算一個16進制字符的10進制值輸入:0-F */ privateintgetChrInt(charchr){ intiRet=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".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)) 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; returniRet; }}/***文件選擇組件。*/classFilePanelextendsJPanel{ FilePanel(Stringstr){ JLabellabel=newJLabel(str); JTextFieldfileText=new

JTextField(35); JButtonchooseButton=new

JButton("瀏覽..."); this.add(label); this.add(fileText); this.add(chooseButton); clickActionca=new

clickAction(this); chooseButton.addActionListener

(ca); } publicStringgetFileName(){ JTextFieldjtf=(JTextField)

this.getComponent(1); returnjtf.getText(); } privateclassclickActionimplements

ActionListener{ clickAction(Componentc){ cmpt=c; } publicvoidactionPerformed

(ActionEventevent){ JFileChooserchooser=

newJFileChooser();

chooser.setCurrentDirectory(newFile(".")); intret=

chooser.showOpenDialog(cmpt); if(ret==

JFileChooser.APPROVE_OPTION){ JPaneljp=

(JPanel)cmpt; JTextFieldjtf=

(JTextField)jp.getComponent(1); jtf.setText

(chooser.getSelectedFile().getPath()); } } privateComponentcmpt; }}/***密碼生成組件。*/classKeyPanelextendsJPanel{ KeyPanel(Stringstr){ JLabellabel=newJLabel(str); JTextFieldfileText=new

JTextField(35); JButtonchooseButton=new

JButton("隨機產(chǎn)生"); this.add(label); this.add(fileText); this.add(chooseButton); clickActionca=new

clickAction(this); chooseButton.addActionListener

(ca); } //返回生成的密碼(48個字符長度) publicStringgetKey(){ JTextFieldjtf=(JTextField)

this.getComponent(1); returnjtf.getText(); } privateclassclickActionimplements

ActionListener{ clickAction(Componentc){ cmpt=c; } publicvoidactionPerformed

(ActionEventevent){ try{ KeyGeneratorkg

=KeyGenerator.getInstance("DES"); kg.init(56); Keyke=

kg.generateKey(); byte[]bytK

溫馨提示

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

評論

0/150

提交評論