凯撒密码暴力破解器

最近打算开始学习密码学了,上网左挑挑右看看,最终选择了《图解密码技术》这本书,想着可以通过通俗易懂的方式先入个门,之后再深度学习。

在书的译者前言部分,给了这样一段密文:
ZW PFL NREK KF CVRIE DFIV RSFLK TIPGKFXIRGYP Z IVTFDDVEU RE FECZEV TFLIJV ZEJKILTKVU SP GIFWVJJFI URE SFEVY WIFD JKREWFIU LEZMVIJZKP ALJK JVRITY TIPGKFXIRGYP RK TFLIJVIR.FIX

作者说这是一段用经典的凯撒密码加密的文字,因为对凯撒密码略知一二,所以在开始看书学习之前,决定写个暴力的破解器来破解,于是就有了以下代码:

[cc lang = “cpp” escaped = “true”]
#include

using namespace std;

int main() {
string caesar;
getline(cin, caesar);
for (int i = 1; i <= 26; i++) {
cout << i << “: “; //输出序号
for (int j = 0; j < caesar.length(); j++) {
if (caesar[j] == ‘ ‘) cout << ‘ ‘; //处理空格
else if (caesar[j] == ‘.’) cout << ‘.’; //处理.
else {
if (caesar[j] + i – ‘Z’ > 0) //超过’Z’则从’A’开始
if (j) cout << (char)tolower((caesar[j] + i – ‘Z’ + ‘A’ – 1));
else cout << (char)(caesar[j] + i – ‘Z’ + ‘A’ – 1); //首字母大写
else
if (j) cout << (char)tolower((caesar[j] + i));
else cout << (char)(caesar[j] + i); //首字母大写
}
}
cout << endl;
}
return 0;
}
[/cc]
 
最后通过输出,可以发现第9个为我们需要的明文:
If you want to learn more about cryptography i recommend an online course instructed by professor dan boneh from stanford university just search cryptography at coursera.org
如果你想要学习更多有关密码学的知识,那么我推荐斯坦福大学Dan Boneh教授主讲的在线课程,你只需在coursera.org上搜索cryptography即可。


几点思考
1.当然以上代码可以优化,比如对单个的字母i进行大写,以便显示更美观;
2.因为密文中有“单个字母”的存在,对于英文比较熟悉的朋友可能知道这种情况在自然语言文本中是非常非常有限的,我所知道的有“a”、“i”是有可能单独存在的,所以理论上只试验两次(+1 or +9)即可破解这段密文。



Leave a Reply

Your email address will not be published. Required fields are marked *