import java.io.File;
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.RandomAccessFile;public class FileEncryptAndDecrypt { public static void main(String[] args) throws Exception { String filename = "奔马.avi"; String flag = readFileLastByte("c:\\" + filename, 6); if (flag.indexOf("hello") > 0) { // 加密过了; } else { // 没有加密 new FileEncryptAndDecrypt().encrypt("c:\\" + filename, "hello"); } System.out.println(new FileEncryptAndDecrypt().decrypt("c:\\" + filename, "c:\\" + filename, 6)); // System.out.println(readFileLastByte("c:\\3.jpg", 6)); } /** * 文件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"; System.out.println(destFile); 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; }}