0x0
0x1 题目描述
现对一个文本文件进行加密,保存成另一个文件,然后对此文件解密,查看解密后结果。
0x2 解释
读、写的方法有点多,还没完全区别好,所以直接参考了大黑书上的经典 I / O 用法。
加密的方式就是字符与 key 异或,解密再异或一次就ok了。
0x3 代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
//读写的方法太多了,还没理清,直接参考大黑书了:
public class _01加解密 {
private static int key = 0x10;
//用了大黑书里提到的典型I/O用法:
// 加密:把inFileName里的内容加密到outFileName中去
public static void encrypt(String inFileName, String outFileName) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(inFileName));// 读
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(outFileName)));// 写
String s;// 保存读的每行数据
while ((s = in.readLine()) != null) {// 只要还未读到文件末尾:
// 对每个字符异或加密:
for (int i = 0; i < s.length(); ++i) {
out.print((char) (s.charAt(i) ^ key));
}
// 每一行最后加一个换行符的加密:
out.print((char) ('\n' ^ key));
}
in.close();
out.close();
}
// 解密:把filename里的 数据解密出来:
public static String decode(String filename) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(filename));// 读
String s;// 保存每一行数据
//字符串sb 累积读取的每一行数据:
StringBuilder sb = new StringBuilder();
while ((s = in.readLine()) != null) {
sb.append(s);
}
//StringBuilder 修改字符的方法:(解密过程)
for (int i = 0; i < sb.length(); ++i) {
sb.setCharAt(i, (char) (sb.charAt(i) ^ key));
}
// 返回解密后数据:
return sb.toString();
}
public static void main(String[] args) throws IOException {
encrypt("iotest.in", "iotest.out");
System.out.println(decode("iotest.out"));
}
}