加密解密软件的设计与实现.docx
《加密解密软件的设计与实现.docx》由会员分享,可在线阅读,更多相关《加密解密软件的设计与实现.docx(22页珍藏版)》请在冰豆网上搜索。
![加密解密软件的设计与实现.docx](https://file1.bdocx.com/fileroot1/2023-2/9/c01bac47-7434-42a6-b15e-6f8ee775ee93/c01bac47-7434-42a6-b15e-6f8ee775ee931.gif)
加密解密软件的设计与实现
课程设计任务书
2010—2011学年第二学期
专业:
计算机科学与技术学号:
080101010姓名:
刘海坤
课程设计名称:
计算机网络课程设计
设计题目:
加密解密软件的设计与实现
完成期限:
自2011年6月21日至2011年6月26日共1周
设计目的:
本程序设计所采用的就是DES算法,同时利用Java的GUI编程,生成文本对话框,对文件的路径进行选择、提供密钥框、加密和解密按钮。
功能要求:
根据DES算法,设计加密解密软件来为各种文件加密解密。
1、设计的任务:
根据设计整体需求,本人负责窗体的设计与实现和目标文件的导入模块。
2、进度安排:
序号
阶段内容
所需时间
1
布置任务及调研
2天
2
系统分析与设计
2天
3
调试及报告撰写
3天
合计
7天
3、主要参考资料:
[1]谢希仁.计算机网络教程.北京:
人民邮电出版社,2006.
[2]耿祥义.Java2使用教程:
清华大学出版社,2006.
[3]方敏,张彤.网络应用程序设计.西安:
电子科技大学出版社,2005.
[4]黄超.Windows下的网络编程.北京:
人民邮电出版社,2003.
指导教师(签字):
教研室主任(签字):
批准日期:
年月日
摘要
随着计算机的应用和网络技术的不断发展,网络间的通讯量不断的加大,人们的个人信息、网络间的文件传递、电子商务等方面都需要大力的保护,文件加密技术也就随之产生。
文件的加密主要是由加密算法实现,加密算法有多种,常见的有RSA、DES、MD5等。
本程序设计对文件的加密使用的是DES加密算法。
DES是分块加密的。
DES用软件进行解码需要用很长时间,而用硬件解码速度非常快,1977年,人们估计要耗资两千万美元才能建成一个专门计算机用于DES的解密,而且需要12个小时的破解才能得到结果。
所以,当时DES被认为是一种十分强壮的加密方法。
但今天,只需二十万美元就可以制造一台破译DES的特殊的计算机,所以现在DES对要求“强壮”加密的场合已经不再适用了。
Java语言具有简单、安全、可移植、面向对象、健壮、多线程、体系结构中立、解释执行、高性能、分布式和动态等主要特点。
利用Java语言中秘密密钥工厂对DES算法的支持,使程序实现文件加密、解密两大功能更简单。
本程序设计所采用的就是DES算法。
同时利用Java的GUI编程,生成文本对话框,对文件的路径进行选择、提供密钥框、加密和解密按钮。
使用本程序可以对txt,word等多种文件进行加密解密,使用便捷实用,功能完善,满足了用户对文件安全性的需求。
关键词:
JAVA,DES,加密,解密。
目录
一、题目分析1
1.1课程设计的要求和内容1
1.2DES算法描述1
二、概要设计3
2.1抽象数据类型的定义3
2.1.1程序所需要引入的包3
2.1.2其他定义3
2.2主程序流程图4
2.3各程序模块之间的层次(调用)关系4
三、详细设计6
3.1窗体的设计与实现6
3.2文件导入模块7
四、测试分析与结果8
4.1.测试结果8
4.1.1运行程序8
4.1.2加密8
4.1.3解密10
总结12
参考文献13
附录14
一、题目分析
1.1课程设计的要求和内容
基本要求:
1.利用某种加密算法对指定的文本文件进行加密(应判断其是否已经加密,若已加密则结束该步骤,否则提示输入加密口令,对文件进行加密);
2.加密解密方法:
本设计采用DES加密算法。
3.还应该提供解密功能。
1.2DES算法描述
DES(dataencryptionStandard)是一种世界标准的加密形式,已经15年历史了,虽然有些老,可还算是比较可靠的算法。
在七十的初期,随着计算机之间的通信发展,需要有一种标准密码算法为了限制不同算法的激增使它们之间不能互相对话。
为解决这个问题,美国国家安全局(N.S.A)进行招标。
I.B.M公司开发了一种算法,称为:
Lucifer。
经过几年的研讨和修改,这种算法,成为了今天的D.E.S,1976年11月23日,终于被美国国家安全局采用。
DES是一种分组加密算法,他以64位为分组对数据加密。
64位一组的明文从算法的一端输入,64位的密文从另一端输出。
DES是一个对称算法:
加密和解密用的是同一个算法(除密钥编排不同以外)。
密钥的长度为56位(密钥通常表示为64位的数,但每个第8位都用作奇偶检验,可以忽略)。
密钥可以是任意的56位数,且可以在任意的时候改变。
DES算法的入口参数有3个:
Key,Data,Mode。
其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或解密的数据:
Mode为DES的工作方式,有两种:
加密或解密。
DES算法的工作过程:
若Mode为加密,则用Key对数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;若Mode为解密,则用Key对密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。
在通信网络的两端,双方约定了一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式通过公共通信网(如电话网)传输到通信网络的终点,数据达到目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。
这样便保证了核心数据(如PIN,MAC等)在公共通信网中传输的安全性和可靠性。
通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融界交易网络的流行作法。
随着计算机网络的发展,加密技术也在迅速的发展中,加密解密技术的实现主要靠性能好的加密算法,而DES就是在实践中被证明的很好的算法,目前此算法已被广泛运用,且在使用中有了一些改进,DES算法给网络文件带来了可靠的安全性保证。
二、概要设计
2.1抽象数据类型的定义
2.1.1程序所需要引入的包
importjava.awt.*;//包含用于创建用户界面和绘制图形图像的所有类。
importjava.awt.event.*;//提供处理由AWT组件所激发的各类事件的接口和类。
importjavax.swing.*;//提供一组“轻量级”(全部是Java语言)组件,尽量让这些组件在所有平台上的工作方式都相同。
importjava.io.*;//通过数据流、序列化和文件系统提供系统输入和输出。
2.1.2其他定义
newBorderLayout()对文件加密器对话框采用BorderLayout管理器。
newActionListener()对文件的加密和解密设置事件监听器。
newButtonGroup()定义一个按钮组。
newJRadioButton()将此按钮设置为属于一个按钮组的成员。
newFileInputStream()建立文件输入流以便进行文件的读操作,取其数据
newFileOutputStream()建立文件输出流以便将数据写入文件
shu1用整形数据保存该密钥。
2.2主程序流程图
若为取出则在文本区中
输出要取出的内容
若为写入则在文本区中
输入要写入的内容
点击解密按钮,输入密钥,解密文件
点击加密按钮,
生成密钥(记住)
完成
图2主程序流程图
2.3各程序模块之间的层次(调用)关系
模块定义
(1)主函数模块:
生成加密器框体;获取数据的输入;调用加密或解密函数。
(2)加密模块:
判断密钥是否合法和文件是否已加密,启动加密操作,显示操作结果,并在与源文件同一文件夹下生成密文。
(3)加密操作模块:
用DES方法加密输入的字节并返回。
(4)解密模块:
判断密钥是否合法,启动解密操作,显示操作结果,并在指定的文件路径下生成明文。
(5)解密操作模块:
用DES方法解密输入的字节并返回。
三、详细设计
3.1窗体的设计与实现
窗体的总体布局包含按钮、画布、文本框、标签等,合理分布达到视觉的美感。
代码实现:
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjavax.swing.*;
publicclasskey加密extendsJFrame{
intshu1;
JLabeljl1,jl2;
Stringcc;
JButtonqueding,xuanz,jiami,jiemi;
JTextFieldlujin,key;
JTextAreanr;
JRadioButtonqu,xie;
ButtonGroupfz;
Filef;
publickey加密(){
Containerc=getContentPane();
JPaneljp1=newJPanel();
jl1=newJLabel("输入路径");
lujin=newJTextField(15);
xuanz=newJButton("选择");
jp1.add(jl1);
jp1.add(lujin);
jp1.add(xuanz);
c.add(jp1,BorderLayout.NORTH);
nr=newJTextArea();
c.add(newJScrollPane(nr),BorderLayout.CENTER);
qu=newJRadioButton("写入");
xie=newJRadioButton("取出",true);
fz=newButtonGroup();
fz.add(qu);
fz.add(xie);
jl2=newJLabel("密钥");
key=newJTextField(15);
jiami=newJButton("加密");
jiemi=newJButton("解密");
JPaneljp4=newJPanel();
jp4.setLayout(newGridLayout(2,1,5,5));
JPaneljp2=newJPanel();
jp2.add(jl2);
jp2.add(key);
jp2.add(jiami);
jp2.add(jiemi);
jp4.add(jp2);
JPaneljp3=newJPanel();
queding=newJButton("确定");
jp3.add(qu);
jp3.add(xie);
jp3.add(queding);
jp4.add(jp3);
c.add(jp4,BorderLayout.SOUTH);
queding.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevent){
jian();
if(qu.isSelected())
shuchu();
if(xie.isSelected())
qu();
}});
3.2文件导入模块
实现目标文件的导入,通过选择按钮导入加密或解密的文件。
xuanz.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevent){
JFileChooserfileChooser=newJFileChooser();//实例化文件选择器
fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);//设置文件选择模式,此处为文件和目录均可
if(fileChooser.showOpenDialog
(key加密.this)==JFileChooser.APPROVE_OPTION){//弹出文件选择器,并判断是否点击了打开按钮
StringfileName=fileChooser.getSelectedFile().getAbsolutePath();//得到选择文件或目录的绝对路径
lujin.setText(fileName);
}
}
});
四、测试分析与结果
4.1.测试结果
4.1.1运行程序
首先在我机器E盘文件夹名为java1的文件夹离创建一个名为Example.doc文档用做测试。
图4-1-1运行程序
运行程序弹出如图4-1-1对话框,然后进行文件选择
4.1.2加密
图4-1-2选择加密文件
根据需求,选择所要加密文件的路径,并打开选取文件
图4-1-3选取文件,在文本区中写入要加密的内容并单击加密按钮
图4-1-4该文件已被
4.1.3解密
解密操作中对文件选择,密码输入和加密操作是一样的。
图4-1-5选择要解密的文件
图4-1-6输入密码进行文件解密
图4-1-7点击解密按钮,得到明文
总结
在本次课程设计过程中,本人主要是负责窗体设计与实现和目标文件的导入模块设计。
通过本组三个人的分工协作,完成了课程设计。
在完成设计期间,我通过不断网上搜集和查找有关书集和相关加密算法的介绍,进行认真而细致的学习,进而完成了此次课程设计模块的完成。
通过本次设计我们也较深入的了解了DES这个加密算法的原理与作用。
通过本次设计,我意识到了无论身在何处,团队的事情远远大于个人的事情。
学会团队合作才是未来在工作中实现自身价值的必备条件。
我想课程设计的目的,并不仅仅让我们能把任务完成吧。
大概也有让我们积极合作,团结奋进的意思吧。
不管怎么说,我是在意识上还是在知识上都有了不小的提高。
懂得了,只有细心的做好每一个步骤,才能酝酿一个完美的结局。
本次课程设计得到了韩芳老师的精心指导,在老师的指点下和小组成员的共同努力下,一一克服细节上的所有问题,并让它成为合格的设计。
让本次任务顺顺利利的完成,在此谢谢韩老师的教导。
参考文献
[1]谢希仁.计算机网络教程.北京:
人民邮电出版社,2006.
[2]耿祥义.Java2使用教程:
清华大学出版社,2006.
[3]方敏,张彤.网络应用程序设计.西安:
电子科技大学出版社,2005.
[4]黄超.Windows下的网络编程.北京:
人民邮电出版社,2003.
附录
程序实现Java源代码
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjavax.swing.*;
publicclasskey加密extendsJFrame{
intshu1;
JLabeljl1,jl2;
Stringcc;
JButtonqueding,xuanz,jiami,jiemi;
JTextFieldlujin,key;
JTextAreanr;
JRadioButtonqu,xie;
ButtonGroupfz;
Filef;
publickey加密(){
Containerc=getContentPane();
JPaneljp1=newJPanel();
jl1=newJLabel("输入路径");
lujin=newJTextField(15);
xuanz=newJButton("选择");
jp1.add(jl1);
jp1.add(lujin);
jp1.add(xuanz);
c.add(jp1,BorderLayout.NORTH);
nr=newJTextArea();
c.add(newJScrollPane(nr),BorderLayout.CENTER);
qu=newJRadioButton("写入");
xie=newJRadioButton("取出",true);
fz=newButtonGroup();
fz.add(qu);
fz.add(xie);
jl2=newJLabel("密钥");
key=newJTextField(15);
jiami=newJButton("加密");
jiemi=newJButton("解密");
JPaneljp4=newJPanel();
jp4.setLayout(newGridLayout(2,1,5,5));
JPaneljp2=newJPanel();
jp2.add(jl2);
jp2.add(key);
jp2.add(jiami);
jp2.add(jiemi);
jp4.add(jp2);
JPaneljp3=newJPanel();
queding=newJButton("确定");
jp3.add(qu);
jp3.add(xie);
jp3.add(queding);
jp4.add(jp3);
c.add(jp4,BorderLayout.SOUTH);
queding.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevent){
jian();
if(qu.isSelected())
shuchu();
if(xie.isSelected())
qu();
}});
xuanz.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevent){
JFileChooserfileChooser=newJFileChooser();//实例化文件选择器
fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);//设置文件选择模式,此处为文件和目录均可
if(fileChooser.showOpenDialog
(key加密.this)==JFileChooser.APPROVE_OPTION){//弹出文件选择器,并判断是否点击了打开按钮
StringfileName=fileChooser.getSelectedFile().getAbsolutePath();//得到选择文件或目录的绝对路径
lujin.setText(fileName);
}
}});
jiemi.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevent){
ObjectInputStreaminput;
try{
input=newObjectInputStream(newFileInputStream(lujin.getText()));
intmima=Integer.parseInt(key.getText());
AAac=(AA)input.readObject();
if(ac.getShu()==mima){
nr.setText(ac.cc);
shuchu();
}else{
nr.setText("错误的key");
}
}catch(Exceptione){
//e.printStackTrace();
nr.setText("无法解密");
}}});
jiami.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevent){
AAa=newAA(nr.getText());
key.setText(a.shu+"");
try{
ObjectOutputStreamoutput=newObjectOutputStream(
newFileOutputStream(lujin.getText()));
output.writeObject(a);
output.flush();
output.close();
qu();
baocun();
}catch(Exceptione){
//e.printStackTrace();
nr.setText("必须选择加密文件保存地址,文件不存在或者无法加密文件,加密文件不能含有换行");
}}});
setSize(380,350);
setVisible(true);
}
publicvoidjian(){
f=newFile(lujin.getText());
try{
f.createNewFile();
}catch(IOExceptione){
JOptionPane.showMessageDialog(null,"路径错误");
}}
publicvoidshuchu(){
try{
FileOutputStreamout=newFileOutputStream(f);
bytebuf[]=nr.getText().getBytes();
try{
out.write(buf);
out.flush();
out.close();
}catch(IOExceptione){
//e.printStackTrace();
}
}catch(FileNotFoundExceptione){
//e.printStackTrace();
}}
publicvoidqu(){
try{
FileInputStreamin=newFileInputStream(f);
inta=(int)f.length();
bytebuf[]=newbyte[a];
try{
intlen=in.read(buf);
if(len==-1)
System.out.println("文件为空");
else
nr.s