文件加密是建立在文件复制的基础之上,说白了就是将一个文件复制过去,期间加上一些干扰信息,致使文件发生改变,来达到文件加密的效果.
文件解密是根据文件相应的加密,来进行解密.
本次加密是比较简层次的加密,用到了java中字节流,io字节流
io字节流,写的时候需要一个数组,假如这个字节数组大小是100.
复制文件,先读文件,再写文件,我读的时候调用read(byte[] b)方法,可以使用read(byte[] b,st,end);这里假设读进去是20-30.
st代表从数组的第st个写end个字节.
数组剩下的部分我用-128-127的随机数填进去
写的时候把整个数组写进去,到最后如果读出来不够100个,就直接写read(byte[] b,0,len),len代表读的有效字节数.
文件解密:
解密是每次读100个,读的时被加密的文件.
但是写的时候不能全写,因为其中只有20-30是有效的字节,以及最后一行的所有事有效的
因此解密就是写的时候只写20-30.到最后一行,不满100的就全写,因为我加密的时候最后一行如果不满100,我是全读出来的.
附上代码:
package com.info.test.jiami;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
public class MyEncryption {
private static int start= 20;
private static int size= 100;
private static int stlen= 30;
public static void main(String[] args) {
/* 源文件 */
String path = "F:\\test2\\1.png";
/* 加密文件 */
String path2 = "F:\\test2\\2.png";
/* 解密文件 */
String path3 = "F:\\test2\\3.png";
File file = new File(path);
File file2 = new File(path2);
File file3 = new File(path3);
/* 文件加密 */
// Encry(file, file2);
/* 文件解密 */
Decrypt(file2,file3);
}
/**
* 文件解密
* @param f1
* @param f2
*/
private static void Decrypt(File f1, File f2) {
FileInputStream fis = null;
BufferedInputStream bis = null;
int count = 0;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
/* 准备了一个字节数组,将文件读到数组中,读一次,写一次,直到读完 */
byte[] b = new byte[size];
int len = 0;
try {
fis = new FileInputStream(f1);
bis = new BufferedInputStream(fis);
fos = new FileOutputStream(f2);
bos = new BufferedOutputStream(fos);
while((len = bis.read(b))!=-1){
System.out.println(count + "--->" + len + "--->" + Arrays.toString(b));
if(len==size) {
/* 长度是满的时候就写中间的 */
bos.write(b,start,stlen);
}else {
/* 最后一行全写 */
bos.write(b,0,len);
}
count++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (bis != null) {
bis.close();
bis = null;
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bos != null) {
bos.close();
bos = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 文件加密
* @param f1
* @param f2
*/
private static void Encry(File f1, File f2) {
// TODO Auto-generated method stub
FileInputStream fis = null;
BufferedInputStream bis = null;
int count = 0;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
byte[] b = new byte[size];
int len = 0;
try {
fis = new FileInputStream(f1);
bis = new BufferedInputStream(fis);
fos = new FileOutputStream(f2);
bos = new BufferedOutputStream(fos);
while ((len = bis.read(b, start, stlen)) != -1) {
System.out.println(count + "--->" + len + "--->" + Arrays.toString(b));
for (int i = 0; i < start; i++) {
Random random = new Random();
b[i]= (byte) (random.nextInt(256)-128);
}
for (int i = len+start+1; i < size; i++) {
Random random = new Random();
/* 将产生的随机数加到数组中,构成干扰信息 */
b[i]= (byte) (random.nextInt(256)-128);
}
if (len == stlen) {
bos.write(b, 0, size);
} else {
bos.write(b, start, len);
}
count++;
}
bos.flush();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bis != null) {
bis.close();
bis = null;
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bos != null) {
bos.close();
bos = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
前边的几个参数是我设置的全局变量,有利于修改加密的起始位置.我设置的时字节数组大小100,从20开始,往后面写30个.
用到的主要是java中的io字节流,不懂复制的可以看下我的另一篇文章,里面讲的是如何复制文件或者文件夹.