Java课程设计(论文)-加密和解密.doc

上传人:来看看 文档编号:3258286 上传时间:2019-08-06 格式:DOC 页数:32 大小:614.54KB
返回 下载 相关 举报
Java课程设计(论文)-加密和解密.doc_第1页
第1页 / 共32页
Java课程设计(论文)-加密和解密.doc_第2页
第2页 / 共32页
Java课程设计(论文)-加密和解密.doc_第3页
第3页 / 共32页
Java课程设计(论文)-加密和解密.doc_第4页
第4页 / 共32页
Java课程设计(论文)-加密和解密.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《Java课程设计(论文)-加密和解密.doc》由会员分享,可在线阅读,更多相关《Java课程设计(论文)-加密和解密.doc(32页珍藏版)》请在三一文库上搜索。

1、课程设计(论文)任务书 软件软件 学 院 软件工程软件工程 专 业 班 一、课程设计(论文)题目 加密与解密加密与解密 二、课程设计(论文)工作自 年 月 日起至 年 月 日止。 三、课程设计(论文) 地点: 四、课程设计(论文)内容要求: 1本课程设计的目的本课程设计的目的 (1)使学生巩固和提高 Java 编程技术 (2)培养学生掌握程序设计的基本思路和方法; (3)加强学生研发、调试程序的能力; (4)培养学生分析、解决问题的能力; (5)提高学生的科技论文写作能力。 2课程设计的任务及要求课程设计的任务及要求 1)任务:)任务: (1)设计 GUI 界面的 Hannoi 塔,用户可以通

2、过拖动鼠标移动各个塔上的盘子,程序 也可以自动演示盘子的移动过程。; (2)有三个表示塔的对象,分别命名为 A、B 和 C。A 塔上有若干个盘子,盘子的大小 不等,并按着大小顺序依次摆放在 A 塔上,大盘在下,小盘在上。用户可以用鼠标拖 动盘子,把 A 塔上的盘子全部移动到另外两个塔中的任何一个塔上。要求每次只能移 动一个盘子,在任何时候不允许大盘压在小盘的上面。 (3)用户也可以选择让程序自动演示。选择自动演示后,程序将以动画形式演示把 A 塔上的盘子全部移到 C 塔的过程,并将移动过程以文本形式显示在一个文本区中。 2)创新要求:)创新要求: 在基本要求达到后,可进行创新设计,增加功能和游

3、戏趣味性。 3 3)课程设计论文编写要求)课程设计论文编写要求 (1)课程设计任务及要求 (2)需求分析 (3)设计思路-工作原理、功能规划 (4)详细设计-数据分析、算法思路、类设计、功能实现(含程序流程图、主要代码及 注释)、界面等。 (4)运行调试与分析讨论-给出运行屏幕截图,分析运行结果,有何改进想法等。 (5)设计体会与小结-设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固 了哪些知识,有哪些提高。 (6)参考文献(必须按标准格式列出,可参考教材后面的参考文献格式) (7) 报告按规定排版打印,要求装订平整,否则要求返工; (8) 课设报告的装订顺序如下:封面-任务书-中文摘

4、要-目录-正文-附录(代 - 1 - 码及相关图片) (9)严禁抄袭,如有发现,按不及格处理。 4)答辩与评分标准:)答辩与评分标准: (1)考勤:10 分; (2)程序检查:30 分; (3)答辩回答问题:20 分 (3)课程设计报告:40 分; 5)参考文献:)参考文献: (1)Java语言程序设计教程邱桃荣 机械工业出版社 (2)Java程序设计试验指导陈轶 姚晓昆 清华大学出版社 6)课程设计进度安排)课程设计进度安排 内容内容 天数天数 地点地点 构思及收集资料 7 图书馆 编码与调试 5 实验室 撰写论文 3 图书馆、实验室 学生签名: 年 月 日 课程设计课程设计( (论文论文)

5、 )评审意见评审意见 (1)考勤(10 分):优( ) 、良( ) 、中( ) 、一般( ) 、差( ) ; (2)程序检查(30 分):优( ) 、良( ) 、中( ) 、一般( ) 、差( ) ; (3)答辩回答问题(20 分):优( ) 、良( ) 、中( ) 、一般( ) 、差( ) ; (4)设计报告(40 分):优( ) 、良( ) 、中( ) 、一般( ) 、差( ) ; 评阅人: 职称: 讲师 年 月 日 - 2 - 前前 言言- 3 - 一、题目分析一、题目分析.- 4 - 1.1 课程设计的要求和内容(包括原始数据、技术要求、工作要求)- 4 - 1.2 相关知识介绍.-

6、5 - 二、概要设计二、概要设计.- 8 - 2.1 抽象数据类型的定义 .- 8 - 2.2 主程序流程.- 9 - 2.3 各程序模块之间的层次(调用)关系- 9 - 三、详细设计三、详细设计.- 10 - 3.1 主函数模块.- 10 - 3.2 加密模块.- 11 - 3.3 加密操作模块.- 13 - 3.4 解密模块.- 13 - 3.5 解密操作模块.- 14 - 3.6 转换模块.- 15 - 3.7 文件选择模块.- 16 - 3.8 密码生成模块.- 16 - 四、调试分析四、调试分析.- 18 - 4.1 调试过程中遇到的问题 .- 18 - 4.2 对设计与实现的回顾讨

7、论和分析- 19 - 4.3 算法的时空分析.- 19 - 4.4 经验和体会.- 20 - 五、测试结果五、测试结果.- 20 - 5.1 加密 - 20 - 5.2 解密 - 21 - 六、主要参考资料六、主要参考资料.- 23 - 七、附录七、附录- 23 - - 3 - 摘 要 随着网络技术的不断发展,人们的个人信息、网络间的文件传递、电子商务等方面都 需要大力的保护,文件加密技术也就随之产生。文件的加密主要是由加密算法实现,加密 算法有多种,常见的有、等。本程序设计对文件的加密使用的是 加密算法。 Java 语言具有简单、安全、可移植、面向对象、健壮、多线程、体系结构中立、解释 执行

8、、高性能、分布式和动态等主要特点。利用 Java 语言中秘密密钥工厂对算法的 支持,使程序实现文件加密、解密两大功能更简单。 关键词: JAVA ; DES; 加密; 解密; - 4 - 前前 言言 DES ( data encryption Standard) 是一种世界标准的加密形式, 已经 15 年历史了, 虽然有些老, 可还算是比较可靠的算法。在七十的初期, 随着计算机之间的通信发展, 需要有一种标准密码算法为了限制不同算法的激增使它们之间不能互相对话。为解决这个 问题, 美国国家安全局(N.S.A ) 进行招标。 I.B.M 公司开发了一种算法, 称为: Lucifer。 经过几年的

9、研讨和修改, 这种算法, 成为了今天的 D.E.S,1976 年 11 月 23 日, 终于被美国国家安全局采用。 D.E.S 是分块加密的,将明文分割成 64 BITS 的块, 然后它们一个个接起来 。它使 用 56 位密钥对 64 位的数据块进行加密,并对 64bits 的数据块进行 16 轮编码。与每轮编 码时,一个 48bits 的“每轮”密钥值由 56bits 的完整密钥得出来。DES 用软件进行解码 需要用很长时间,而用硬件解码速度非常快,1977 年,人们估计要耗资两千万美元才能建 成一个专门计算机用于 DES 的解密,而且需要 12 个小时的破解才能得到结果。所以,当时 DES

10、 被认为是一种十分强壮的加密方法。但今天, 只需 二十万美圆就可以制造一台破译 DES 的特殊的计算机,所以现在 DES 对要求“强壮”加密的场合已经不再适用了。 DES 的唯一密码学缺点,就是密钥长度相对比较短,人们并没有放弃使用 DES,而是想 出了一个解决其长度问题的方法,即采用三重 DES。加密成为三步, 而不是一步,每一步 的密钥都不一样, 这样爆破就比较复杂了,这样要找三个密钥, 而不是一个, 每个密钥 有 56 BITS, 那样我们就有 56 乘以三, 等于 168 Bits。 本程序设计所采用的就是 DES 的变种三重 DES 算法。同时利用 Java 的 GUI 编程, 生成

11、文本对话框,对文件的路径进行选择、提供密钥框、加密和解密按钮。 - 5 - 一、题目分析一、题目分析 1.1 课程设计的要求和内容(包括原始数据、技术要求、工作要 求) 基本要求: 1.利用某种加密算法对指定的文本文件进行加密(应判断其是否已经加密,若已加 密则结束该步骤,否则提示输入加密口令,对文件进行加密) ; 2.加密解密方法:可使用 RSA,DES,MD5 等之一加密算法。 3 还应该提供解密功能。 1.2 相关知识介绍 1.2.11.2.1 DESDES 算法描述算法描述 DES 是一种分组加密算法,他以 64 位为分组对数据加密。64 位一组的明文从算法的一 端 输入,64 位的密

12、文从另一端输出。DES 是一个对称算法:加密和解密用的是同一个算法 (除 密钥编排不同以外) 。 密钥的长度为 56 位(密钥通常表示为 64 位的数,但每个第 8 位都用作奇偶检验,可以 忽 略)。密钥可以是任意的 56 位数,且可以在任意的时候改变。 DES 算法的入口参数有 3 个:Key,Data,Mode。其中 Key 为 8 个字节共 64 位,是 DES 算法 的工作密钥;Data 也为 8 个字节 64 位,是要被加密或解密的数据:Mode 为 DES 的工 作方式,有 两种:加密或解密。 DES 算法的工作过程:若 Mode 为加密,则用 Key 对数据 Data 进行加密,

13、生成 Data 的 密码 形式(64 位)作为 DES 的输出结果;若 Mode 为解密,则用 Key 对密码形式的数据 Data 解密,还 原为 Data 的明码形式(64 位)作为 DES 的输出结果。 在通信网络的两端,双方约定了一致的 Key,在通信的源点用 Key 对核心数据进行 DES 加密 ,然后以密码形式通过公共通信网(如电话网)传输到通信网络的终点,数据达到目 的 地后,用同样的 Key 对密码数据进行解密,便再现了明码形式的核心数据。这样便保证 了核 心数据(如 PIN,MAC 等)在公共通信网中传输的安全性和可靠性。通过定期在通信 网络的源 端和目的端同时改用新的 Key

14、,便能更进一步提高数据的保密性,这正是现在金 融界交易网 络的流行作法。 简单地说,算法只不过是加密的一种基本技术,DES 基本组建分组是这些技术的一种 组合 ,他基于密钥作用于明文,这是众所周知的轮(round) 。DES 有 16 轮,这意味着要 在明文分 组上 16 次实施相同的组合技术。 1.2.21.2.2 DESDES 算法详述算法详述 DES 算法把 64 位的明文输入块变为 64 位的密文输出块,他所使用的密钥也是 64 位, DES 对 64 位的明文分组进行操作。通过一个初始置换,将明文分组分成左半部分和右半 部分,各 32 位 长。然后进行 16 轮相同的运算,这些相同的

15、运算被称为函数 f,在运算过 程中数据和密 钥相结合。经过 16 轮运算后左、右部分在一起经过一个置换(初始置换的 逆置换) ,这样算 法就完成了。 (1)初始置换 其功能是把输入的 64 位数据块按位重新组合,并把输出分为 L0,R0 两部分,每部分 - 6 - 各长 32 位,其置换规则如表 1 所示。 表表 1 1 5858 5050 4242 3434 2626 1818 1010 2 2 6060 5252 4444 3636 2828 2020 1212 4 4 6262 5454 4646 3838 3030 2222 1414 6 6 6464 5656 4848 4040 3

16、232 2424 1616 8 8 5757 4949 4141 3333 2525 1717 9 9 1 1 5959 5151 4343 3535 2727 1919 1111 3 3 6161 5353 4545 3737 2929 2121 1313 5 5 6363 5555 4747 3939 3131 2323 1515 7 7 即将输入的第 58 位换到第 1 位,第 50 位换到第 2 位,依次类推,最后一位是原来的 第 7 位,L0,R0 则是换位输出后的两部分,L0 是输出的左 32 位,R0 是右 32 位。例:设 置换前 的输入值为 D1D2D3D64,则经过初始置换

17、后的结果为: L0=D58D50D8;R0=D57D497。 (2)逆置换 经过 16 次迭代运算后,得到 L16,R16,将此作为输入进行逆置换,即得到密文输出。 逆置换正好是初始置换的逆运算。例如,第 1 位经过初始置换后,处于第 40 位,而通过 逆置换,又将第 40 位换回到第 1 位,其逆置换的规则如表 2 所示。 表表 2 2 4040 8 8 4848 1616 5656 2424 6464 3232 3939 7 7 4747 1515 5555 2323 6363 3131 3838 6 6 4646 1414 5454 2222 6262 3030 3737 5 5 454

18、5 1313 5353 2121 6161 2929 3636 4 4 4444 1212 5252 2020 6060 2828 3535 3 3 4343 1111 5151 1919 5959 2727 3434 2 2 4242 1010 5050 1818 5858 2626 3333 1 1 4141 9 9 4949 1717 5757 2525 (3)函数 f(Ri,Ki)的计算 其算法描述如图 1 所示。 图 1 Li-1Ri-1密钥 扩展置换 S 盒置 换 Li Ri 移位移位 S 盒置换 密钥 P 盒置换 - 7 - 在图 1 中, “扩展置换”是将 32 位放大成 48

19、 位, “P 盒置换”是 32 位到 32 位换位, 其换位 规则分别如表 3、表 4 所示。 表表 3 3 扩展置换表扩展置换表 3232 1 1 2 2 3 3 4 4 5 5 4 4 5 5 6 6 7 7 8 8 9 9 8 8 9 9 1010 1111 1212 1313 1212 1313 1414 1515 1616 1717 1616 1717 1818 1919 2020 2121 2020 2121 2222 2323 2424 2525 2424 2525 2626 2727 2828 2929 2828 2929 3030 3131 3232 1 1 表表 4 4 P

20、 P 盒置换表盒置换表 1616 7 7 2020 2121 2929 1212 2828 1717 1 1 1515 2323 2626 5 5 1818 3131 1010 2 2 8 8 2424 1414 3232 2727 3 3 9 9 1919 1313 3030 6 6 2222 2121 4 4 2525 在 f(Ri,Ki)算法描述图中,S1,S2.S8 为选择函数,其功能是把 6bit 数据变为 4bit 数据。 下面给出选择函数 Si(i=1,28)的功能表: 选择函数 Si S1: 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7, 0,15

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

22、,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,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,1

23、2,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: 12,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, - 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,1

24、1,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,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,

25、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 列。 现设输入为: DD1D2D3D4D5D6 令:列D2D3D4D5 行D1D6 然后在 S1 表中查得对应的数,以 4 位二进制表示,此即为选择函数 S1 的输出。 (4)子密钥 Ki(48 b)的生成算法 开始,由于不考虑每个字节的第 8 位,DES 的密钥从 64 位变为 48 位,如表 5 所示, 首先 56 位 密钥被分成两个部分,每部分 28 位,

26、然后根据轮数,两部分分别循环左移 l 或 2 位。 表表 5 5 密钥置换密钥置换 5757 4949 4141 3333 2525 1717 9 9 1 1 5858 5050 4242 3434 2626 1818 1010 2 2 5959 5151 4343 3535 2727 1919 1111 3 3 6060 5252 4444 3636 6363 5555 4747 3939 3131 2323 1515 7 7 6262 5454 4646 3838 3030 2222 1414 6 6 6161 5353 4545 3737 2929 2121 1313 5 5 2828

27、2020 1212 4 4 DES 算法规定,其中第 8,16,64 位是奇偶校验位,不参与 DES 运算。故 Key 实 际可用 位数只有 56 位。即:经过密钥置换表的变换后,Key 的位数由 64 位变成了 56 位, 此 56 位分为 C 0,D0 两部分,各 28 位,然后分别进行第一次循环左移,得到 C1,D1,将 C1(28 位),D1(28 位 )合并得到 56 位,再经过压缩置换,从而便得到了密钥 K0(48 位)。 依次类推,便可得到 K1,K 2,K15。需要注意的是,16 次循环左移对应的左移位数要 依据表 6 所示的规则进行。 表表 6 6 循环左移位数循环左移位数

28、轮 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 2 2 2 2 1 以上介绍了 DES 算法的加密过程。DES 算法的解密过程是一样的,区别仅在于第一次迭 代时用子密钥 K15,第二次是 K14,最后一次用 K0,算法本身并没有任何变化。 - 9 - 二、概要设计二、概要设计 2.1 抽象数据类型的定义 2.1.12.1.1 程序所需要引入的包:程序所需要引入的包: import java.awt.*; /包含用于创建用户界面和绘制图形图像的所有类。 import java.awt.event.*; /提供处理

29、由 AWT 组件所激发的各类事件的接口和类。 import javax.swing.*; /提供一组“轻量级”(全部是 Java 语言)组件,尽量让 这些组件在所有平台上的工作方式都相同。 import java.io.*; /通过数据流、序列化和文件系统提供系统输入和输出。 import java.security.*; /为安全框架提供类和接口。 import javax.crypto.*; /为 cryptographic(加密)操作提供类和接口。 import javax.crypto.spec.*; / 为密钥规范和算法参数规范提供类和接口。 2.1.22.1.2 其他定义:其他定义

30、: new FlowLayout() 对文件加密器对话框采用 FlowLayout 管理器。 new ActionListener() 对文件的加密和解密设置事件监听器。 byte bytK1、 byte bytK2 、byte bytK3 密钥分三部分,采用字节数组保存数据。 2.2 主程序流程 是是否否 否否 开始 弹出文件加密器对话框 输入文件路径和密钥 密钥长度等于 48? 加密或解密 解密 文件是否已 加密 加密 生成机密文件生成解密文件 - 10 - 图图 2 2 主程序流程图主程序流程图 2.3 各程序模块之间的层次(调用)关系 2.3.12.3.1 模块定义模块定义 主函数模块

31、: 生成加密器框体;获取数据的输入;调用加密或解密函数。 加密模块: 判断密钥是否合法和文件是否已加密,启动加密操作,显示操作结果,并在与源文件 同一文件夹下生成密文。 加密操作模块: 用 DES 方法加密输入的字节并返回。 解密模块: 判断密钥是否合法,启动解密操作,显示操作结果,并在指定的文件路径下生成明文。 解密操作模块: 用 DES 方法解密输入的字节并返回。 转换模块: 转换模块一:输入密码的字符形式,返回字节数组形式。 转换模块二:计算一个 16 进制字符的 10 进制值。 文件选择模块: 选择需要加密或解密的文件。 密码生成模块: 随机生成或用获得的密钥,用 DES 算法对密钥进

32、行操作。 2.3.2 层次层次(调用调用)关系关系 结束 文件加密器模块 加密模块 密码生成模块 加密操作模块 转换模块一 文件选择模块 解密模块 解密操作模块 转换模块二 - 11 - 图图 3 3 层次(调用)关系层次(调用)关系 三、详细设计三、详细设计 3.1 主函数模块 代码实现:代码实现: public class FileEncrypter extends JFrame /FileEncrypter 继承 JFrame 类 public static final int WIDTH = 550; /定义不可变的宽度值为 550 public static final int HE

33、IGHT = 200; /定义不可变的高度值为 200 public 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.getDefaultToolkit(); Dimensio

34、n screenSize = tk.getScreenSize(); this.setLocation(screenSize.width - WIDTH)/2, (screenSize.height - HEIGHT)/2); this.setTitle(“文件加密器(TirDES)“); /以上设置新建框体的标题;框体 的宽度和高度;关闭时的操作;框体大小不可变;框体在屏幕上显示的位置。 Container c = this.getContentPane(); /创建容器 c c.setLayout( new FlowLayout(); /c 采用 FlowLayout 布局管理 final

35、 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() /设置加密监听器 public void actionPerformed(ActionEvent event) File file = new File(

36、fp.getFileName(); if(file.exists()encrypt(file.getAbsoluteFile(),pp.getKey(); else JOptionPane.showMessageDialog( null,“请选择文件!“,“提示 “,JOptionPane.OK_OPTION); ); JButton jbD = new JButton(“解密“); - 12 - c.add(jbD); /添加解密按钮 jbD.addActionListener(new ActionListener() /设置解密监听器 public void actionPerformed

37、(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 加密模块 入口参数:指定的文件和密钥 出口值:文件已加密,提示“文件已加密!” 加密成功,提示“加密成功!”并输出加密后的密文 密码长度不等于 48,提示“密码长度必须等于 48!” 抛出异

38、常。 代码实现:代码实现: private void encrypt(File fileIn,String sKey) try if(sKey.length() = 48) /密钥长度等于 48 成立 byte bytK1 = getKeyByStr(sKey.substring(0,16); /密钥前 16 位 返回的字节数组保存到数组 bytK1 byte bytK2 = getKeyByStr(sKey.substring(16,32);/密钥中 16 位 返回的字节数组保存到数组 bytK2 byte bytK3 = getKeyByStr(sKey.substring(32,48);

39、/密钥后 16 位 返回的字节数组保存到数组 bytK3 String strPath = fileIn.getPath(); if(strPath.substring(strPath.length()- 5).toLowerCase().equals(“.tdes“) /判断文件是否已加密,加密则输出信息并返回 JOptionPane.showMessageDialog(this,“该文件已加密!“,“提示 “,JOptionPane.OK_OPTION); return; else FileInputStream fis = new FileInputStream(fileIn); byt

40、e 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); - 13 - /反复调用加密操作模块 String fileOut = fileIn.getPath() + “.tdes“; /文件名后上 “.tdes”作为密文的标记。 FileOutputStream fos = ne

41、w 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,“密码长度必须等于 48!“,“ 错误信息“,JOptionPane.ERROR_MESSAGE); /给出“密码长度必须等于 48”

42、信息 catch(Exception e) / 异常处理操作 e.printStackTrace(); 3.3 加密操作模块 入口参数:字节数组 出口值:经 DES 算法加密过的字节数组 代码实现:代码实现: private byte encryptByDES(byte bytP,byte bytKey) throws Exception DESKeySpec desKS = new DESKeySpec(bytKey); /新建一个 DESKeySpec 对象, bytKey 位密钥 SecretKeyFactory skf = SecretKeyFactory.getInstance(“D

43、ES“); /用秘密密钥 工厂生成 DES 密钥规范。 SecretKey sk = skf.generateSecret(desKS); /根据密钥规范生成密钥 Cipher cip = Cipher.getInstance(“DES“); /生成一个 DES 转换的 Cipher 对象 cip.init(Cipher.ENCRYPT_MODE,sk); /用密钥和加密模式初始化 cip return cip.doFinal(bytP); 3.4 解密模块 入口参数:指定文件路径和密钥 出口值:不是密文,提示“不是合法的加密文件!” 解密成功,提示“解密成功”并按指定路径给出解密明文 密码长

44、度不等于 48,提示“密码长度必须等于 48!” 密码错误,异常处理,提示“解密失败,请核对密码!” 代码实现:代码实现: - 14 - private void decrypt(File fileIn,String sKey) try if(sKey.length() = 48) /密钥长度等于 48 成立 String strPath = fileIn.getPath(); if(strPath.substring(strPath.length()-5).toLowerCase().equals(“.tdes“) strPath = strPath.substring(0,strPath.

45、length()-5); /判断指定文件是否是密文,不是则返回 else JOptionPane.showMessageDialog(this,“不是合法的加密文件!“,“提示 “,JOptionPane.OK_OPTION); return; JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new File(“.“); chooser.setSelectedFile(new File(strPath); /用户指定要保存的文件 int ret = chooser.showSaveDialog(thi

46、s); 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); FileInputStream fis = new FileInputStream(fileIn); byte bytIn = new byte(int)fileIn.length(); for(int i = 0;i fileIn.

47、length();i+) bytIni = (byte)fis.read(); /解密 byte bytOut = decryptByDES(decryptByDES(decryptByDES(bytIn,bytK3),bytK2),bytK1); /反复调用加密操作模块 File fileOut = chooser.getSelectedFile(); fileOut.createNewFile(); FileOutputStream fos = new FileOutputStream(fileOut); for(int i = 0;i bytOut.length;i+) fos.writ

48、e(int)bytOuti); fos.close(); /按指定路径输出明文 JOptionPane.showMessageDialog(this,“解密成功!“,“提示 “,JOptionPane.OK_OPTION); else JOptionPane.showMessageDialog(this,“密码长度必须等于 48!“,“错 误信息“,JOptionPane.ERROR_MESSAGE); catch(Exception e) JOptionPane.showMessageDialog(this,“解密失败,请核对密码!“,“提示 “,JOptionPane.OK_OPTION); /异常处理 - 15 - 3.5 解密操作模块 入口参数:字节数组 出口值:经 DES 算法解密过的字节数组 代码实现:代码实现: private

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1