翻译:无名侠
原文地址: https://yurichev.com/blog/XOR_Z3/博客地址:http://www.cnblogs.com/pandaos/p/8435750.html
如果我们有一段用简单XOR加密过的文本,怎么寻找密钥呢?密钥的长度可能很长,所以暴力破解不是明智的选择。
明文、密文、密钥三者的关系可以用一些简单的方程组来描述,明文可能含有尽可能多的小写字母(a....z)。
( https://github.com/DennisYurichev/yurichev.com/blob/master/blog/XOR_Z3/1.py )
这里有一段需要被加密过的文件(350 字节):https://github.com/DennisYurichev/yurichev.com/blob/master/blog/XOR_Z3/cipher1.txt
运行尝试。
这段文本并不能流畅地阅读,有趣的是,只存在17字节的key。
我们对英语文本了解多少? 数字在文本中很稀少,有一种叫做“二合字母”的东西,比如:“th”、“he”、“in”、“er” 等等,我们可以通过计算它们在文本中出现的频率,然后寻找出现次数最多的那一组解。
( https://github.com/DennisYurichev/yurichev.com/blob/master/blog/XOR_Z3/2.py )
现在我们再从次执行脚本,好像更接近原文了
有几个字符还是有错误的,但是我们可以手动修复它们,因此添加限制条件。(不直接改原文的原因是我们的目标是寻找key,所以通过增加确定性限制条件重新求解key)
( https://github.com/DennisYurichev/yurichev.com/blob/master/blog/XOR_Z3/3.py )
这一次key正确了:
因此,这就是正确的key。
不用说,输入的数据越大越好。这个350字节的文件实际上是另一个更大加密文件的前戏(cipher2.txt, 12903 bytes) ,这个大文件的key可以不用添加那些些启发式条件也能求得。
SMT Solver 可以秒杀这些东西,我曾经很天真的解决了这些问题,这里有一个更快的版本: https://yurichev.com/blog/XOR_mask_2/尽管如此,这仍然是另一个优化问题的演示。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
zjgcjy py带一个xortool的库 很好用