面向对象程序设计课程设计报告文档加密解密程序的设计与实现本科论文.doc
计算机学院 面向对象程序设计课程设计报告学号2015-2016学年 第二学期1308210227 面向对象程序设计课程设计报告题目:文档加密解密程序的设计与实现专业: 计算机科学与技术 班级: 13(对口)3班姓名: 指导教师: 成绩:计算机学院2016年4月23日 目 录一、设计的目的和要求21.1 课程设计目的21.2课程设计要求2二、概要设计及程序代码32.1课程设计主要内容32.2概要设计32.2.1功能分析32.2.2自定义类说明42.3.界面设计6三、设计结果与分析73.1源码分析73.2程序运行情况123.3程序异常处理14参考文献:152一、设计的目的和要求1.1 课程设计目的JAVA程序设计是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。本课程的程序设计专题实际是计算机相关专业学生学习完JAVA程序设计课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。 1.2课程设计要求按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握JAVA程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。二、 概要设计及程序代码2.1课程设计主要内容文件加密解密是科技飞速发展的中通信安全保密问题的最终结果,无论是当今还是未来计算机信息的保密问题显得越来越重要,无论是个人信息通信还是电子商务发展,都迫切需要保证Internet网上信息传输的安全,需要保证信息安全。 其中,信息安全的核心是密码技术。在这个java编写的加密解密程序中,我这个设计实现了文本编辑器的基本功能有:打开文件,文件保存,文件另存为,文件加密,文件解密,及其查找。2.2概要设计2.2.1功能分析根据系统的设计要求,设计的系统功能模块如图2-1所示。文件加密解密工具加密路径设置解密设置加密路径设置解密路径DES加密加密密DES解密密 图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 实现的接口:ActionListener3. 类名:Key 作用:主类 继承的父类: 没有 实现的接口:没有4. 类名:MessageDigestExample 作用:主类 继承的父类: 没有 实现的接口:没有表2.1 主类成员变量表成员变量描述变量类型名称初始化界面intmap初始化界面intran设置字体intwidth设置字体intheight坐标intlastx坐标intlasty拖动鼠标后坐标intlast_downx拖动鼠标后坐标intlast_downy拖动鼠标后坐标intstepx拖动鼠标后坐标intstepy选择booleanchoose数组booleanclick按下鼠标booleanm_down放开鼠标booleanm_drag放开鼠标booleannot_redraw设置字体Fontfont1表2.2 主类方法表方法名功能备注init程序的初始化initForm面板初始化mouseClicked单击鼠标时产生的事件接口方法mouseEntered鼠标进入某个区域时产生的事件接口方法mouseExited鼠标退出某个区域时产生的事件接口方法mouseMoved移动鼠标时产生的事件接口方法mouseDragged拖动鼠标时产生的事件接口方法mousePressed按下鼠标时产生的事件接口方法mouseReleased放开鼠标时产生的事件接口方法wingame程序是否结束initgame游戏初始化“以下是我找到的方法”“功能不清楚”JFileChooser实例化文件选择器构造方法serialVersionUID实例化文件选择器windowClosingactionPerformeddecode构造方法fenencodehe无法继续解密shuchuqu文件不能为空 2.3.界面设计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()。三、设计结果与分析3.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 bytetheHex.length() / 2; try for (int i = 0; i < theHex.length(); i += 2) eBytei / 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 (bytesi < 0) tmp = 256 + bytesi; tmpStr = Integer.toHexString(tmp).toUpperCase(); result += tmpStr; else tmpStr = Integer.toHexString(bytesi).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) bytesi; 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 bytea; 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(); 3.2程序运行情况通过对文件的加密,可得到程序运行结果如图2.1所示。图 2.1 程序运行结果通过运行解密,可得到程序运行过程图如图2.3所示。图 2.2 程序运行过程通过打开文件,可得到程序打开文件如图2.3所示。图 2.3 程序打开文件3.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(); 参考文献: 1.吴仪 JAVA大学实用教程 电子工业出版社 2005-03 2.杨义 JAVA大学实用教程实验指导 航空工业出版社 2005-033程流 JAVA2技术 机械工业出版社 2003-064.建辉 Java实例技术手册 中国电力出版社 2001-115.杨明 Java程序设计与应用开发 清华大学出版社 2005-036.徐廖 Java应用与开发案例教程 清华大学出版社 2005-077.赵雨 Java程序设计主题 辽宁大学出版社 2004-038.冥羽 JAVA大学实用教程 沈阳工业出版社 2005-03 9.桦强 JAVA大学实用教程实验指导 电子工业出版社 2005-0310.杨峰 JAVA2核心技术 清华大学出版社 2003-0611孙宁 Java编程案例精讲 电子工业出版社 2005-0112. 铭夏 Java项目开发实践 中国铁道出版社 2005-0515