JAVA课程设计 文件加密解密
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
辽宁工业大学
JA V A程序设计课程设计(论文)题目:文件加密解密
院(系):软件学院
专业班级:软件工程
学号:
学生姓名:
指导教师:***
教师职称:讲师
起止时间: 2012.6.18至2012.7.1
程序设计专题(报告)任务及评语
目录
第1章课程设计的目的与要求 (1)
1.1 课程设计目的 (1)
1.2 课程设计的实验环境 (1)
1.3 课程设计的预备知识 (1)
1.4 课程设计要求 (1)
第2章课程设计内容 (2)
2.1课程设计主要内容 (2)
2.2概要设计 (2)
2.2.1功能分析 (2)
2.2.2自定义类说明 (3)
2.3详细设计 (4)
2.3.1界面设计 (4)
2.4程序实现 (6)
2.4.1源码分析 (6)
2.4.2程序运行情况 (11)
2.4.3程序异常处理 (12)
第3章课程设计总结 (14)
参考资料15
第1章课程设计的目的与要求
1.1 课程设计目的
《JA V A程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行的一次全面的综合训练,JA V A程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
1.2 课程设计的实验环境
硬件要求能运行Windows 9.X操作系统的微机系统。
JAVA程序设计语言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。
1.3 课程设计的预备知识
熟悉JAVA语言及ECLIPSE开发工具。
1.4 课程设计要求
按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。
要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握JA V A程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。
同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。
第2章课程设计内容
2.1课程设计主要内容
文件加密解密是科技飞速发展的中通信安全保密问题的最终结果,无论是当今还是未来计算机信息的保密问题显得越来越重要,无论是个人信息通信还是电子商务发展,都迫切需要保证Internet网上信息传输的安全,需要保证信息安全。
其中,信息安全的核心是密码技术。
在这个java编写的加密解密程序中,我这个设计实现了文本编辑器的基本功能有:打开文件,文件保存,文件另存为,文件加密,文件解密,及其查找。
2.2概要设计
2.2.1功能分析
根据系统的设计要求,设计的系统功能模块如图2-1所示。
图2-1 系统功能模块图
在做加密解密工具时首先确定的是界面的设计,此工具的主界面主要有三个标签:加密、解密、路径设置。
加密标签界面里设计了四个panel工具,主要用于实现文件的加密功能,当向panel1或panel2拖入要加密的文件时它会弹出一个要输入密码的对话框,此界面的下方有一个textbox用于接收传进来的文件路径。
在解密标签的窗口中的
界面基本上与加密标签里一样,但用于实现文件的解密功能。
加密解密工具中的路径设置用于设置加密解密文件存放路径,这一块中要分两个区域:加密文件路径设置区(groupBox1)和解密文件路径设置区(groupBox2),在groupBox1标签中有两个单选按钮:radiobutton1设置的路径与原文件路径相同和radiobutton2设置了自定义的路径,一个文本框按钮(textbox3)一个选择button按钮。
Button按钮是获得文件存储的路径,得到路径后就会把路径传给文本框按钮textBox3,textBox3的作用是将从button那得到的路径传加密标签是的textBox1。
解密文件路径设置区的设计也和加密文件路径设置区一样,这里就不多说了。
在设计时还要用到两个对话框,用于设置加密或解密密码。
有两个文本框用于输入密码,一个确定按钮用来传送密码,一个取消按钮用来取消当前的操作。
2.2.2自定义类说明
1.类名:Cryp
作用:主类
继承的父类:没有
实现的接口:没有
2.类名:encryptt
作用:主类
继承的父类: Frame
实现的接口:ActionListener
3.类名:Key
作用:主类
继承的父类:没有
实现的接口:没有
4.类名:MessageDigestExample
作用:主类
继承的父类:没有
实现的接口:没有
表2.1 主类成员变量表
表2.2 主类方法表
2.3详细设计
2.3.1界面设计
1.加密解密界面设计
运行Microsoft Visual Studio环境,创建一个项目命名为:WindowsApplication1,
在项目里建一个表单Form1,把它作为文件加密解密工具的主界面。
主界面窗口有三个标签:设置、加密、解密,要分别对这三个标签做详细的设计,设计时要用到Microsoft Visual Studio里的工具箱里面的工具。
每个标签的设计如下:
(1)“加密”标签的设计
此标签包含有4个panel(此处只实现一个)和textBox1,textBox1用于存放传过来的加密路径。
panel主要实现文件的拖放和文件的加密功能。
当一个文件拖到panel 中时,会弹出一个要求输入密码的对话框。
把输入的密码传回到Form1的panel1_dragDrop中,实现拖放功能.此标签包含有4个panel(此处只实现一个)和textBox1,textBox1用于存放传过来的加密路径。
panel主要实现文件的拖放和文件的加密功能。
当一个文件拖到panel中时,会弹出一个要求输入密码的对话框。
把输入的密码传回到Form1的panel1_dragDrop中。
(2)“解密”标签的设计
此界面中有一个panel和一个textbox2, textbox2用于存放传过来的加密路径,panel用于实现文件的拖放和解密功能,当一个文件拖到panel中时,会弹出一个输入密码对话框。
把输入的密码传回到Form1的panel5_dragDrop中。
(3)“设置”标签的设计
此界面主要有两个部分组成:加密文件存储路径和解密文件存储路径,由groupbox1、groupbox2、组成。
在groupbox11中有两个单选按钮radiobutton1和radiobutton2,分别命名为“与加密文件相同目录”、“指定存储路径”,一个文本框textbox3和一个button1,textbox3用于存放指定的加密路径,button1实现文件的路径的选择。
在代码设计部分,要首先让radiobutton1在程序运行时自动获得焦点,在radiobutton1获得焦点时,radiobtuuon2将会失去焦点,同时textbox3和button1的状态为不可见状态。
要实现这些功能就要把radiobutton1和radiobutton2同时放到一个函数中
按照以上的步骤就可以实现选择指定的加密路径,但路径只会传给textBox3,在button2中添加如下代码,使textBox3中存放的路径值传给textBox1,并将textBox3的值设置为空。
解密部分的实现过程跟加密大致相同,这里不给予详细说明。
2.加密密钥界面设计
加密密钥界面Form2里由两个标签:label1、label2,分别命名为输入密码、确认密码;两个文本框:textBox1、textBox2,用于用户输入密码(密码以*的形式显示出来);两个按键:button1、button2(分别为确认、取消)。
在Form2开始设一个全局变量mm1,当单击确定按钮时对textBox1和textBox2中的内容进行判断,如果两个文本框中输入的值相同,则把textBox2中的值赋给mm1, 提示“加密成功”,并关闭此Form2。
如果textBox1与textBox2中的值不同则提示“密码不同,请重新输入!”,并把textBox1与textBox2中的值清空,以便用户重新输入密码。
button2的作用是关闭当前对话框不做任何操作,命令为:this.Close()。
这样加密密钥窗口窗口就设计好了。
3.解密密钥界面设计
解密密钥界面的设计与加密密钥界面的设计过程都是一样的,同样Form3由两个标签:label1、label2,分别命名为输入密码、确认密码;两个文本框:textBox1、textBox2,
用于用户输入密码(密码以*的形式显示出来);两个按键:button1、button2(分别为确认、取消)。
在Form2开始设一个全局变量mm2,当单击确定按钮时对textBox1和textBox2中的内容进行判断,如果两个文本框中输入的值相同,则把textBox2中的值赋给mm2,提示“解密成功”,并关闭此Form2。
如果textBox1与textBox2中的值不同则提示“密码不同,请重新输入!”,并把textBox1与textBox2中的值清空,以便用户重新输入密码。
button2的作用是关闭当前对话框不做任何操作,命令为:this.Close()。
2.4程序实现
2.4.1源码分析
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class encrypt extends Frame implements ActionListener {
private MenuBar menubar;
private Menu menu1, menu2,menu3, menu4;
private MenuItem menuitem1,menuitem1_1,
menuitem2,menuitem2_2,menuitem3,menuitem22,menuitem22_2,menuitem4;
private static JTextArea txtarea;
private MenuShortcut ms1, ms2, ms3, ms4;File f;
encrypt() {
super("本程序:加密解密程序");
txtarea = new JTextArea();
menubar = new MenuBar();
menu1 = new Menu("文件");
menuitem1 = new MenuItem("打开");
menuitem1_1 = new MenuItem("保存");
ms1 = new MenuShortcut(KeyEvent.VK_N);
menuitem1.addActionListener(this);
menuitem1_1.addActionListener(this);
menu1.add(menuitem1);
menu1.add(menuitem1_1);
menu2 = new Menu("保护");
menuitem2 = new MenuItem("二进制加密");
menuitem2_2 = new MenuItem("二进制解密");
menuitem22 = new MenuItem("十六进制加密");
menuitem22_2 = new MenuItem("十六进制解密");
menuitem2.addActionListener(this);
ms2 = new MenuShortcut(KeyEvent.VK_A);
menuitem2_2.addActionListener(this);
menu2.add(menuitem2);
menu2.add(menuitem2_2);
menu2.add(menuitem22);
menu2.add(menuitem22_2);
menu3 = new Menu("编辑");
menuitem3 = new MenuItem("清空");
menu3.add(menuitem3);
menuitem3.addActionListener(this);
menuitem22.addActionListener(this);
menuitem22_2.addActionListener(this);
menu4 = new Menu("帮助");
menuitem4 = new MenuItem("关于");
ms4 = new MenuShortcut(KeyEvent.VK_H);
menuitem4.addActionListener(this);
menu4.add(menuitem4);
menubar.add(menu1);
menubar.add(menu2);
menubar.add(menu3);
menubar.add(menu4);
setMenuBar(menubar);
setLayout(new BorderLayout());
add(new JScrollPane(txtarea), BorderLayout.CENTER);
txtarea.setLineWrap(true);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setSize(900, 600);
setVisible(true);
validate();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == menuitem1) {
try{
file();
qu();
}catch(Exception ee){};
}else if (e.getSource() == menuitem1_1) {
try{
file();
shuchu();
}catch(Exception ee){};
} else if (e.getSource() == menuitem2) {
txtarea.setText(fen(encode(txtarea.getText())));
} else if (e.getSource() == menuitem2_2) {
System.out.println(1);
String string=he(txtarea.getText());
if(!string.equals("")){
txtarea.setText(decode(string));
}
} else if (e.getSource() == menuitem22) {
txtarea.setText(encode(txtarea.getText()));
}else if (e.getSource() == menuitem22_2) {
if(!decode(txtarea.getText()).equals("")){
txtarea.setText(decode(txtarea.getText()));
}
}else if (e.getSource() == menuitem3) {
txtarea.setText("");
}else if (e.getSource() == menuitem4) {
txtarea.setText("本程序: \n加密解密多少次随自己愿意..只要你记得解密步骤..");
}
}
public static void main(String[] args) {
new encrypt();
}
public void file(){
JFileChooser fileChooser = new JFileChooser(); // 实例化文件选择器fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); // 设置文件选择模式,此处为文件和目录均可
if (fileChooser.showOpenDialog(encrypt.this) == JFileChooser.APPROVE_OPTION) { // 弹出文件选择器,并判断是否点击了打开按钮 String fileName = fileChooser.getSelectedFile().getAbsolutePath(); // 得到选择文件或目录的绝对路径
f=new File(fileName);
}
}
private static String hexString = "123456789ABCDEF";
private static String decode(String theHex) {
String theRst = "";
byte[] theByte = new byte[theHex.length() / 2];
try {
for (int i = 0; i < theHex.length(); i += 2) {
eByte[i / 2 ] = Integer.decode("0X"+
theHex.substring(i, i + 2)).byteValue();
}
theRst = new String(theByte, 0, theByte.length );
} catch (Exception Ue) {
JOptionPane.showMessageDialog(null, "无法继续解密") ;
}
return theRst;
}
private static String encode(String theStr) {
byte[] bytes;
String result = "";
int tmp;
String tmpStr;
bytes = theStr.getBytes();
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] < 0) {
tmp = 256 + bytes[i];
tmpStr = Integer.toHexString(tmp).toUpperCase();
result += tmpStr;
} else {
tmpStr = Integer.toHexString(bytes[i]).toUpperCase();
result += tmpStr.length()==1?"0"+tmpStr:tmpStr;
}
}
return result;
}
public static String fen(String str) {
byte[] bytes = str.getBytes();
StringBuilder sb = new StringBuilder();
String ss = "";
String quanbu = "";
for (int i = 0; i < bytes.length; i++) {
char count = (char) bytes[i];
ss = Integer.toBinaryString(Integer.parseInt(Integer.valueOf( count + "", 16).toString()));
while (ss.length() != 4) {
ss = 0 + ss;
}
quanbu += ss;
}
return quanbu;
}
public static String he(String str) {
String ur = "";
try{
if(str.length()>=4){
for (int i = 0; i < str.length()/4; i++) {
System.out.println(4);
String s=Integer.valueOf(str.substring((4*(i+1))-4,4*(i+1)),2).toString();
System.out.println(5);
ur+=Integer.toHexString(Integer.parseInt(s));
}
}else{
throw new Exception();
}
}catch(Exception e){
JOptionPane.showMessageDialog(null, "无法继续解密") ;
}
return ur.toUpperCase();
}
public void shuchu() {
try {
FileOutputStream out = new FileOutputStream(f);
byte buf[] = txtarea.getText().getBytes();
try {
out.write(buf);
out.flush();
out.close();
} catch (IOException e) {
// e.printStackTrace();
}
} catch (FileNotFoundException e) {
// e.printStackTrace();
}
}
public void qu() {
try {
FileInputStream in = new FileInputStream(f);
int a = (int) f.length();
byte buf[] = new byte[a];
try {
int len = in.read(buf);
if (len == -1)
System.out.println("文件为空");
else
txtarea.setText(new String(buf, 0, len));
} catch (IOException e) {
// e.printStackTrace();
}
} catch (FileNotFoundException e) {
// e.printStackTrace();
}
}
}
2.4.2程序运行情况
通过对文件的加密,可得到程序运行结果如图2.1所示。
图 2.1 程序运行结果
通过运行解密,可得到程序运行过程图如图2.3所示。
图 2.2 程序运行过程
通过打开文件,,可得到程序打开文件如图2.3所示。
图 2.3 程序打开文件
2.4.3程序异常处理
运行过程中,当程序运行到把它保存到key.txt中时,将抛出一个Key类的异常
对象,然后使用try-catch 去捕捉这个异常。
try {
new Key("key.txt");
} catch (Exception e) {
e.printStackTrace();
}
}
当解密运行过程中,将抛出一个Key类的异常对象,然后使用try-catch 去捕捉这个异常。
try{
if(str.length()>=4){
for (int i = 0; i < str.length()/4; i++) {
System.out.println(4);
String s=Integer.valueOf(str.substring((4*(i+1))-4,4*(i+1)),2).toString(); System.out.println(5);
ur+=Integer.toHexString(Integer.parseInt(s));
}
}else{
throw new Exception();
}
}catch(Exception e){
JOptionPane.showMessageDialog(null, "无法继续解密") ;
}
当保存过程中,将抛出一个Key类的异常对象,然后使用try-catch 去捕捉这个异常。
try {
int len = in.read(buf);
if (len == -1)
System.out.println("文件为空");
else
txtarea.setText(new String(buf, 0, len));
} catch (IOException e) {
// e.printStackTrace();
}
第3章课程设计总结
每一次当学完一种计算机语言后都有一次自己设计的机会,这个学期的java也不例外,虽然说我学的不太理想,但对于这次课设我还是很努力的去琢磨,查找,请教每一个更懂的人,只为了能很好的完成这次课设而奋斗!
社会是在进步的,而科学更是在飞速发展,对于生活在信息时代的人们已经。
计算机技术和网络技术深入到社会的各个领域,因特网把“地球村”的居民紧密地连在一起。
如果说“天涯若比邻”在过去只是描写人们的心灵上的贴近,那么今天计算机网络已使这句话变成了生活现实。
说起来每个人都会有一些不乐意被人知道的隐私,比如工作计划、个人信息等等,为了保护这些秘密,加密软件便成了许多人的首选。
利用密码对各类电子信息进行加密,以保证信息在处理、存贮、传送和交换过程中不致泄露。
这是迄今为止对电子信息实施保护和保证信息安全的有效措施之一。
信息加密技术在保障计算机系统的安全中占有重要的地位。
古往今来,通信中的安全保密问题一直受到广泛关注。
历史上,交战双方在通信安全、保密和密码破译方面的优势均被认为是取得战争胜利的关键因素之一。
而今,人类已进入信息化时代,现代通信涉及各行各业,信息安全已成为人人都关心的事情,这就促使密码学揭去了神秘的面纱,为更广泛的领域和大众服务。
然而,凡事“有一利必有一弊”。
人们在得益于信息革命所带来的新的巨大机遇的同时,也不得不面对信息安全问题的严峻考验。
如果我们的网络中缺少最起码的安全手段,自由又从何谈起呢?因此加密作为网络系统安全的重要手段之一,被业界广泛认可并采用。
而一旦忘记了密码怎么办?当然我们可以通过解除信息密码的方法来解决难题。
所以能不能熟练的掌握网络加密和解密技术对于用户的网络安全来说——可是至关重要的。
在这次的课设设计中我学到了很多,不仅仅是对加密解密的理解的更近一步加深,更是对Java的更深层次的最求,在一次次的天明与深夜的来临我在电脑旁的苦思是我对课设的付出,不过最后的结果还是很令我欣喜的毕竟我做出来了,毕竟我的努力得到了结果。
最后我深深地谢谢老师和同学在我遇到问题时的细心指导。
没有你们的鼓励和教导我是不会这么轻易做出来的,谢谢了!
参考资料
1.吴仪 JAVA大学实用教程电子工业出版社 2005-03
2.杨义 JAVA大学实用教程实验指导航空工业出版社 2005-03 3程流 JAVA2技术机械工业出版社 2003-06
4.建辉 Java实例技术手册中国电力出版社 2001-11
5.杨明 Java程序设计与应用开发清华大学出版社 2005-03
6.徐廖 Java应用与开发案例教程清华大学出版社 2005-07
7.赵雨 Java程序设计主题辽宁大学出版社 2004-03
8.冥羽 JAVA大学实用教程沈阳工业出版社 2005-03
9.桦强 JAVA大学实用教程实验指导电子工业出版社 2005-03
10.杨峰 JAVA2核心技术清华大学出版社 2003-06
11.孙宁 Java编程案例精讲电子工业出版社 2005-01
12. 铭夏 Java项目开发实践中国铁道出版社 2005-05。