1 package com.copy.encrypt; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.OutputStream; 9 import java.io.RandomAccessFile; 10 public class FileEncryptAndDecrypt { 11 /** 12 * 文件file进行加密 13 * @param fileUrl 文件路径 14 * @param key 密码 15 * @throws Exception 16 */ 17 public static void encrypt(String fileUrl, String key) throws Exception { 18 File file = new File(fileUrl); 19 String path = file.getPath(); 20 if(!file.exists()){ 21 return; 22 } 23 int index = path.lastIndexOf("\\"); 24 String destFile = path.substring(0, index)+"\\"+"abc"; 25 File dest = new File(destFile); 26 InputStream in = new FileInputStream(fileUrl); 27 OutputStream out = new FileOutputStream(destFile); 28 byte[] buffer = new byte[1024]; 29 int r; 30 byte[] buffer2=new byte[1024]; 31 while (( r= in.read(buffer)) > 0) { 32 for(int i=0;i<r;i++) 33 { 34 byte b=buffer[i]; 35 buffer2[i]=b==255?0:++b; 36 } 37 out.write(buffer2, 0, r); 38 out.flush(); 39 } 40 in.close(); 41 out.close(); 42 file.delete(); 43 dest.renameTo(new File(fileUrl)); 44 appendMethodA(fileUrl, key); 45 System.out.println("加密成功"); 46 } 47 /** 48 * 49 * @param fileName 50 * @param content 密钥 51 */ 52 public static void appendMethodA(String fileName, String content) { 53 try { 54 // 打开一个随机访问文件流,按读写方式 55 RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw"); 56 // 文件长度,字节数 57 long fileLength = randomFile.length(); 58 //将写文件指针移到文件尾。 59 randomFile.seek(fileLength); 60 randomFile.writeBytes(content); 61 randomFile.close(); 62 } catch (IOException e) { 63 e.printStackTrace(); 64 } 65 } 66 /** 67 * 解密 68 * @param fileUrl 源文件 69 * @param tempUrl 临时文件 70 * @param ketLength 密码长度 71 * @return 72 * @throws Exception 73 */ 74 public static String decrypt(String fileUrl, String tempUrl, int keyLength) throws Exception{ 75 File file = new File(fileUrl); 76 if (!file.exists()) { 77 return null; 78 } 79 File dest = new File(tempUrl); 80 if (!dest.getParentFile().exists()) { 81 dest.getParentFile().mkdirs(); 82 } 83 InputStream is = new FileInputStream(fileUrl); 84 OutputStream out = new FileOutputStream(tempUrl); 85 byte[] buffer = new byte[1024]; 86 byte[] buffer2=new byte[1024]; 87 byte bMax=(byte)255; 88 long size = file.length() - keyLength; 89 int mod = (int) (size%1024); 90 int div = (int) (size>>10); 91 int count = mod==0?div:(div+1); 92 int k = 1, r; 93 while ((k <= count && ( r = is.read(buffer)) > 0)) { 94 if(mod != 0 && k==count) { 95 r = mod; 96 } 97 for(int i = 0;i < r;i++) 98 { 99 byte b=buffer[i]; 100 buffer2[i]=b==0?bMax:--b; 101 } 102 out.write(buffer2, 0, r); 103 k++; 104 } 105 out.close(); 106 is.close(); 107 return tempUrl; 108 } 109 /** 110 * 判断文件是否加密 111 * @param fileName 112 * @return 113 */ 114 public static String readFileLastByte(String fileName, int keyLength) { 115 File file = new File(fileName); 116 if(!file.exists())return null; 117 StringBuffer str = new StringBuffer(); 118 try { 119 // 打开一个随机访问文件流,按读写方式 120 RandomAccessFile randomFile = new RandomAccessFile(fileName, "r"); 121 // 文件长度,字节数 122 long fileLength = randomFile.length(); 123 //将写文件指针移到文件尾。 124 for(int i = keyLength ; i>=1 ; i--){ 125 randomFile.seek(fileLength-i); 126 str.append((char)randomFile.read()); 127 } 128 randomFile.close(); 129 return str.toString(); 130 } catch (IOException e) { 131 e.printStackTrace(); 132 } 133 return null; 134 } 135 }
package
com.copy.encrypt;
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 {
/**
* 文件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
;
}
}
只有当你忍痛前行后,你猜能知道,所谓的痛不过尔尔!