凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把**字母移动一定的位数**来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是 3 的时候,所有的字母 A 将被替换成 D,B 变成 E,由此可见,位数就是凯撒密码加密和解密的密钥。
例如:字符串”ABC”的每个字符都右移 3 位则变成”DEF”,解密的时候”DEF”的每个字符左移 3 位即能还原,如下图所示:
![](https://box.kancloud.cn/c1219fe09be03a46b44a4744dca19bcc_740x334.jpg)
~~~
1. package com;
2.
3. public class KaiSaEncrypted {
4.
5. private static final String str = "hello meinv!";
6. private static final int pwd = 6;
7. public static void main(String[] args) {
8. String encrypte = encrypte(str);
9. System.out.println("加密后的文本:"+encrypte);
10. String decrypted = decrypted(encrypte);
11. System.out.println("解密后的文本:"+decrypted);
12. }
13.
14. public static String encrypte(String original){
15. char[] charArray = str.toCharArray();
16. for (int i = 0; i < charArray.length; i++) {
17. charArray[i]+= pwd;
18. }
19. return new String(charArray);
20. }
21.
22. public static String decrypted(String original){
23. char[] charArray = original.toCharArray();
24. for (int i = 0; i < charArray.length; i++) {
25. charArray[i]-= pwd;
26. }
27. return new String(charArray);
28. }
29. }
~~~
![](https://box.kancloud.cn/3664ecd826172bb9ed0d982050d9591c_909x603.jpg)
1. 破解凯撒密码:频率分析法
凯撒密码加密强度太低,只需要用频度分析法即可破解。
在任何一种书面语言中,不同的字母或字母组合出现的频率各不相同。而且,对于以这种语言书写的
任意一段文本,都具有大致相同的特征字母分布。比如,在英语中,字母 E 出现的频率很高,而 X 则出现
得较少。
英语文本中典型的字母分布情况如下图所示:
![](https://box.kancloud.cn/3e280259e56c91c089005aadfebf7539_763x611.jpg)
破解流程:
1,统计密文里出现次数最多的字符,例如出现次数最多的字符是是’h’。
2,计算字符’h’到’e’的偏移量,值为 3,则表示原文偏移了 3 个位置。
3,将密文所有字符恢复偏移 3 个位置。
注意点:统计密文里出现次数最多的字符时,需多统计几个备选,因为最多的可能是空格或者其他字符,例如下图出现次数最多的字符'#'是空格加密后的字符,‘h'才是'e’偏移后的值。