java 文件加密解密

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
/**
 * 文件加密、解密
 * @author admin_Hzw
 *
 */
public class FileEncryptAndDecrypt {
	/**
	 * 文件file进行加密
	 * @param fileUrl 文件路径
	 * @param key 密码
	 * @throws Exception
	 */
	public static void encrypt(String fileUrl, String key) throws Exception {
		File file = new File(fileUrl);
		String path = file.getPath();
		if(!file.exists()){
			return;
		}
		int index = path.lastIndexOf("\\");
		String destFile = path.substring(0, index)+"\\"+"abc";
		File dest = new File(destFile);
		InputStream in = new FileInputStream(fileUrl);
		OutputStream out = new FileOutputStream(destFile);
		byte[] buffer = new byte[1024];
		int r;
		byte[] buffer2=new byte[1024];
		while (( r= in.read(buffer)) > 0) {
			for(int i=0;i<r;i++)
			{
				byte b=buffer[i];
				buffer2[i]=b==255?0:++b;
			}
			out.write(buffer2, 0, r);
			out.flush();
		}
		in.close();
		out.close();
		file.delete();
		dest.renameTo(new File(fileUrl));
		appendMethodA(fileUrl, key);
		System.out.println("加密成功");
	}

	/**
	 * 
	 * @param fileName
	 * @param content 密钥
	 */
	public static void appendMethodA(String fileName, String content) {
		try {
			// 打开一个随机访问文件流,按读写方式
			RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
			// 文件长度,字节数
			long fileLength = randomFile.length();
			//将写文件指针移到文件尾。
			randomFile.seek(fileLength);
			randomFile.writeBytes(content);
			randomFile.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 解密
	 * @param fileUrl 源文件
	 * @param tempUrl 临时文件
	 * @param ketLength 密码长度
	 * @return
	 * @throws Exception
	 */
	public static String decrypt(String fileUrl, String tempUrl, int keyLength) throws Exception{
		File file = new File(fileUrl);
		if (!file.exists()) {
			return null;
		}
		File dest = new File(tempUrl);
		if (!dest.getParentFile().exists()) {
			dest.getParentFile().mkdirs();
		}

		InputStream is = new FileInputStream(fileUrl);
		OutputStream out = new FileOutputStream(tempUrl);

		byte[] buffer = new byte[1024];
		byte[] buffer2=new byte[1024];
		byte bMax=(byte)255;
		long size = file.length() - keyLength;
		int mod = (int) (size%1024);
		int div = (int) (size>>10);
		int count = mod==0?div:(div+1);
		int k = 1, r;
		while ((k <= count && ( r = is.read(buffer)) > 0)) {
			if(mod != 0 && k==count) {
				r =  mod;
			}

			for(int i = 0;i < r;i++)
			{
				byte b=buffer[i];
				buffer2[i]=b==0?bMax:--b;
			}
			out.write(buffer2, 0, r);
			k++;
		}
		out.close();
		is.close();
		return tempUrl;
	}

	/**
	 * 判断文件是否加密
	 * @param fileName
	 * @return
	 */
	public static String readFileLastByte(String fileName, int keyLength) {
		File file = new File(fileName);
		if(!file.exists())return null;
		StringBuffer str = new StringBuffer();
		try {
			// 打开一个随机访问文件流,按读写方式
			RandomAccessFile randomFile = new RandomAccessFile(fileName, "r");
			// 文件长度,字节数
			long fileLength = randomFile.length();
			//将写文件指针移到文件尾。
			for(int i = keyLength ; i>=1 ; i--){
				randomFile.seek(fileLength-i);
				str.append((char)randomFile.read());
			}
			randomFile.close();
			return str.toString();
		} catch (IOException e) {
			e.printStackTrace();  
		}  
		return null;
	}
	public static void main(String[] args) throws Exception {
		String path = "D:/temp";  
		encrypt(path+"/ipconfig.txt","mimimamamima99188");  //加密  
		decrypt(path+"/ipconfig.txt","D:/temp/decrypt.txt","mimimamamima99188".length());//解密
	}    
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BUG胡汉三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值