凯撒加密法简介
- 凯撒加密(Caesar cipher)是一种简单的消息编码方式:它根据字母表将消息中的每个字母移动常量位k。举个例子如果k等于3,则在编码后的消息中,每个字母都会向前移动3位:a会被替换为d;b会被替换成e;依此类推。字母表末尾将回卷到字母表开头。于是,w会被替换为z,x会被替换为a。
- 遗憾的是凯撒加密法箱单容易破解。字母的移动只有26种可能,要破解密码,只需尝试各种密钥值,直到有一种可行为止。
- 使用重复密钥可以对这种编码方式进行改进。这时不是将每个字母移动常数位,而是利用一个密钥值列表,将各个字母移动不同的位数。如果消息比密钥值列表更长,可以从头再次利用这个密钥列表。例如,假设密钥值列表为:
3 1 7 4 2 5
那么第一个字母移动3位,第二个字母移动1位,将第6个字母移动5位之后,会从头再次使用这个密钥列表。
代码实现
import java.util.LinkedList;
import java.util.Queue;
/**
* 凯撒加密法
* @author Administrator
*
*/
public class Codes {
/**
* @param args
*/
public static void main(String[] args) {
// 定义密钥列表
int key[] = { 5, 12, -3, 8, -9, 4, 10 };
Integer keyValue;
String encoded = "", decoded = "";
//要加密的字符串
String message = "All programmers are playwrights and all computers are lousy actors";
//定义两个对列,存放密钥列表,供加密和解密使用
Queue<Integer> encodingQueue = new LinkedList<>();
Queue<Integer> decodingQueue = new LinkedList<>();
//将密钥列表存储到对列中
for (int i = 0; i < key.length; i++) {
encodingQueue.add(key[i]);
decodingQueue.add(key[i]);
}
//加密算法
for (int i = 0; i < message.length(); i++) {
keyValue = encodingQueue.remove();
encoded += (char) (message.charAt(i) + keyValue);
encodingQueue.add(keyValue);
}
System.out.println("Encoded Message :\n" + encoded + "\n");
//解密算法
for (int i = 0; i < encoded.length(); i++) {
keyValue = decodingQueue.remove();
decoded +=(char) (encoded.charAt(i)-keyValue);
decodingQueue.add(keyValue);
}
System.out.println("Decoded Message :\n" + decoded + "\n");
}
}
运行结果
凯撒加密的算法简单,读者可自己封装一下。