凯撒加密原理就是以一个标准表的偏移量来加密,我们这里以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。