凯撒加密原理就是以一个标准表的偏移量来加密,我们这里以ASCLL表为标准表,偏移量为1来实现"加密"。
CaesarWriter.java:
import java.io.FileWriter; import java.io.FilterWriter; import java.io.IOException; import java.io.Writer; /** * 自定义的输出流:实现字符数据的凯撒密码加密过程 * @author Administrator * */ public class CaesarWriter extends FilterWriter { protected CaesarWriter(Writer out) { super(out); } @Override public void write(int c) throws IOException { c++; super.write(c); } @Override public void write(String str) throws IOException { // TODO Auto-generated method stub //父类的写 // super.write(str); char data[] = str.toCharArray(); for(int i = 0; i < data.length; i++) { write(data[i]);//返回上面的write()函数,重载 } } }
CaesarReader.java:
import java.io.FilterReader; import java.io.IOException; import java.io.Reader; /** * 自定义使用凯撒密码解密文本数据 * * @author hwyou * */ public class CaesarReader extends FilterReader { protected CaesarReader(Reader in) { super(in); } @Override public int read() throws IOException { int c = super.read(); // 解码 if (c != -1) { c--; } return c; } }
TestCaesar.java:
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class TestCaesar { public static void main(String[] args) { //加密 encode(); //解码 decode(); } private static void decode() { try(CaesarReader in = new CaesarReader(new FileReader("c.txt"))) { int c; while(-1 != (c = in.read())) { System.out.println((char)c); } } catch (Exception e) { // TODO: handle exception } } private static void encode() { String msg = "hello"; //原始 try(FileWriter out= new FileWriter("f.txt")) { out.write(msg); } catch (IOException e) { e.printStackTrace(); } //加密 try(CaesarWriter out = new CaesarWriter(new FileWriter("c.txt"))) { out.write(msg); } catch (IOException e) { // TODO: handle exception } } }
先注释decode(),生成f.txt和c.txt,然后反注释encode,根据c.txt打印hello。