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
;
}
}