Java 文件加密传输与解密算法终极产品版(三)
在开始码字前先把产品的截图摆上:
这个文件处理的实现具备的功能有:文件读取,文件写入,文件复制,文件加密以及文件解密。
其实在平时文件加密的操作中,我们可以简单的通过修改文件的后缀名来改变文件的打开方式,也就是常说的:“一定是我打开的方式不对。。。”,但是这样的操作方法就比较low(低端)。
所以下面我们来一些比较高大上的。
整个实例的难点应该还是在于文件的加密以及解密,对于PC里的一些不想为人知的文件往往需要加密处理。通过对文件输入流的方法调用得到文件的字节流:
FileInputStream fis = new FileInputStream(from); int n = fis.read();
然后在调用文件输出流方法时对读取到的字节流进行一定的按特定意愿的处理后并输出:
//循环写入 while(n!=-1){//加密算法,可行定义,与解密算法相逆 if(day%height*n != 1){ fos.write(n+height); //day和height为密码 }else{ fos.write(n); } n=fis.read(); }
这样就可以在文件输出时出现字节流的“误差”,原文本被“错乱”的解码方式所还原,便会生成乱码或者一堆看不懂的文件。其中的参数day和height是密码和校验码,可以是生日和身高的整型数据组合。
加密和解密的方法:
/** * 文件加密传输的方法 * @param from原文件(带绝对路径) * @param to复制后文件(带绝对路径) * @throws Exception抛出异常 */ public void JiaMi(String from,String to,int day,int height) throws Exception{ FileInputStream fis = new FileInputStream(from); FileOutputStream fos = new FileOutputStream(to,false); int n = fis.read(); int count=0; //循环写入 while(n!=-1){//加密算法,可行定义,与解密算法相逆 if(day%height*n != 1){ fos.write(n+height); }else{ fos.write(n); } n=fis.read(); } fis.close(); fos.close(); } /** * 文件解密接收的方法 * @param from原文件(带绝对路径) * @param to复制后文件(带绝对路径) * @throws Exception抛出异常 */ public void JieMi(String from,String to,int day,int height) throws Exception{ FileInputStream fis = new FileInputStream(from); FileOutputStream fos = new FileOutputStream(to,false); int n = fis.read(); //循环写入 while(n!=-1){//解密算法,可行定义,与解密算法相逆 if(day%height*n != 1){ fos.write(n-height); }else{ fos.write(n); } n=fis.read(); } //关闭输入输出流 fis.close(); fos.close(); }
下面上产品实例代码:
UI类:
package czj_javaIO; import java.awt.FlowLayout; import java.awt.Font; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class MainUI extends JFrame{ public static void main(String[] args) { MainUI mu = new MainUI(); mu.init(); } /** * 初始化界面的方法 */ private void init() { this.setTitle("文件处理"); this.setSize(395, 850); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(3); this.setLayout(new FlowLayout()); this.setResizable(false); addBackground(); JLabel j1 = new JLabel(" 文件名 : "); JTextArea jp1 = new JTextArea(2, 30); jp1.setText("测试用文件.txt"); JLabel j2 = new JLabel("文件绝对路径:"); JTextArea jp2 = new JTextArea(2, 30); jp2.setText("E://"); JLabel j3 = new JLabel(" 内容 : "); JTextArea jp3 = new JTextArea(5, 30); jp3.setText("这是测试文件的具体内容。"); this.add(j1); this.add(jp1); this.add(j2); this.add(jp2); this.add(j3); this.add(jp3); JButton jb_write = new JButton("写入文件"); jb_write.setBorderPainted(false); jb_write.setFocusable(false); this.add(jb_write); JButton jb_read = new JButton("读取文件"); jb_read.setBorderPainted(false); jb_read.setFocusable(false); this.add(jb_read); JLabel j4 = new JLabel("(必须已有该文件)"); this.add(j4); JLabel jfore = new JLabel(" 文件原地址 :"); JTextArea jtfore = new JTextArea(2, 30); jtfore.setText("E://测试用文件.txt"); this.add(jfore); this.add(jtfore); JLabel jafter = new JLabel("文件目标地址:"); JTextArea jtafter = new JTextArea(2, 30); jtafter.setText("D://复制过来的测试用文件.txt"); this.add(jafter); this.add(jtafter); JButton jb_copy = new JButton(" 复 制 文 件 "); jb_copy.setBorderPainted(false); jb_copy.setFocusable(false); this.add(jb_copy); JLabel jjiami = new JLabel("***************************要加密的文件目标地址 : "); JTextArea jtjiami = new JTextArea(2, 30); jtjiami.setText("E://测试用文件.txt"); this.add(jjiami); this.add(jtjiami); JLabel jjiaafter = new JLabel("***************************加密后的文件目标地址 : "); JTextArea jtjiaafter = new JTextArea(2, 30); jtjiaafter.setText("D://加密后的测试用文件.txt"); this.add(jjiaafter); this.add(jtjiaafter); JLabel jiami = new JLabel("加密密码:"); this.add(jiami); //设置加密密码 JTextArea jtdayjia = new JTextArea(2,6); jtdayjia.setText("19940805"); this.add(jtdayjia); //校验码 JTextArea jtheightjia = new JTextArea(2, 4); jtheightjia.setText("185"); this.add(jtheightjia); JButton jb_jiami = new JButton(" 文 件 加 密 "); jb_jiami.setBorderPainted(false); jb_jiami.setFocusable(false); this.add(jb_jiami); JLabel jjiemi = new JLabel("***************************要解密的文件目标地址 : "); JTextArea jtjiemi = new JTextArea(2, 30); jtjiemi.setText("D://加密后的测试用文件.txt"); this.add(jjiemi); this.add(jtjiemi); JLabel jjieafter = new JLabel("***************************解密后的文件目标地址 : "); JTextArea jtjieafter = new JTextArea(2, 30); jtjieafter.setText("E://解密后的测试用文件.txt"); this.add(jjieafter); this.add(jtjieafter); JLabel jiemi = new JLabel("解密密码:"); this.add(jiemi); //设置解密密码 JTextArea jtdayjie = new JTextArea(2, 6); jtdayjie.setText("19940805"); this.add(jtdayjie); //校验码 JTextArea jtheightjie = new JTextArea(2, 4); jtheightjie.setText("185"); this.add(jtheightjie); JButton jb_jiemi = new JButton(" 文 件 解 密 "); jb_jiemi.setBorderPainted(false); jb_jiemi.setFocusable(false); this.add(jb_jiemi); //用以反馈当前文件处理状态 JLabel now = new JLabel(); this.add(now); //给按钮添加监听器 MainIOListener il = new MainIOListener(jp1,jp2,jp3,jtfore,jtafter,jtjiami,jtjiaafter,jtjiemi,jtjieafter,jtdayjia, jtheightjia,jtdayjie,jtheightjie,now); jb_write.addActionListener(il); jb_read.addActionListener(il); jb_copy.addActionListener(il); jb_jiami.addActionListener(il); jb_jiemi.addActionListener(il); this.setVisible(true); } /** * 添加背景的方法 */ private void addBackground(){ ImageIcon image=new ImageIcon(this.getClass().getResource("123.jpg")); JLabel jlaImage=new JLabel(image); jlaImage.setBounds(0, -35, image.getIconWidth(), image.getIconHeight()); this.getLayeredPane().add(jlaImage,new Integer(Integer.MIN_VALUE)); JPanel contentpane=(JPanel)this.getContentPane(); contentpane.setOpaque(false); } }
监听器类:
package czj_javaIO; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JLabel; import javax.swing.JTextArea; public class MainIOListener implements ActionListener{ private JTextArea jp1,jp2,jp3,jtfore,jtafter,jtjiami,jtjiaafter,jtjiemi,jtjieafter; private int jtdayjia,jtheightjia,jtdayjie,jtheightjie; private JLabel now; public MainIOListener(JTextArea jp1, JTextArea jp2, JTextArea jp3, JTextArea jtfore, JTextArea jtafter, JTextArea jtjiami, JTextArea jtjiaafter, JTextArea jtjiemi, JTextArea jtjieafter,JTextArea jtdayjia, JTextArea jtheightjia,JTextArea jtdayjie,JTextArea jtheightjie,JLabel now) { this.jp1 = jp1; this.jp2 = jp2; this.jp3 = jp3; this.jtfore = jtfore; this.jtafter =jtafter; this.jtjiami = jtjiami; this.jtjiaafter = jtjiaafter; this.jtjiemi = jtjiemi; this.jtjieafter = jtjieafter; //String装换为int this.jtdayjia = Integer.parseInt(jtdayjia.getText()); this.jtdayjie =Integer.parseInt(jtdayjie.getText()); this.jtheightjia = Integer.parseInt(jtheightjia.getText()); this.jtheightjie = Integer.parseInt(jtheightjie.getText()); this.now = now; } @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("写入文件")){ JavaIO jio = new JavaIO(); try { jio.writeFile(jp3.getText(),jp2.getText()+jp1.getText()); now.setText("文件已写入"); } catch (Exception e1) { e1.printStackTrace(); } }else if(e.getActionCommand().equals("读取文件")){ JavaIO jio = new JavaIO(); jio.readFile(jp2.getText()+jp1.getText()); now.setText("文件已读取"); }else if(e.getActionCommand().equals(" 复 制 文 件 ")){ JavaIO jio = new JavaIO(); try { jio.copy(jtfore.getText(), jtafter.getText()); now.setText("文件已复制"); } catch (Exception e1) { e1.printStackTrace(); } }else if(e.getActionCommand().equals(" 文 件 加 密 ")){ JavaIO jio = new JavaIO(); try { jio.JiaMi(jtjiami.getText(), jtjiaafter.getText(),jtdayjia,jtheightjia); now.setText("文件已加密"); } catch (Exception e1) { e1.printStackTrace(); } }else if(e.getActionCommand().equals(" 文 件 解 密 ")){ JavaIO jio = new JavaIO(); try { jio.JieMi(jtjiemi.getText(), jtjieafter.getText(),jtdayjie,jtheightjie); now.setText("文件已解密"); } catch (Exception e1) { e1.printStackTrace(); } } } }
主要实现方法类:
package czj_javaIO; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; public class JavaIO { private File currentFile; public static void main(String[] args) throws Exception { JavaIO ja = new JavaIO(); ja.findFiles("E:/"); // ja.readFile("E://类与对象总结.txt"); // ja.writeFile("这是写入文件的内容。","E://类与对象总结11.txt"); // ja.JiaMi("E://类与对象总结.txt", "D://加密后的类与对象总结.png"); // ja.JieMi("D://加密后的类与对象总结.png","E://解密后类与对象总结.txt" ); // ja.copy("E://类与对象总结.txt", "E://类与对象总结的复制文件.txt"); } /** * 查找文件 * @param 查找目录 */ public void findFiles(String s){ File file = new File(s); File[] f = file.listFiles(); // System.out.println(f); for(int i = 0;i<f.length;i++){ currentFile = f[i]; if(currentFile.isDirectory()){ findFiles(currentFile.getAbsolutePath()); } if(currentFile.getName().endsWith("txt")) System.out.println(currentFile); } } /** * 读取文件 * @param s文件名(带绝对路径) */ public void readFile(String s){ try { FileInputStream fis = new FileInputStream(s); int n=fis.read(); while(n!=-1){ System.out.println("字节:"+n); n = fis.read(); } fis.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 写文件的方法 * @param msg写入的内容 * @param s文件绝对路径 * @throws Exception抛出异常 */ public void writeFile(String msg,String s) throws Exception{ try { FileOutputStream fos = new FileOutputStream(s,false); byte[] b = msg.getBytes();//得到组成字符串的字节 fos.write(b); fos.close();//关闭输出流 } catch (FileNotFoundException e) { e.printStackTrace(); } } /** * 复制文件 * @param from原文件(带绝对路径) * @param to 复制后文件(带绝对路径) * @throws Exception */ public void copy(String from,String to) throws Exception{ FileInputStream fis = new FileInputStream(from); FileOutputStream fos = new FileOutputStream(to,false); int n = fis.read(); //循环写入 while(n!=-1){ fos.write(n); n=fis.read(); } //关闭输入输出流 fis.close(); fos.close(); } /** * 文件加密传输的方法 * @param from原文件(带绝对路径) * @param to复制后文件(带绝对路径) * @throws Exception抛出异常 */ public void JiaMi(String from,String to,int day,int height) throws Exception{ FileInputStream fis = new FileInputStream(from); FileOutputStream fos = new FileOutputStream(to,false); int n = fis.read(); int count=0; //循环写入 while(n!=-1){//加密算法,可行定义,与解密算法相逆 if(day%height*n != 1){ fos.write(n+height); }else{ fos.write(n); } n=fis.read(); } fis.close(); fos.close(); } /** * 文件解密接收的方法 * @param from原文件(带绝对路径) * @param to复制后文件(带绝对路径) * @throws Exception抛出异常 */ public void JieMi(String from,String to,int day,int height) throws Exception{ FileInputStream fis = new FileInputStream(from); FileOutputStream fos = new FileOutputStream(to,false); int n = fis.read(); //循环写入 while(n!=-1){//解密算法,可行定义,与解密算法相逆 if(day%height*n != 1){ fos.write(n-height); }else{ fos.write(n); } n=fis.read(); } //关闭输入输出流 fis.close(); fos.close(); } }
在测试时需要注意的是必须先写入文件,否则后面的操作都将因为找不到对象而报这样的错:java.io.FileNotFoundException: E:\测试用文件.txt (系统找不到指定的文件。)
总体来说代码量还是不少的,监听器类的构建主要还是涉及到许多参数的传递会比较麻烦。UI类在布局的调整上下了很大的功夫。。。
加解密文件的方法里的算法可以根据自己的设定进行修改哦。
梣梓cenzi
2015-05-09