import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 把字符串转换成十六进制的Unicode编码后保存,输出的
* 为每个字符的十六进制最后一位为前面一个字符的十六进、
* 制编码的最后一位。
* @author jzj
*/
public class Encrypt {
public static void main(String[] args) {
try {
//生成加密文件
//createEncryptFile();
//读取解密文件
System.out.println(decryptFromFile());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static StringBuffer decryptFromFile() throws FileNotFoundException, IOException {
String fileName;
StringBuffer fileContentSb;
//--读加密文件
fileName = "e:/tmp/encrypt.txt";
fileContentSb = readFile(fileName);
String fileConString = fileContentSb.toString();
Pattern p = Pattern.compile(".{4}");
Matcher m = p.matcher(fileConString);
String[] encryptArr = new String[fileConString.length() / 4];
int index = 0;
while (m.find()) {
encryptArr[index++] = m.group();
}
//解密
StringBuffer decryptSb = decrypt(encryptArr);
return decryptSb;
}
private static StringBuffer createEncryptFile() throws FileNotFoundException, IOException {
String fileName;
StringBuffer fileContentSb;
//--读源文件
fileName = "e:/tmp/source.txt";
fileContentSb = readFile(fileName);
//加密
String[] hexStrArr = encrypt(fileContentSb);
//--生成加密文件
fileName = "e:/tmp/encrypt.txt";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < hexStrArr.length; i++) {
sb.append(hexStrArr[i]);
}
writeFile(fileName, sb);
return fileContentSb;
}
private static void writeFile(String fileName, StringBuffer sb2) throws FileNotFoundException,
IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(fileName));
osw.write(sb2.toString());
osw.close();
}
private static StringBuffer decrypt(String[] hexStrArr) {
StringBuffer sb2 = new StringBuffer();
for (int i = 0; i < hexStrArr.length; i++) {
char encryptChar = 0;
String prefixChar;
if (i != 0) {
prefixChar = hexStrArr[i - 1];
} else {
prefixChar = hexStrArr[hexStrArr.length - 1];
}
encryptChar = prefixChar.charAt(prefixChar.length() - 1);
sb2.append((char) (Integer
.parseInt(hexStrArr[i].replaceAll(".$", encryptChar + ""), 16)));
}
return sb2;
}
private static String[] encrypt(StringBuffer sb) {
//存储密文
String[] hexStrArr = new String[sb.length()];
for (int i = 0; i < sb.length(); i++) {
//加密字符
char encryptChar = 0;
//下一个字符
String nextString;
if (i != sb.length() - 1) {
nextString = Integer.toString(sb.charAt(i + 1), 16);
} else {
nextString = Integer.toString(sb.charAt(0), 16);
}
encryptChar = nextString.charAt(nextString.length() - 1);
//原有字符转成十六进制
String tmpstr = Integer.toHexString(((sb.charAt(i)) & 0x0000FFFF) | 0xFFFF0000)
.substring(4);
//把原来字符十六进制最后一位替换成下一个字符的最后一位
hexStrArr[i] = tmpstr.replaceAll(".$", String.valueOf(encryptChar));
}
return hexStrArr;
}
private static StringBuffer readFile(String fileName) throws FileNotFoundException, IOException {
InputStreamReader isr;
isr = new InputStreamReader(new FileInputStream(fileName));
char[] tmpCharArr = new char[1024];
int readCount = isr.read(tmpCharArr);
StringBuffer sb = new StringBuffer();
while (readCount != -1) {
sb.append(tmpCharArr, 0, readCount);
readCount = isr.read(tmpCharArr);
}
isr.close();
return sb;
}
}