




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上課程設(shè)計(jì)報(bào)告書課程名稱 網(wǎng)絡(luò)信息安全 設(shè)計(jì)題目 文本文檔的加密與解密 專業(yè)班級 互聯(lián)網(wǎng)12級2班 學(xué) 號 1 姓 名 趙豪豪 指導(dǎo)教師 賀蕾 2015年 7月1日摘 要 隨著網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,人們的個人信息、網(wǎng)絡(luò)間的文件傳遞、電子商務(wù)等方面都需要大力的保護(hù),文件加密技術(shù)也就隨之產(chǎn)生。文件的加密主要是由加密算法實(shí)現(xiàn),加密算法有多種,常見的有、等。本程序設(shè)計(jì)對文件的加密使用的是加密算法。Java語言具有簡單、安全、可移植、面向?qū)ο?、健壯、多線程、體系結(jié)構(gòu)中立、解釋執(zhí)行、高性能、分布式和動態(tài)等主要特點(diǎn)。利用Java語言中秘密密鑰工廠對算法的支持,使程序?qū)崿F(xiàn)文件加密、解密兩
2、大功能更簡單。 關(guān)鍵詞:JAVA ; DES; 加密; 解密; 前 言 DES全稱為Data Encryption Standard,即數(shù)據(jù)加密標(biāo)準(zhǔn),是一種使用的塊算法,1976年被的國家標(biāo)準(zhǔn)局確定為(FIPS),隨后在國際上廣泛流傳開來。DES ( data encryption Standard) 是一種世界標(biāo)準(zhǔn)的加密形式, 已經(jīng)15 年歷史了,雖然有些老, 可還算是比較可靠的算法。在七十的初期, 隨著計(jì)算機(jī)之間的通信發(fā)展, 需要有一種標(biāo)準(zhǔn)密碼算法為了限制不同算法的激增使它們之間不能互相對話。為解決這個問題, 美國國家安全局(N.S.A ) 進(jìn)行招標(biāo)。 I.B.M 公司開發(fā)了一種算法, 稱
3、為:Lucifer。 經(jīng)過幾年的研討和修改, 這種算法, 成為了今天的D.E.S,1976 年11月23 日, 終于被美國國家安全局采用。 D.E.S 是分塊加密的,將明文分割成 64 BITS 的塊, 然后它們一個個接起來 。它使用56位密鑰對64位的數(shù)據(jù)塊進(jìn)行加密,并對64bits的數(shù)據(jù)塊進(jìn)行16輪編碼。與每輪編碼時(shí),一個48bits的“每輪”密鑰值由56bits的完整密鑰得出來。DES用軟件進(jìn)行解碼需要用很長時(shí)間,而用硬件解碼速度非常快,1977年,人們估計(jì)要耗資兩千萬美元才能建成一個專門計(jì)算機(jī)用于DES的解密,而且需要12個小時(shí)的破解才能得到結(jié)果。所以,當(dāng)時(shí)DES被認(rèn)為是一種十分強(qiáng)壯的
4、加密方法。但今天, 只需 二十萬美圓就可以制造一臺破譯DES的特殊的計(jì)算機(jī),所以現(xiàn)在 DES 對要求“強(qiáng)壯”加密的場合已經(jīng)不再適用了。DES的唯一密碼學(xué)缺點(diǎn),就是密鑰長度相對比較短,人們并沒有放棄使用DES,而是想出了一個解決其長度問題的方法,即采用三重DES。加密成為三步, 而不是一步,每一步的密鑰都不一樣, 這樣爆破就比較復(fù)雜了,這樣要找三個密鑰, 而不是一個, 每個密鑰有56 BITS, 那樣我們就有56 乘以三, 等于168 Bits。本程序設(shè)計(jì)所采用的就是DES的變種三重DES算法。同時(shí)利用Java的GUI編程,生成文本對話框,對文件的路徑進(jìn)行選擇、提供密鑰框、加密和解密按鈕。目錄
5、專心-專注-專業(yè)一、題目分析1.1課程設(shè)計(jì)的要求和內(nèi)容1. 利用某種加密算法對指定的文本文件進(jìn)行加密(應(yīng)判斷其是否已經(jīng)加密,若已加密則結(jié)束該步驟,否則提示輸入加密口令,對文件進(jìn)行加密);2. 加密解密方法:可使用RSA,DES,MD5等之一加密算法。3 還應(yīng)該提供解密功能。1.2相關(guān)知識介紹 1.2.1 DES算法描述DES是一種分組加密算法,他以64位為分組對數(shù)據(jù)加密。64位一組的明文從算法的一端 輸入,64位的密文從另一端輸出。DES是一個對稱算法:加密和解密用的是同一個算法(除 密鑰編排不同以外)。 密鑰的長度為56位(密鑰通常表示為64位的數(shù),但每個第8位都用作奇偶檢驗(yàn),可以忽 略)。
6、密鑰可以是任意的56位數(shù),且可以在任意的時(shí)候改變。 DES算法的入口參數(shù)有3個:Key,Data,Mode。其中Key為8個字節(jié)共64位,是DES算法 的工作密鑰;Data也為8個字節(jié)64位,是要被加密或解密的數(shù)據(jù):Mode為DES的工作方式,有 兩種:加密或解密。 DES算法的工作過程:若Mode為加密,則用Key對數(shù)據(jù)Data進(jìn)行加密,生成Data的密碼 形式(64位)作為DES的輸出結(jié)果;若Mode為解密,則用Key對密碼形式的數(shù)據(jù)Data解密,還 原為Data的明碼形式(64位)作為DES的輸出結(jié)果。 在通信網(wǎng)絡(luò)的兩端,雙方約定了一致的Key,在通信的源點(diǎn)用Key對核心數(shù)據(jù)進(jìn)行DES加
7、密 ,然后以密碼形式通過公共通信網(wǎng)(如電話網(wǎng))傳輸?shù)酵ㄐ啪W(wǎng)絡(luò)的終點(diǎn),數(shù)據(jù)達(dá)到目的 地后,用同樣的Key對密碼數(shù)據(jù)進(jìn)行解密,便再現(xiàn)了明碼形式的核心數(shù)據(jù)。這樣便保證了核 心數(shù)據(jù)(如PIN,MAC等)在公共通信網(wǎng)中傳輸?shù)陌踩院涂煽啃?。通過定期在通信網(wǎng)絡(luò)的源 端和目的端同時(shí)改用新的Key,便能更進(jìn)一步提高數(shù)據(jù)的保密性,這正是現(xiàn)在金融界交易網(wǎng) 絡(luò)的流行作法。 簡單地說,算法只不過是加密的一種基本技術(shù),DES基本組建分組是這些技術(shù)的一種組合 ,他基于密鑰作用于明文,這是眾所周知的輪(round)。DES有16輪,這意味著要在明文分 組上16次實(shí)施相同的組合技術(shù)。 1.2.2 DES算法詳述DES算法把6
8、4位的明文輸入塊變?yōu)?4位的密文輸出塊,他所使用的密鑰也是64位,DES對64 位的明文分組進(jìn)行操作。通過一個初始置換,將明文分組分成左半部分和右半部分,各32位 長。然后進(jìn)行16輪相同的運(yùn)算,這些相同的運(yùn)算被稱為函數(shù)f,在運(yùn)算過程中數(shù)據(jù)和密 鑰相結(jié)合。經(jīng)過16輪運(yùn)算后左、右部分在一起經(jīng)過一個置換(初始置換的逆置換),這樣算 法就完成了。 (1)初始置換 其功能是把輸入的64位數(shù)據(jù)塊按位重新組合,并把輸出分為L0,R0兩部分,每部分各長32位,其置換規(guī)則如表1所示。表1 58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 62 54 46 38 30 2
9、2 14 6 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 1 59 51 43 35 27 19 11 3 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7即將輸入的第58位換到第1位,第50位換到第2位,依次類推,最后一位是原來的第7位,L0,R0則是換位輸出后的兩部分,L0是輸出的左32位,R0是右32位。例:設(shè)置換前 的輸入值為D1D2D3D64,則經(jīng)過初始置換后的結(jié)果為:L0=D58D50D8;R0=D57D497。 (2)逆置換 經(jīng)過16次迭代運(yùn)算后,得到L16,R16,將此作為輸入進(jìn)行逆置換,即得到
10、密文輸出。 逆置換正好是初始置換的逆運(yùn)算。例如,第1位經(jīng)過初始置換后,處于第40位,而通過逆置換,又將第40位換回到第1位,其逆置換的規(guī)則如表2所示。表2 40 8 48 16 56 24 64 32 39 7 47 15 55 23 63 31 38 6 46 14 54 22 62 30 37 5 45 13 53 21 61 29 36 4 44 12 52 20 60 28 35 3 43 11 51 19 59 27 34 2 42 10 50 18 58 26 33 1 41 9 49 17 57 25(3)函數(shù)f(Ri,Ki)的計(jì)算 其算法描述如圖1所示。密鑰Ri-1Li-1移位
11、移位擴(kuò)展置換S盒置換 Ri LiS盒置換P盒置換密鑰圖 1在圖1中,“擴(kuò)展置換”是將32位放大成48位,“P盒置換”是32位到32位換位,其換位 規(guī)則分別如表3、表4所示。表3 擴(kuò)展置換表 32 1 2 3 4 5 4 5 6 7 8 9 8 9 10 11 12 13 12 13 14 15 16 1716 17 18 19 20 21 20 21 22 23 24 2524 25 26 27 28 29 28 29 30 31 32 1表4 P盒置換表 16 7 20 21 29 12 28 17 1 15 23 26 5 18 31 10 2 8 24 14 32 27 3 9 19 1
12、3 30 6 22 21 4 25在f(Ri,Ki)算法描述圖中,S1,S2.S8為選擇函數(shù),其功能是把6bit變?yōu)?bit。下面給出選擇函數(shù)Si(i=1,2.8)的功能表: 選擇函數(shù)Si S1: 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7, 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8, 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0, 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13, S2: 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 3,
13、13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15, 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9, S3: 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12, S4: 7,13,14,3,0,6,9,10,1,
14、2,8,5,11,12,4,15, 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4, 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14, S5: 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14, 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3, S6: 1
15、2,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8, 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6, 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13, S7: 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6, 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2, 6,11,13,8,1,4,10,7,9,5,0
16、,15,14,2,3,12, S8: 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2, 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8, 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,在此以S1為例說明其功能,我們可以看到:在S1中,共有4行,命名為0,1、2、3行;每行有16列,命名為0、1、2、3,.,14、15列。 現(xiàn)設(shè)輸入為: DD1D2D3D4D5D6 令:列D2D3D4D5 行D1D6 然后在S1表中查得對應(yīng)的數(shù),以4位
17、二進(jìn)制表示,此即為選擇函數(shù)S1的輸出。(4)子密鑰Ki(48 b)的生成算法 開始,由于不考慮每個字節(jié)的第8位,DES的密鑰從64位變?yōu)?8位,如表5所示,首先56位 密鑰被分成兩個部分,每部分28位,然后根據(jù)輪數(shù),兩部分分別循環(huán)左移l或2位。表5 密鑰置換 57 49 41 33 25 17 9 1 58 50 42 34 26 18 10 2 59 51 43 35 27 19 11 3 60 52 44 36 63 55 47 39 31 23 15 7 62 54 46 38 30 22 14 6 61 53 45 37 29 21 13 5 28 20 12 4DES算法規(guī)定,其中第
18、8,16,64位是奇偶校驗(yàn)位,不參與DES運(yùn)算。故Key實(shí)際可用 位數(shù)只有56位。即:經(jīng)過密鑰置換表的變換后,Key的位數(shù)由64位變成了56位,此56位分為C 0,D0兩部分,各28位,然后分別進(jìn)行第一次循環(huán)左移,得到C1,D1,將C1(28位),D1(28位 )合并得到56位,再經(jīng)過壓縮置換,從而便得到了密鑰K0(48位)。依次類推,便可得到K1,K 2,K15。需要注意的是,16次循環(huán)左移對應(yīng)的左移位數(shù)要依據(jù)表6所示的規(guī)則進(jìn)行。表6 循環(huán)左移位數(shù) 輪 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16位數(shù) 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2
19、 1以上介紹了DES算法的加密過程。DES算法的解密過程是一樣的,區(qū)別僅在于第一次迭代時(shí)用子密鑰K15,第二次是K14,最后一次用K0,算法本身并沒有任何變化。二、概要設(shè)計(jì)2.1抽象數(shù)據(jù)類型的定義 2.1.1 程序所需要引入的包:import java.awt.*; /包含用于創(chuàng)建用戶界面和繪制圖形圖像的所有類。import java.awt.event.*; /提供處理由 AWT 組件所激發(fā)的各類事件的接口和類。import javax.swing.*; /提供一組“輕量級”(全部是 Java 語言)組件,盡量讓這些組件在所有平臺上的工作方式都相同。import java.io.*; /通過
20、數(shù)據(jù)流、序列化和文件系統(tǒng)提供系統(tǒng)輸入和輸出。import java.security.*; /為安全框架提供類和接口。import javax.crypto.*; /為 cryptographic(加密)操作提供類和接口。import javax.crypto.spec.*; / 為密鑰規(guī)范和算法參數(shù)規(guī)范提供類和接口。 2.1.2 其他定義:new FlowLayout() 對文件加密器對話框采用FlowLayout管理器。new ActionListener() 對文件的加密和解密設(shè)置事件監(jiān)聽器。byte bytK1、 byte bytK2 、byte bytK3 密鑰分三部分,采用字節(jié)數(shù)組
21、保存數(shù)據(jù)。開始2.2主程序流程彈出文件加密器對話框加密或解密輸入文件路徑和密鑰密鑰長度等于48?是否文件是否已加密解密 否加密生成解密文件生成機(jī)密文件結(jié)束 2.3各程序模塊之間的層次(調(diào)用)關(guān)系 2.3.1 模塊定義主函數(shù)模塊:生成加密器框體;獲取數(shù)據(jù)的輸入;調(diào)用加密或解密函數(shù)。加密模塊:判斷密鑰是否合法和文件是否已加密,啟動加密操作,顯示操作結(jié)果,并在與源文件同一文件夾下生成密文。加密操作模塊:用DES方法加密輸入的字節(jié)并返回。解密模塊:判斷密鑰是否合法,啟動解密操作,顯示操作結(jié)果,并在指定的文件路徑下生成明文。解密操作模塊:用DES方法解密輸入的字節(jié)并返回。轉(zhuǎn)換模塊:轉(zhuǎn)換模塊一:輸入密碼的
22、字符形式,返回字節(jié)數(shù)組形式。轉(zhuǎn)換模塊二:計(jì)算一個16進(jìn)制字符的10進(jìn)制值。文件選擇模塊:選擇需要加密或解密的文件。密碼生成模塊:隨機(jī)生成或用獲得的密鑰,用DES算法對密鑰進(jìn)行操作。 2.3.2層次(調(diào)用)關(guān)系文件加密器模塊文件選擇模塊密碼生成模塊加密模塊解密模塊轉(zhuǎn)換模塊一解密操作模塊加密操作模塊轉(zhuǎn)換模塊二 圖3 層次(調(diào)用)關(guān)系三、詳細(xì)設(shè)計(jì)3.1主函數(shù)模塊代碼實(shí)現(xiàn):public class FileEncrypter extends JFrame /FileEncrypter繼承JFrame類public static final int WIDTH = 550; /定義不可變的寬度值為550
23、public static final int HEIGHT = 200; /定義不可變的高度值為200public static void main(String args) /新建一個可見的框體FileEncrypter fe = new FileEncrypter(); fe.show(); FileEncrypter() this.setSize(WIDTH,HEIGHT); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); Toolkit tk = Toolkit.getDef
24、aultToolkit(); Dimension screenSize = tk.getScreenSize(); this.setLocation(screenSize.width - WIDTH)/2, (screenSize.height - HEIGHT)/2); this.setTitle("文件加密器(TirDES)"); /以上設(shè)置新建框體的標(biāo)題;框體的寬度和高度;關(guān)閉時(shí)的操作;框體大小不可變;框體在屏幕上顯示的位置。Container c = this.getContentPane(); /創(chuàng)建容器cc.setLayout( new FlowLayout()
25、; /c采用FlowLayout布局管理final FilePanel fp = new FilePanel("文件選擇"); c.add(fp); /添加名為“文件選擇”面板final KeyPanel pp = new KeyPanel("密碼"); c.add(pp); /添加名為“密碼”面板JButton jbE = new JButton("加密"); c.add(jbE); /添加加密按鈕jbE.addActionListener(new ActionListener() /設(shè)置加密監(jiān)聽器 public void acti
26、onPerformed(ActionEvent event) File file = new File(fp.getFileName(); if(file.exists()encrypt(file.getAbsoluteFile(),pp.getKey(); else JOptionPane.showMessageDialog( null,"請選擇文件!","提示",JOptionPane.OK_OPTION); ); JButton jbD = new JButton("解密"); c.add(jbD); /添加解密按鈕jbD.ad
27、dActionListener(new ActionListener() /設(shè)置解密監(jiān)聽器 public void actionPerformed(ActionEvent event) File file = new File(fp.getFileName(); if(file.exists()decrypt(file.getAbsoluteFile(),pp.getKey(); else JOptionPane.showMessageDialog(null,"請選擇文件!","提示",JOptionPane.OK_OPTION); ); 3.2加密模塊
28、 入口參數(shù):指定的文件和密鑰 出口值:文件已加密,提示“文件已加密!”加密成功,提示“加密成功!”并輸出加密后的密文密碼長度不等于48,提示“密碼長度必須等于48!”拋出異常。代碼實(shí)現(xiàn):private void encrypt(File fileIn,String sKey) try if(sKey.length() = 48) /密鑰長度等于48成立 byte bytK1 = getKeyByStr(sKey.substring(0,16); /密鑰前16位返回的字節(jié)數(shù)組保存到數(shù)組bytK1 byte bytK2 = getKeyByStr(sKey.substring(16,32);/密鑰
29、中16位返回的字節(jié)數(shù)組保存到數(shù)組bytK2 byte bytK3 = getKeyByStr(sKey.substring(32,48);/密鑰后16位返回的字節(jié)數(shù)組保存到數(shù)組bytK3 String strPath = fileIn.getPath(); if(strPath.substring(strPath.length()-5).toLowerCase().equals(".tdes") /判斷文件是否已加密,加密則輸出信息并返回 JOptionPane.showMessageDialog(this,"該文件已加密!","提示"
30、;,JOptionPane.OK_OPTION); return; else 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 =encryptByDES(encryptByDES(encryptByDES(bytIn,bytK1),bytK2),bytK3); /反復(fù)調(diào)用加密操作模塊 Stri
31、ng fileOut = fileIn.getPath() + ".tdes" /文件名后上“.tdes”作為密文的標(biāo)記。 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); /
32、 給出“加密成功”信息 else JOptionPane.showMessageDialog( this,"密碼長度必須等于48!","錯誤信息",JOptionPane.ERROR_MESSAGE); /給出“密碼長度必須等于48”信息 catch(Exception e) / 異常處理操作 e.printStackTrace(); 3.3加密操作模塊 入口參數(shù):字節(jié)數(shù)組 出口值:經(jīng)DES算法加密過的字節(jié)數(shù)組代碼實(shí)現(xiàn):private byte encryptByDES(byte bytP,byte bytKey) throws Exception DE
33、SKeySpec desKS = new DESKeySpec(bytKey); /新建一個DESKeySpec對象,bytKey位密鑰 SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); /用秘密密鑰工廠生成DES密鑰規(guī)范。 SecretKey sk = skf.generateSecret(desKS); /根據(jù)密鑰規(guī)范生成密鑰 Cipher cip = Cipher.getInstance("DES"); /生成一個DES轉(zhuǎn)換的Cipher對象 cip.init(Cipher.EN
34、CRYPT_MODE,sk); /用密鑰和加密模式初始化cip return cip.doFinal(bytP); 3.4解密模塊 入口參數(shù):指定文件路徑和密鑰 出口值:不是密文,提示“不是合法的加密文件!” 解密成功,提示“解密成功”并按指定路徑給出解密明文 密碼長度不等于48,提示“密碼長度必須等于48!” 密碼錯誤,異常處理,提示“解密失敗,請核對密碼!”代碼實(shí)現(xiàn):private void decrypt(File fileIn,String sKey) try if(sKey.length() = 48) /密鑰長度等于48成立 String strPath = fileIn.getP
35、ath(); 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 = new JFile
36、Chooser(); chooser.setCurrentDirectory(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
37、 = getKeyByStr(sKey.substring(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); /反復(fù)調(diào)用加密操作模塊 File
38、 fileOut = chooser.getSelectedFile(); 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
39、JOptionPane.showMessageDialog(this,"密碼長度必須等于48!","錯誤信息",JOptionPane.ERROR_MESSAGE); catch(Exception e) JOptionPane.showMessageDialog(this,"解密失敗,請核對密碼!","提示",JOptionPane.OK_OPTION); /異常處理 3.5 解密操作模塊 入口參數(shù):字節(jié)數(shù)組 出口值:經(jīng)DES算法解密過的字節(jié)數(shù)組代碼實(shí)現(xiàn):private byte decryptByDES(byt
40、e 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); /用密鑰和解密模式初始話cip return c
41、ip.doFinal(bytE); 3.6轉(zhuǎn)換模塊 3.6.1 轉(zhuǎn)換模塊一 入口參數(shù):密碼的字符形式 出口值:字節(jié)數(shù)組形式 代碼實(shí)現(xiàn): private byte getKeyByStr(String str) byte bRet = new bytestr.length()/2; /新建字節(jié)數(shù)組,長度為字符串的一半 for(int i=0;i< str.length()/2;i+) Integer itg =new Integer(16*getChrInt(str.charAt(2*i)+ getChrInt(str.charAt(2*i+1); /從0位開始,偶數(shù)位轉(zhuǎn)換為10進(jìn)制乘16
42、加上奇數(shù)為轉(zhuǎn)換為10進(jìn)制所得的值復(fù)給itg bReti = itg.byteValue(); return bRet; 3.6.2 轉(zhuǎn)換模塊二 入口參數(shù):單個字符 出口值: 字符從16進(jìn)制轉(zhuǎn)換成的10進(jìn)制數(shù)代碼實(shí)現(xiàn): private int getChrInt(char chr) int iRet=0; /初值為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&quo
43、t;.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)
44、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; return iRet; 3.7 文件選擇模塊 出口值:被選文件的路徑代碼實(shí)現(xiàn):class FilePanel extends JPanel FilePane
45、l(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);/在面板加入文本框,“瀏覽”按鈕,設(shè)置按鈕監(jiān)聽
46、器 public String getFileName() /容器中第一個組件為文本框 JTextField jtf = (JTextField)this.getComponent(1); return jtf.getText(); private class clickAction implements ActionListener /由類實(shí)現(xiàn)接口 clickAction(Component c) cmpt = c; public void actionPerformed(ActionEvent event) /觸發(fā)執(zhí)行操作 JFileChooser chooser = new JFileC
47、hooser(); chooser.setCurrentDirectory(new File("."); int ret = chooser.showOpenDialog(cmpt); if(ret=JFileChooser.APPROVE_OPTION) JPanel jp = (JPanel)cmpt; JTextField jtf = (JTextField)jp.getComponent(1); jtf.setText(chooser.getSelectedFile().getPath(); /彈出文件選擇框,選擇文件,返回當(dāng)前文件的路徑 private Compo
48、nent cmpt; 3.8密碼生成模塊class KeyPanel extends JPanel KeyPanel(String str) JLabel label = new JLabel(str); JTextField fileText = new JTextField(35); JButton chooseButton = new JButton("隨機(jī)產(chǎn)生"); this.add(label); this.add(fileText); this.add(chooseButton); clickAction ca = new clickAction(this);
49、chooseButton.addActionListener(ca); /返回生成的密碼(48個字符長度) public String getKey() JTextField jtf = (JTextField)this.getComponent(1); return jtf.getText(); private class clickAction implements ActionListener clickAction(Component c) cmpt = c; public void actionPerformed(ActionEvent event) try KeyGenerator kg = KeyGenerator.getInstance("DES"); /按DES密鑰規(guī)范生成密鑰生成器 kg.init(56); /初始化,密鑰長度為56 Key ke = kg.generateKey(); byte bytK1 = ke.getEncoded(); ke = kg.generateKey(); byte bytK2 = ke.getEncoded(); ke = kg.generateKey(); byte bytK3 = ke.getEncoded(); JPanel jp = (JPanel)cmpt; JTe
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 租地合同附屬協(xié)議
- 山東省濟(jì)寧市任城區(qū)2024-2025學(xué)年七年級上學(xué)期期末生物學(xué)試題(含答案)
- 湖南省郴州市2024-2025學(xué)年高一上學(xué)期期末考試生物學(xué)試題(含答案)
- 離婚協(xié)議書條款補(bǔ)充協(xié)議
- 初中數(shù)學(xué)競賽指導(dǎo)策略訓(xùn)練課教案
- 水務(wù)工程設(shè)計(jì)與施工合同管理協(xié)議
- 非謂語動詞的用法與解析:高中英語語法
- (一模)2025屆安徽省“江南十?!备呷?lián)考地理試卷(含官方答案)
- 電氣物資知識培訓(xùn)課件
- 水療產(chǎn)品知識培訓(xùn)課件
- 物業(yè)管理費(fèi)測算及物業(yè)增收途徑課件
- 歡樂的那達(dá)慕混聲合唱簡譜
- 【初中語文】羈旅思鄉(xiāng)類(10首)+中考語文必考古詩賞析(84首)(意象大全)
- JGJ107-2010鋼筋機(jī)械連接技術(shù)規(guī)程課件
- 季節(jié)性疾病防治知識講座
- PPR給水管技術(shù)交底樣本
- 中國李氏家譜模板
- 分布式光伏發(fā)電并網(wǎng)與運(yùn)維管理
- 《計(jì)算機(jī)應(yīng)用基礎(chǔ) Win10+Office 2016》教案 模塊一 計(jì)算機(jī)基礎(chǔ)知識(二)
- 第1講 溝通概論1
- 二手車交易行業(yè)行業(yè)網(wǎng)絡(luò)安全與威脅防護(hù)
評論
0/150
提交評論