1、java 加密与加密学号2015-2016学年 第二学期1408210136面向对象程序设计课程设计报告题目:文件的加密与解密专业:计算机科学与技术班级:14级(2)班姓名:王欣指导教师:史学梅成绩:计算机学院2016年5月10日目录 1 设计内容及要求.22 总体设计.23 详细设计.34 总结.14 致谢.14 参考文献.14 源代码.141 设计内容及要求 1.1 设计要求 1.问题描述 通过编程,实现“加密与解密”功能。给定任意一个文本文件,进行加密,生成另一个文件。对加密后的文件还原。 2.基本要求 采用图形用户界面1、给定任意一个文本文件,进行加密,生成另一个文件。 2、对加密后的
2、文件还原 1.2流程图图 流程图2 总体设计利用文件的输入输出流,按字符读取文件内容,把读取的内容,注意进行处理后,在重新写入新文件,实现文件加密。用到的类:FileRead,FileWrite.添加窗体并布置面板,中间用到了,弹出对话框的事件。设计的类有,Frame,Panel,J JOptionPane。文件选择器的载入。通过为按钮添加事件监听,来实现文件选择器的触发操作。用到的类为:JFileChooser。自定义异常的种类,实现异常的灵活应用。适当的调整程序的终止点或者循环点。3 详细设计 3.1 代码分析 1 加密函数 输入: 要加密的文件,密码(由0-F组成,共48个字符,表示3个
3、8位的密码)如: AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746 其中: AD67EA2F3BE6E5AD DES密码一 D368DFE03120B5DF DES密码二 92A8FD8FEC2F0746 DES密码三 输出: 对输入的文件加密后,保存到同一文件夹下增加了.tdes扩展名的文件中。 代码:public static void main(String args) FileEncrypter fe = new FileEncrypter(); fe.show(); FileEncrypterT() this.setSize(WIDTH
4、,HEIGHT); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); Toolkit tk = Toolkit.getDefaultToolkit(); Dimension screenSize = tk.getScreenSize(); this.setLocation(screenSize.width - WIDTH)/2, (screenSize.height - HEIGHT)/2); this.setTitle(文件加密器(TriDES); Container c = this
5、.getContentPane(); c.setLayout( new FlowLayout(); final 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
6、 File(fp.getFileName(); if (file.exists() encrypt(file.getAbsoluteFile(),pp.getKey(); else JOptionPane.showMessageDialog( null,请选择文件!,提示,JOptionPane.OK_OPTION); ); JButton jbD = new JButton(解密); c.add(jbD); jbD.addActionListener(new ActionListener() public void actionPerformed(ActionEvent event) Fil
7、e file = new File(fp.getFileName(); if (file.exists() decrypt(file.getAbsoluteFile(),pp.getKey(); else JOptionPane.showMessageDialog( null,请选择文件!,提示,JOptionPane.OK_OPTION); );private void encrypt(File fileIn,String sKey) try if(sKey.length() = 48) byte bytK1 = getKeyByStr(sKey.substring(0,16); byte
8、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;ifileIn.length();i+) bytIni = (byte)fis.read(); /加密 byte bytOut = encryptByDES(encryptByDES( encryptB
9、yDES(bytIn,bytK1),bytK2),bytK3); String fileOut = fileIn.getPath() + .tdes; FileOutputStream fos = new FileOutputStream(fileOut); for(int i = 0;ibytOut.length;i+) fos.write(int)bytOuti); fos.close(); JOptionPane.showMessageDialog( this,加密成功!,提示,JOptionPane.OK_OPTION); else JOptionPane.showMessageDia
10、log( this,密码长度必须等于48!,错误信息,JOptionPane.ERROR_MESSAGE); catch(Exception e) e.printStackTrace(); 2 解密函数 输入: 要解密的文件,密码(由0-F组成,共48个字符,表示3个8位的密码)如: AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746 其中: AD67EA2F3BE6E5AD DES密码一 D368DFE03120B5DF DES密码二 92A8FD8FEC2F0746 DES密码三 输出: 对输入的文件解密后,保存到用户指定的文件中。代码:pri
11、vate void decrypt(File fileIn,String sKey) try if(sKey.length() = 48) String strPath = fileIn.getPath(); if(strPath.substring(strPath.length()-5).toLowerCase().equals(.tdes) strPath = strPath.substring(0,strPath.length()-5); else JOptionPane.showMessageDialog( this,不是合法的加密文件!,提示,JOptionPane.OK_OPTIO
12、N); return; JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new File(.); chooser.setSelectedFile(new File(strPath);/用户指定要保存的文件 int ret = chooser.showSaveDialog(this); if(ret=JFileChooser.APPROVE_OPTION) byte bytK1 = getKeyByStr(sKey.substring(0,16); byte bytK2 = getKeyByStr(sK
13、ey.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;ifileIn.length();i+) bytIni = (byte)fis.read(); /解密 byte bytOut = decryptByDES(decryptByDES( decryptByDES(bytIn,bytK3),bytK
14、2),bytK1); File fileOut = chooser.getSelectedFile(); fileOut.createNewFile(); FileOutputStream fos = new FileOutputStream(fileOut); for(int i = 0;ibytOut.length;i+) fos.write(int)bytOuti); fos.close(); JOptionPane.showMessageDialog( this,解密成功!,提示,JOptionPane.OK_OPTION); else JOptionPane.showMessageD
15、ialog( this,密码长度必须等于48!,错误信息,JOptionPane.ERROR_MESSAGE); catch(Exception e) JOptionPane.showMessageDialog( this,解密失败,请核对密码!,提示,JOptionPane.OK_OPTION); 3 用DES方法加密输入的字节 bytKey需为8字节长,是加密的密码代码:private byte encryptByDES(byte bytP,byte bytKey) throws Exception DESKeySpec desKS = new DESKeySpec(bytKey); Se
16、cretKeyFactory skf = SecretKeyFactory.getInstance(DES); SecretKey sk = skf.generateSecret(desKS); Cipher cip = Cipher.getInstance(DES); cip.init(Cipher.ENCRYPT_MODE,sk); return cip.doFinal(bytP); 4 用DES方法解密输入的字节 bytKey需为8字节长,是解密的密码代码:private byte decryptByDES(byte bytE,byte bytKey) throws Exception
17、DESKeySpec desKS = new DESKeySpec(bytKey); SecretKeyFactory skf = SecretKeyFactory.getInstance(DES); SecretKey sk = skf.generateSecret(desKS); Cipher cip = Cipher.getInstance(DES); cip.init(Cipher.DECRYPT_MODE,sk); return cip.doFinal(bytE); 5 输入密码的字符形式,返回字节数组形式。 如输入字符串:AD67EA2F3BE6E5AD 返回字节数组:173,10
18、3,234,47,59,230,229,173代码: private byte getKeyByStr(String str) byte bRet = new bytestr.length()/2; for(int i=0;istr.length()/2;i+) Integer itg = new Integer(16*getChrInt(str.charAt(2*i) + getChrInt(str.charAt(2*i+1); bReti = itg.byteValue(); return bRet; 6 计算一个16进制字符的10进制值 输入:0-F代码:private int getC
19、hrInt(char chr) int iRet=0; if(chr=0.charAt(0) iRet = 0; if(chr=1.charAt(0) iRet = 1; if(chr=2.charAt(0) iRet = 2; if(chr=3.charAt(0) iRet = 3; if(chr=4.charAt(0) iRet = 4; if(chr=5.charAt(0) iRet = 5; if(chr=6.charAt(0) iRet = 6; if(chr=7.charAt(0) iRet = 7; if(chr=8.charAt(0) iRet = 8; if(chr=9.ch
20、arAt(0) iRet = 9; if(chr=A.charAt(0) iRet = 10; if(chr=B.charAt(0) iRet = 11; if(chr=C.charAt(0) iRet = 12; if(chr=D.charAt(0) iRet = 13; if(chr=E.charAt(0) iRet = 14; if(chr=F.charAt(0) iRet = 15; return iRet; 7 文件选择组件代码:class FilePanel extends JPanel FilePanel(String str) JLabel label = new JLabel
21、(str); JTextField fileText = new JTextField(35); JButton chooseButton = new JButton(浏览.); this.add(label); this.add(fileText); this.add(chooseButton); clickAction ca = new clickAction(this); chooseButton.addActionListener(ca); public String getFileName() JTextField jtf = (JTextField)this.getComponen
22、t(1); return jtf.getText(); private class clickAction implements ActionListener clickAction(Component c) cmpt = c; public void actionPerformed(ActionEvent event) JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new File(.); int ret = chooser.showOpenDialog(cmpt); if(ret=JFileCh
23、ooser.APPROVE_OPTION) JPanel jp = (JPanel)cmpt; JTextField jtf = (JTextField)jp.getComponent(1); jtf.setText(chooser.getSelectedFile().getPath(); private Component cmpt; 8 密码生成组件代码:class KeyPanel extends JPanel KeyPanel(String str) JLabel label = new JLabel(str); JTextField fileText = new JTextField
24、(35); JButton chooseButton = new JButton(随机产生); this.add(label); this.add(fileText); this.add(chooseButton); clickAction ca = new clickAction(this); chooseButton.addActionListener(ca); /返回生成的密码(48个字符长度) public String getKey() JTextField jtf = (JTextField)this.getComponent(1); return jtf.getText(); p
25、rivate class clickAction implements ActionListener clickAction(Component c) cmpt = c; public void actionPerformed(ActionEvent event) try KeyGenerator kg = KeyGenerator.getInstance(DES); kg.init(56); Key ke = kg.generateKey(); byte bytK1 = ke.getEncoded(); ke = kg.generateKey(); byte bytK2 = ke.getEn
26、coded(); ke = kg.generateKey(); byte bytK3 = ke.getEncoded(); JPanel jp = (JPanel)cmpt; JTextField jtf = (JTextField)jp.getComponent(1); jtf.setText(getByteStr(bytK1)+getByteStr(bytK2)+getByteStr(bytK3); catch(Exception e) e.printStackTrace(); private String getByteStr(byte byt) String strRet = ; fo
27、r(int i=0;ibyt.length;i+)/System.out.println(byti); strRet += getHexValue(byti&240)/16); strRet += getHexValue(byti&15); return strRet; private String getHexValue(int s) String sRet=null; switch (s) case 0: sRet = 0;break; case 1: sRet = 1;break; case 2: sRet = 2;break; case 3: sRet = 3;break; case 4: sRet = 4;break; case 5: sRet = 5;break; case 6: sRet = 6;break; case 7: sRet = 7;break; case 8: sRet = 8;break; case 9: sRet = 9;break; case 10: sRet = A;break; case 11: sRet = B;break; case 12: sRet = C;break; case 13: sRet = D;break; case 14: sRet = E;break; case 15: sRet = F; return sRet;
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2