java課程設(shè)計---加密和解密_第1頁
已閱讀1頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  課程設(shè)計(論文)任務(wù)書</p><p>  學(xué) 院___________________ 專業(yè)_______________________ 班級___________   </p><p>  一、課程設(shè)計(論文)題目   加密與解密   </p><p>  二、課程設(shè)計(論文)工作自 年

2、 月 日起至 年 月 日止。</p><p>  三、課程設(shè)計(論文) 地點: </p><p>  四、課程設(shè)計(論文)內(nèi)容要求:</p><p>  1.本課程設(shè)計的目的</p><p>  (1)使學(xué)生鞏固和提高Java編程技術(shù)</p&g

3、t;<p> ?。?)培養(yǎng)學(xué)生掌握程序設(shè)計的基本思路和方法; </p><p>  (3)加強學(xué)生研發(fā)、調(diào)試程序的能力;</p><p> ?。?)培養(yǎng)學(xué)生分析、解決問題的能力;</p><p> ?。?)提高學(xué)生的科技論文寫作能力。</p><p>  2.課程設(shè)計的任務(wù)及要求</p><p>  1)

4、任務(wù):設(shè)計加密與解密軟件對文件進行加密與解密。</p><p>  2)創(chuàng)新要求:在基本要求達到后,可進行創(chuàng)新設(shè)計,增加功能。 </p><p>  3)課程設(shè)計論文編寫要求</p><p> ?。?)課程設(shè)計任務(wù)及要求</p><p><b> ?。?)需求分析</b></p><p> ?。?

5、)設(shè)計思路--工作原理、功能規(guī)劃</p><p> ?。?)詳細(xì)設(shè)計---數(shù)據(jù)分析、算法思路、類設(shè)計、功能實現(xiàn)(含程序流程圖、主要代碼及注釋)、界面等。</p><p> ?。?)運行調(diào)試與分析討論---給出運行屏幕截圖,分析運行結(jié)果,有何改進想法等。</p><p> ?。?)設(shè)計體會與小結(jié)---設(shè)計遇到的問題及解決辦法,通過設(shè)計學(xué)到了哪些新知識,鞏固了哪些知識,

6、有哪些提高。</p><p> ?。?)參考文獻(必須按標(biāo)準(zhǔn)格式列出,可參考教材后面的參考文獻格式)</p><p>  (7) 報告按規(guī)定排版打印,要求裝訂平整,否則要求返工;</p><p>  (8) 課設(shè)報告的裝訂順序如下:封面---任務(wù)書---中文摘要---目錄----正文---附錄(代碼及相關(guān)圖片)</p><p>  (9)嚴(yán)禁

7、抄襲,如有發(fā)現(xiàn),按不及格處理。</p><p><b>  4)參考文獻:</b></p><p> ?。?)《Java語言程序設(shè)計教程》邱桃榮 機械工業(yè)出版社</p><p>  (2)《Java程序設(shè)計試驗指導(dǎo)》陳軼 姚曉昆 清華大學(xué)出版社</p><p>  前 言- 4 -</p><

8、p>  一、題目分析- 5 -</p><p>  1.1課程設(shè)計的要求和內(nèi)容(包括原始數(shù)據(jù)、技術(shù)要求、工作要求)- 5 -</p><p>  1.2相關(guān)知識介紹- 5 -</p><p>  二、概要設(shè)計- 9 -</p><p>  2.1抽象數(shù)據(jù)類型的定義- 9 -</p><p>  2.2主

9、程序流程- 10 -</p><p>  2.3各程序模塊之間的層次(調(diào)用)關(guān)系- 10 -</p><p>  三、詳細(xì)設(shè)計- 11 -</p><p>  3.1主函數(shù)模塊- 11 -</p><p>  3.2加密模塊- 12 -</p><p>  3.3加密操作模塊- 14 -</p>

10、<p>  3.4解密模塊- 14 -</p><p>  3.5 解密操作模塊- 15 -</p><p>  3.6轉(zhuǎn)換模塊- 16 -</p><p>  3.7 文件選擇模塊- 17 -</p><p>  3.8密碼生成模塊- 18 -</p><p>  四、調(diào)試分析- 19 -&

11、lt;/p><p>  4.1調(diào)試過程中遇到的問題- 19 -</p><p>  4.2對設(shè)計與實現(xiàn)的回顧討論和分析- 20 -</p><p>  4.3算法的時空分析- 20 -</p><p>  4.4 經(jīng)驗和體會- 21 -</p><p>  五、測試結(jié)果- 21 -</p><

12、p>  5.1 加密- 21 -</p><p>  5.2 解密- 23 -</p><p>  六、主要參考資料- 24 -</p><p>  七、附錄- 24 -</p><p><b>  摘 要</b></p><p>  隨著網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,人們的個人信息、網(wǎng)絡(luò)

13、間的文件傳遞、電子商務(wù)等方面都需要大力的保護,文件加密技術(shù)也就隨之產(chǎn)生。文件的加密主要是由加密算法實現(xiàn),加密算法有多種,常見的有RSA、DES、MD5等。本程序設(shè)計對文件的加密使用的是DES加密算法。</p><p>  Java語言具有簡單、安全、可移植、面向?qū)ο?、健壯、多線程、體系結(jié)構(gòu)中立、解釋執(zhí)行、高性能、分布式和動態(tài)等主要特點。利用Java語言中秘密密鑰工廠對DES算法的支持,使程序?qū)崿F(xiàn)文件加密、解密兩大

14、功能更簡單。</p><p><b>  關(guān)鍵詞:</b></p><p>  JAVA ; DES; 加密; 解密;</p><p><b>  前 言</b></p><p>  DES ( data encryption Standard) 是一種世界標(biāo)準(zhǔn)的加密形式, 已經(jīng)15 年歷

15、史了,雖然有些老, 可還算是比較可靠的算法。在七十的初期, 隨著計算機之間的通信發(fā)展, 需要有一種標(biāo)準(zhǔn)密碼算法為了限制不同算法的激增使它們之間不能互相對話。為解決這個問題, 美國國家安全局(N.S.A ) 進行招標(biāo)。 I.B.M 公司開發(fā)了一種算法, 稱為:Lucifer。 經(jīng)過幾年的研討和修改, 這種算法, 成為了今天的D.E.S,1976 年11月23 日, 終于被美國國家安全局采用。 D.E.S 是分塊加密的,將明文分割成

16、 64 BITS 的塊, 然后它們一個個接起來 。它使用56位密鑰對64位的數(shù)據(jù)塊進行加密,并對64bits的數(shù)據(jù)塊進行16輪編碼。與每輪編碼時,一個48bits的“每輪”密鑰值由56bits的完整密鑰得出來。DES用軟件進行解碼需要用很長時間,而用硬件解碼速度非???,1977年,人們估計要耗資兩千萬美元才能建成一個專門計算機用于DES的解密,而且需要12個小時的破解才能得到結(jié)果。所以,當(dāng)時DES被認(rèn)為是一種十分強壯的加密方法。但今天,

17、 只需 二十萬</p><p>  DES的唯一密碼學(xué)缺點,就是密鑰長度相對比較短,人們并沒有放棄使用DES,而是想出了一個解決其長度問題的方法,即采用三重DES。加密成為三步, 而不是一步,每一步的密鑰都不一樣, 這樣爆破就比較復(fù)雜了,這樣要找三個密鑰, 而不是一個, 每個密鑰有56 BITS, 那樣我們就有56 乘以三, 等于168 Bits。</p><p>  本程序設(shè)計所采用的就

18、是DES的變種——三重DES算法。同時利用Java的GUI編程,生成文本對話框,對文件的路徑進行選擇、提供密鑰框、加密和解密按鈕。</p><p><b>  一、題目分析</b></p><p>  1.1課程設(shè)計的要求和內(nèi)容(包括原始數(shù)據(jù)、技術(shù)要求、工作要求)</p><p><b>  基本要求:</b></p

19、><p>  利用某種加密算法對指定的文本文件進行加密(應(yīng)判斷其是否已經(jīng)加密,若已加密則結(jié)束該步驟,否則提示輸入加密口令,對文件進行加密);</p><p>  加密解密方法:可使用RSA,DES,MD5等之一加密算法。</p><p>  3. 還應(yīng)該提供解密功能。</p><p><b>  1.2相關(guān)知識介紹</b>&

20、lt;/p><p>  1.2.1 DES算法描述</p><p>  DES是一種分組加密算法,他以64位為分組對數(shù)據(jù)加密。64位一組的明文從算法的一端 輸入,64位的密文從另一端輸出。DES是一個對稱算法:加密和解密用的是同一個算法(除 密鑰編排不同以外)。   密鑰的長度為56位(密鑰通常表示為64位的數(shù),但每個第8位都用作奇偶檢驗,可以忽 略)。密鑰可以是任意的56位數(shù),且可以在任意

21、的時候改變。   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進行加密,生成Data的密碼 形式(64位)作為DES的輸出結(jié)果;若Mode為解密,則用Key對密碼形式的數(shù)據(jù)Data解密,還 原為D

22、ata的明碼形式(64位)作為DES的輸出結(jié)果。   在通信網(wǎng)絡(luò)的兩端,雙方約定了一致的Key,在通信的源點用Key對核心數(shù)據(jù)進行DES加密 ,然后以密碼形式通過公共通信網(wǎng)(如電話網(wǎng))傳輸?shù)酵ㄐ啪W(wǎng)絡(luò)的終點,數(shù)據(jù)達到目的 地后,用同樣的</p><p>  1.2.2 DES算法詳述</p><p>  DES算法把64位的明文輸入塊變?yōu)?4位的密文輸出塊,他所使用的密鑰也是64位,DES

23、對64 位的明文分組進行操作。通過一個初始置換,將明文分組分成左半部分和右半部分,各32位 長。然后進行16輪相同的運算,這些相同的運算被稱為函數(shù)f,在運算過程中數(shù)據(jù)和密 鑰相結(jié)合。經(jīng)過16輪運算后左、右部分在一起經(jīng)過一個置換(初始置換的逆置換),這樣算 法就完成了。 </p><p>  (1)初始置換   其功能是把輸入的64位數(shù)據(jù)塊按位重新組合,并把輸出分為L0,R0兩部分,每部分各長32位,其置換規(guī)則如

24、表1所示。</p><p><b>  表1</b></p><p>  58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4</p><p>  62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8</p><p>  57 49 41 33

25、25 17 9 1 59 51 43 35 27 19 11 3</p><p>  61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7</p><p>  即將輸入的第58位換到第1位,第50位換到第2位,…,依次類推,最后一位是原來的第7位,L0,R0則是換位輸出后的兩部分,L0是輸出的左32位,R0是右32位。例:設(shè)置換前 的輸入值為D1D2

26、D3…D64,則經(jīng)過初始置換后的結(jié)果為:L0=D58D50…D8;R0=D57D49…7。 (2)逆置換   經(jīng)過16次迭代運算后,得到L16,R16,將此作為輸入進行逆置換,即得到密文輸出。 逆置換正好是初始置換的逆運算。例如,第1位經(jīng)過初始置換后,處于第40位,而通過逆置換,又將第40位換回到第1位,其逆置換的規(guī)則如表2所示。</p><p><b>  表2</b></p&g

27、t;<p>  40 8 48 16 56 24 64 32 39 7 47 15 55 23 63 31</p><p>  38 6 46 14 54 22 62 30 37 5 45 13 53 21 61 29</p><p>  36 4 44 12 52 20 60 28 35 3 43 11 51 19 59 27</p><p>  3

28、4 2 42 10 50 18 58 26 33 1 41 9 49 17 57 25</p><p> ?。?)函數(shù)f(Ri,Ki)的計算 其算法描述如圖1所示。</p><p><b>  圖 1</b></p><p>  在圖1中,“擴展置換”是將32位放大成48位,“P盒置換”是32位到32位換位,其換位 規(guī)則分別如表3、表4所示。

29、</p><p><b>  表3 擴展置換表</b></p><p>  32 1 2 3 4 5 4 5 6 7 8 9</p><p>  8 9 10 11 12 13 12 13 14 15 16 17</p><p>  16 17

30、 18 19 20 21 20 21 22 23 24 25</p><p>  24 25 26 27 28 29 28 29 30 31 32 1</p><p><b>  表4 P盒置換表</b></p><p>  16 7 20 21 29 12 28 17 1 15

31、23 26 5 18 31 10</p><p>  2 8 24 14 32 27 3 9 19 13 30 6 22 21 4 25</p><p>  在f(Ri,Ki)算法描述圖中,S1,S2...S8為選擇函數(shù),其功能是把6bit數(shù)據(jù)變?yōu)?bit數(shù)據(jù)。下面給出選擇函數(shù)Si(i=1,2......8)的功能表: 選擇函數(shù)Si S1:

32、    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,

33、    3,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</p><p>  在此以S1為例說明其功

34、能,我們可以看到:在S1中,共有4行數(shù)據(jù),命名為0,1、2、3行;每行有16列,命名為0、1、2、3,......,14、15列。    現(xiàn)設(shè)輸入為: D=D1D2D3D4D5D6 令:列=D2D3D4D5 行=D1D6 然后在S1表中查得對應(yīng)的數(shù),以4位二進制表示,此即為選擇函數(shù)S1的輸出。</p><p>  (4)子密鑰Ki(48 b)的生成算法   開始,由于不考慮每個字節(jié)的第8位,DES的密鑰

35、從64位變?yōu)?8位,如表5所示,首先56位 密鑰被分成兩個部分,每部分28位,然后根據(jù)輪數(shù),兩部分分別循環(huán)左移l或2位。</p><p><b>  表5 密鑰置換</b></p><p>  57 49 41 33 25 17 9 1 58 50 42 34 26 18</p><p>  10 2 59 51 43 35 27 19

36、11 3 60 52 44 36</p><p>  63 55 47 39 31 23 15 7 62 54 46 38 30 22</p><p>  14 6 61 53 45 37 29 21 13 5 28 20 12 4</p><p>  DES算法規(guī)定,其中第8,16,…,64位是奇偶校驗位,不參與DES運算。故Key實際可用 位數(shù)只有56位

37、。即:經(jīng)過密鑰置換表的變換后,Key的位數(shù)由64位變成了56位,此56位分為C 0,D0兩部分,各28位,然后分別進行第一次循環(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ī)則進行。</p><p><b>  表6 循環(huán)左移位

38、數(shù)</b></p><p>  輪 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16</p><p>  位數(shù) 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1</p><p>  以上介紹了DES算法的加密過程。DES算法的解密過程是一樣

39、的,區(qū)別僅在于第一次迭代時用子密鑰K15,第二次是K14,…,最后一次用K0,算法本身并沒有任何變化。</p><p><b>  二、概要設(shè)計</b></p><p>  2.1抽象數(shù)據(jù)類型的定義</p><p>  2.1.1 程序所需要引入的包:</p><p>  import java.awt.*;

40、 //包含用于創(chuàng)建用戶界面和繪制圖形圖像的所有類。</p><p>  import java.awt.event.*; //提供處理由 AWT 組件所激發(fā)的各類事件的接口和類。</p><p>  import javax.swing.*; //提供一組“輕量級”(全部是 Java 語言)組件,盡量讓這些組件在所有平臺上的工作方式都相同。</p&g

41、t;<p>  import java.io.*; //通過數(shù)據(jù)流、序列化和文件系統(tǒng)提供系統(tǒng)輸入和輸出。</p><p>  import java.security.*; //為安全框架提供類和接口。</p><p>  import javax.crypto.*; //為 cryptographic(加密)操作提供類和接口。&l

42、t;/p><p>  import javax.crypto.spec.*; // 為密鑰規(guī)范和算法參數(shù)規(guī)范提供類和接口。</p><p>  2.1.2 其他定義:</p><p>  new FlowLayout() 對文件加密器對話框采用FlowLayout管理器。</p><p>  new ActionListener()

43、 對文件的加密和解密設(shè)置事件監(jiān)聽器。</p><p>  byte[] bytK1、 byte[] bytK2 、byte[] bytK3 密鑰分三部分,采用字節(jié)數(shù)組保存數(shù)據(jù)。</p><p><b>  2.2主程序流程</b></p><p><b>  是否</b></p><p><

44、;b>  否</b></p><p><b>  圖2 主程序流程圖</b></p><p>  2.3各程序模塊之間的層次(調(diào)用)關(guān)系</p><p>  2.3.1 模塊定義</p><p><b>  主函數(shù)模塊:</b></p><p>  生成加密

45、器框體;獲取數(shù)據(jù)的輸入;調(diào)用加密或解密函數(shù)。</p><p><b>  加密模塊:</b></p><p>  判斷密鑰是否合法和文件是否已加密,啟動加密操作,顯示操作結(jié)果,并在與源文件同一文件夾下生成密文。</p><p><b>  加密操作模塊:</b></p><p>  用DES方法加密

46、輸入的字節(jié)并返回。</p><p><b>  解密模塊:</b></p><p>  判斷密鑰是否合法,啟動解密操作,顯示操作結(jié)果,并在指定的文件路徑下生成明文。</p><p><b>  解密操作模塊:</b></p><p>  用DES方法解密輸入的字節(jié)并返回。</p>&l

47、t;p><b>  轉(zhuǎn)換模塊:</b></p><p>  轉(zhuǎn)換模塊一:輸入密碼的字符形式,返回字節(jié)數(shù)組形式。</p><p>  轉(zhuǎn)換模塊二:計算一個16進制字符的10進制值。</p><p><b>  文件選擇模塊:</b></p><p>  選擇需要加密或解密的文件。</p&g

48、t;<p><b>  密碼生成模塊:</b></p><p>  隨機生成或用獲得的密鑰,用DES算法對密鑰進行操作。</p><p>  2.3.2層次(調(diào)用)關(guān)系</p><p>  圖3 層次(調(diào)用)關(guān)系</p><p><b>  三、詳細(xì)設(shè)計</b></p>

49、<p><b>  3.1主函數(shù)模塊</b></p><p><b>  代碼實現(xiàn):</b></p><p>  public class FileEncrypter extends JFrame{ //FileEncrypter繼承JFrame類</p><p>  public static fin

50、al int WIDTH = 550; //定義不可變的寬度值為550</p><p>  public static final int HEIGHT = 200; //定義不可變的高度值為200</p><p>  public static void main(String args[]) { //新建一個可見的框體</p><p&

51、gt;  FileEncrypter fe = new FileEncrypter(); </p><p>  fe.show(); </p><p><b>  } </b></p><p>  FileEncrypter(){ </p><p>  this.setSize(WIDTH,HEIGHT); </

52、p><p>  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); </p><p>  this.setResizable(false); </p><p>  Toolkit tk = Toolkit.getDefaultToolkit(); </p><p>  Dimension sc

53、reenSize = tk.getScreenSize(); </p><p>  this.setLocation((screenSize.width - WIDTH)/2, (screenSize.height - HEIGHT)/2); </p><p>  this.setTitle("文件加密器(TirDES)"); //以上設(shè)置新建框體的標(biāo)題;框體的寬度和高

54、度;關(guān)閉時的操作;框體大小不可變;框體在屏幕上顯示的位置。</p><p>  Container c = this.getContentPane(); //創(chuàng)建容器c</p><p>  c.setLayout( new FlowLayout()); //c采用FlowLayout布局管理</p><p>  final FilePanel fp = n

55、ew FilePanel("文件選擇"); </p><p>  c.add(fp); //添加名為“文件選擇”面板</p><p>  final KeyPanel pp = new KeyPanel("密碼"); </p><p>  c.add(pp); //添加名為“密碼”面板</p><

56、;p>  JButton jbE = new JButton("加密"); </p><p>  c.add(jbE); //添加加密按鈕</p><p>  jbE.addActionListener(new ActionListener(){ //設(shè)置加密監(jiān)聽器</p><p>  public void actionPerform

57、ed(ActionEvent event){ </p><p>  File file = new File(fp.getFileName()); </p><p>  if(file.exists())encrypt(file.getAbsoluteFile(),pp.getKey()); </p><p>  else JOptionPane.showMessa

58、geDialog( null,"請選擇文件!","提示",JOptionPane.OK_OPTION);</p><p><b>  } </b></p><p><b>  }); </b></p><p>  JButton jbD = new JButton("解密&

59、quot;); </p><p>  c.add(jbD); //添加解密按鈕</p><p>  jbD.addActionListener(new ActionListener(){ //設(shè)置解密監(jiān)聽器</p><p>  public void actionPerformed(ActionEvent event){ </p><p&g

60、t;  File file = new File(fp.getFileName()); </p><p>  if(file.exists())decrypt(file.getAbsoluteFile(),pp.getKey()); </p><p>  else JOptionPane.showMessageDialog(null,"請選擇文件!","提示&

61、quot;,JOptionPane.OK_OPTION); </p><p><b>  } </b></p><p><b>  }); </b></p><p><b>  }</b></p><p><b>  3.2加密模塊</b></p&g

62、t;<p>  入口參數(shù):指定的文件和密鑰</p><p>  出口值:文件已加密,提示“文件已加密!”</p><p>  加密成功,提示“加密成功!”并輸出加密后的密文</p><p>  密碼長度不等于48,提示“密碼長度必須等于48!”</p><p><b>  拋出異常。</b></p&g

63、t;<p><b>  代碼實現(xiàn):</b></p><p>  private void encrypt(File fileIn,String sKey){ </p><p><b>  try{ </b></p><p>  if(sKey.length() == 48){ //密鑰長度等于48成立<

64、/p><p>  byte[] bytK1 = getKeyByStr(sKey.substring(0,16)); //密鑰前16位返回的字節(jié)數(shù)組保存到數(shù)組bytK1</p><p>  byte[] bytK2 = getKeyByStr(sKey.substring(16,32));//密鑰中16位返回的字節(jié)數(shù)組保存到數(shù)組bytK2</p><p>  byte[

65、] bytK3 = getKeyByStr(sKey.substring(32,48));//密鑰后16位返回的字節(jié)數(shù)組保存到數(shù)組bytK3</p><p>  String strPath = fileIn.getPath();</p><p>  if(strPath.substring(strPath.length()-5).toLowerCase().equals(".t

66、des")){</p><p>  //判斷文件是否已加密,加密則輸出信息并返回</p><p>  JOptionPane.showMessageDialog(this,"該文件已加密!","提示",JOptionPane.OK_OPTION);</p><p><b>  return;</b&g

67、t;</p><p><b>  } </b></p><p><b>  else{</b></p><p>  FileInputStream fis = new FileInputStream(fileIn); </p><p>  byte[] bytIn = new byte[(int)f

68、ileIn.length()];</p><p>  for(int i = 0;i< fileIn.length();i++){ </p><p>  bytIn[i] = (byte)fis.read(); </p><p><b>  } //加密</b></p><p>  byte[] bytOut =&

69、lt;/p><p>  encryptByDES(encryptByDES(encryptByDES(bytIn,bytK1),bytK2),bytK3);</p><p>  //反復(fù)調(diào)用加密操作模塊 </p><p>  String fileOut = fileIn.getPath() + ".tdes"; //文件名后上“.tdes”作為密文

70、的標(biāo)記。</p><p>  FileOutputStream fos = new FileOutputStream(fileOut);</p><p>  for(int i = 0;i< bytOut.length;i++){ </p><p>  fos.write((int)bytOut[i]);</p><p><b&g

71、t;  } </b></p><p>  fos.close(); //輸出密文</p><p>  JOptionPane.showMessageDialog(this,"加密成功!","提示",JOptionPane.OK_OPTION); // 給出“加密成功”信息</p><p><b>  }&

72、lt;/b></p><p><b>  }</b></p><p>  else JOptionPane.showMessageDialog( this,"密碼長度必須等于48!","錯誤信息",JOptionPane.ERROR_MESSAGE); //給出“密碼長度必須等于48”信息</p><p

73、><b>  }</b></p><p>  catch(Exception e){ // 異常處理操作</p><p>  e.printStackTrace(); </p><p><b>  } </b></p><p><b>  }</b></p>

74、<p><b>  3.3加密操作模塊</b></p><p><b>  入口參數(shù):字節(jié)數(shù)組</b></p><p>  出口值:經(jīng)DES算法加密過的字節(jié)數(shù)組</p><p><b>  代碼實現(xiàn):</b></p><p>  private byte[] enc

75、ryptByDES(byte[] bytP,byte[] bytKey) throws Exception{ </p><p>  DESKeySpec desKS = new DESKeySpec(bytKey); //新建一個DESKeySpec對象,bytKey位密鑰</p><p>  SecretKeyFactory skf = SecretKeyFactory.getInsta

76、nce("DES"); //用秘密密鑰工廠生成DES密鑰規(guī)范。</p><p>  SecretKey sk = skf.generateSecret(desKS); //根據(jù)密鑰規(guī)范生成密鑰</p><p>  Cipher cip = Cipher.getInstance("DES"); //生成一個DES轉(zhuǎn)換的Cipher對象</p>

77、;<p>  cip.init(Cipher.ENCRYPT_MODE,sk); //用密鑰和加密模式初始化cip</p><p>  return cip.doFinal(bytP); </p><p><b>  }</b></p><p><b>  3.4解密模塊</b></p><

78、;p>  入口參數(shù):指定文件路徑和密鑰</p><p>  出口值:不是密文,提示“不是合法的加密文件!”</p><p>  解密成功,提示“解密成功”并按指定路徑給出解密明文</p><p>  密碼長度不等于48,提示“密碼長度必須等于48!”</p><p>  密碼錯誤,異常處理,提示“解密失敗,請核對密碼!”</p&g

79、t;<p><b>  代碼實現(xiàn):</b></p><p>  private void decrypt(File fileIn,String sKey){ </p><p><b>  try{ </b></p><p>  if(sKey.length() == 48){ //密鑰長度等于48成立<

80、/p><p>  String strPath = fileIn.getPath(); </p><p>  if(strPath.substring(strPath.length()-5).toLowerCase().equals(".tdes")) </p><p>  strPath = strPath.substring(0,strPath.

81、length()-5); </p><p>  //判斷指定文件是否是密文,不是則返回</p><p><b>  else{ </b></p><p>  JOptionPane.showMessageDialog(this,"不是合法的加密文件!","提示",JOptionPane.OK_OPTION

82、); </p><p><b>  return; </b></p><p><b>  } </b></p><p>  JFileChooser chooser = new JFileChooser(); </p><p>  chooser.setCurrentDirectory(new Fi

83、le(".")); </p><p>  chooser.setSelectedFile(new File(strPath)); //用戶指定要保存的文件</p><p>  int ret = chooser.showSaveDialog(this); </p><p>  if(ret==JFileChooser.APPROVE_OPTION

84、){ </p><p>  byte[] bytK1 = getKeyByStr(sKey.substring(0,16));</p><p>  byte[] bytK2 = getKeyByStr(sKey.substring(16,32)); </p><p>  byte[] bytK3 = getKeyByStr(sKey.substring(32,48)

85、); </p><p>  FileInputStream fis = new FileInputStream(fileIn); </p><p>  byte[] bytIn = new byte[(int)fileIn.length()]; </p><p>  for(int i = 0;i< fileIn.length();i++){ </p&g

86、t;<p>  bytIn[i] = (byte)fis.read(); } //解密</p><p>  byte[] bytOut =</p><p>  decryptByDES(decryptByDES(decryptByDES(bytIn,bytK3),bytK2),bytK1); </p><p>  //反復(fù)調(diào)用加密操作模塊</p&

87、gt;<p>  File fileOut = chooser.getSelectedFile(); </p><p>  fileOut.createNewFile(); </p><p>  FileOutputStream fos = new FileOutputStream(fileOut); </p><p>  for(int i = 0;

88、i< bytOut.length;i++){ </p><p>  fos.write((int)bytOut[i]); </p><p><b>  } </b></p><p>  fos.close(); //按指定路徑輸出明文</p><p>  JOptionPane.showMessageDialog(

89、this,"解密成功!","提示",JOptionPane.OK_OPTION); </p><p><b>  }</b></p><p><b>  }</b></p><p>  else JOptionPane.showMessageDialog(this,"密碼長

90、度必須等于48!","錯誤信息",JOptionPane.ERROR_MESSAGE);</p><p><b>  }</b></p><p>  catch(Exception e){</p><p>  JOptionPane.showMessageDialog(this,"解密失敗,請核對密碼!&

91、quot;,"提示",JOptionPane.OK_OPTION); //異常處理</p><p><b>  }</b></p><p><b>  }</b></p><p>  3.5 解密操作模塊</p><p><b>  入口參數(shù):字節(jié)數(shù)組</b>

92、;</p><p>  出口值:經(jīng)DES算法解密過的字節(jié)數(shù)組</p><p><b>  代碼實現(xiàn):</b></p><p>  private byte[] decryptByDES(byte[] bytE,byte[] bytKey) throws Exception{ </p><p>  DESKeySpec d

93、esKS = new DESKeySpec(bytKey); </p><p>  SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); </p><p>  SecretKey sk = skf.generateSecret(desKS); </p><p>  Cipher c

94、ip = Cipher.getInstance("DES"); </p><p>  cip.init(Cipher.DECRYPT_MODE,sk); //用密鑰和解密模式初始話cip</p><p>  return cip.doFinal(bytE); </p><p><b>  } </b></p>

95、<p><b>  3.6轉(zhuǎn)換模塊</b></p><p>  3.6.1 轉(zhuǎn)換模塊一</p><p>  入口參數(shù):密碼的字符形式</p><p>  出口值:字節(jié)數(shù)組形式</p><p><b>  代碼實現(xiàn):</b></p><p>  private by

96、te[] getKeyByStr(String str){ </p><p>  byte[] bRet = new byte[str.length()/2]; //新建字節(jié)數(shù)組,長度為字符串的一半</p><p>  for(int i=0;i< str.length()/2;i++){ </p><p>  Integer itg =new Integer

97、(16*getChrInt(str.charAt(2*i))+ getChrInt(str.charAt(2*i+1))); //從0位開始,偶數(shù)位轉(zhuǎn)換為10進制乘16加上奇數(shù)為轉(zhuǎn)換為10進制所得的值復(fù)給itg</p><p>  bRet[i] = itg.byteValue(); </p><p><b>  } </b></p><p>

98、  return bRet; </p><p><b>  }</b></p><p>  3.6.2 轉(zhuǎn)換模塊二</p><p><b>  入口參數(shù):單個字符</b></p><p>  出口值: 字符從16進制轉(zhuǎn)換成的10進制數(shù)</p><p><b>  

99、代碼實現(xiàn):</b></p><p>  private int getChrInt(char chr){ </p><p>  int iRet=0; //初值為0</p><p>  if(chr=="0".charAt(0)) iRet = 0; </p><p>  if(chr=="1&quo

100、t;.charAt(0)) iRet = 1; </p><p>  if(chr=="2".charAt(0)) iRet = 2; </p><p>  if(chr=="3".charAt(0)) iRet = 3; </p><p>  if(chr=="4".charAt(0)) iRet = 4

101、; </p><p>  if(chr=="5".charAt(0)) iRet = 5; </p><p>  if(chr=="6".charAt(0)) iRet = 6; </p><p>  if(chr=="7".charAt(0)) iRet = 7; </p><p>

102、;  if(chr=="8".charAt(0)) iRet = 8; </p><p>  if(chr=="9".charAt(0)) iRet = 9; </p><p>  if(chr=="A".charAt(0)) iRet = 10; </p><p>  if(chr=="B&qu

103、ot;.charAt(0)) iRet = 11; </p><p>  if(chr=="C".charAt(0)) iRet = 12; </p><p>  if(chr=="D".charAt(0)) iRet = 13; </p><p>  if(chr=="E".charAt(0)) iRet

104、 = 14;</p><p>  if(chr=="F".charAt(0)) iRet = 15; </p><p>  return iRet; </p><p><b>  } </b></p><p><b>  }</b></p><p>  3

105、.7 文件選擇模塊</p><p>  出口值:被選文件的路徑</p><p><b>  代碼實現(xiàn):</b></p><p>  class FilePanel extends JPanel{ </p><p>  FilePanel(String str){ </p><p>  JLabel

106、 label = new JLabel(str); </p><p>  JTextField fileText = new JTextField(35); </p><p>  JButton chooseButton = new JButton("瀏覽..."); </p><p>  this.add(label); </p>

107、<p>  this.add(fileText); </p><p>  this.add(chooseButton); </p><p>  clickAction ca = new clickAction(this); </p><p>  chooseButton.addActionListener(ca);//在面板加入文本框,“瀏覽”按鈕,設(shè)置

108、按鈕監(jiān)聽器</p><p><b>  } </b></p><p>  public String getFileName(){ //容器中第一個組件為文本框</p><p>  JTextField jtf = (JTextField)this.getComponent(1);</p><p>  return jt

109、f.getText(); </p><p><b>  }</b></p><p>  private class clickAction implements ActionListener{ //由類實現(xiàn)接口</p><p>  clickAction(Component c){ </p><p><b> 

110、 cmpt = c;</b></p><p><b>  } </b></p><p>  public void actionPerformed(ActionEvent event){ //觸發(fā)執(zhí)行操作</p><p>  JFileChooser chooser = new JFileChooser(); </p>

111、<p>  chooser.setCurrentDirectory(new File(".")); </p><p>  int ret = chooser.showOpenDialog(cmpt); </p><p>  if(ret==JFileChooser.APPROVE_OPTION){ </p><p>  JPanel

112、jp = (JPanel)cmpt; </p><p>  JTextField jtf = (JTextField)jp.getComponent(1);</p><p>  jtf.setText(chooser.getSelectedFile().getPath()); //彈出文件選擇框,選擇文件,返回當(dāng)前文件的路徑</p><p><b>  }

113、 </b></p><p><b>  } </b></p><p>  private Component cmpt;</p><p><b>  } </b></p><p><b>  }</b></p><p><b>  

114、3.8密碼生成模塊</b></p><p>  class KeyPanel extends JPanel{ </p><p>  KeyPanel(String str){ </p><p>  JLabel label = new JLabel(str); </p><p>  JTextField fileText = ne

115、w JTextField(35); </p><p>  JButton chooseButton = new JButton("隨機產(chǎn)生"); </p><p>  this.add(label); </p><p>  this.add(fileText); </p><p>  this.add(chooseButt

116、on); </p><p>  clickAction ca = new clickAction(this); </p><p>  chooseButton.addActionListener(ca); </p><p>  } //返回生成的密碼(48個字符長度)</p><p>  public String getKey(){ <

117、;/p><p>  JTextField jtf = (JTextField)this.getComponent(1); </p><p>  return jtf.getText(); </p><p><b>  } </b></p><p>  private class clickAction implements

118、ActionListener{ </p><p>  clickAction(Component c){ </p><p><b>  cmpt = c;</b></p><p><b>  } </b></p><p>  public void actionPerformed(ActionEve

119、nt event){ </p><p><b>  try{ </b></p><p>  KeyGenerator kg = KeyGenerator.getInstance("DES"); //按DES密鑰規(guī)范生成密鑰生成器</p><p>  kg.init(56); //初始化,密鑰長度為56</p>

120、<p>  Key ke = kg.generateKey(); </p><p>  byte[] bytK1 = ke.getEncoded(); </p><p>  ke = kg.generateKey();</p><p>  byte[] bytK2 = ke.getEncoded(); </p><p>  ke =

121、 kg.generateKey(); </p><p>  byte[] bytK3 = ke.getEncoded(); </p><p>  JPanel jp = (JPanel)cmpt; </p><p>  JTextField jtf = (JTextField)jp.getComponent(1); </p><p>  jt

122、f.setText(getByteStr(bytK1)+getByteStr(bytK2)+getByteStr(bytK3));</p><p><b>  }</b></p><p>  catch(Exception e){ //異常處理</p><p>  e.printStackTrace();</p><p>

123、;<b>  } </b></p><p><b>  } </b></p><p>  private String getByteStr(byte[] byt){ //將密碼轉(zhuǎn)換為16進制</p><p>  String strRet = ""; </p><p>  fo

124、r(int i=0;i< byt.length;i++){ </p><p>  strRet += getHexValue((byt[i]&240)/16); </p><p>  strRet += getHexValue(byt[i]&15);</p><p><b>  } </b></p><

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論