异或解密案例

案例

之前使用C语言编写的一个异或加解密工具,原理很简单:输入要加密的文件和一个字符串作为密钥(Windows cmd 默认编码是 GBK),逐字节读取文件并取密钥一个字节做异或运算,将得到的结果写入新文件,密钥是循环使用的。

案例是使用该工具加密了一个1.3GB的视频文件(MP4),解密时密钥没有输入完整,未检验解密文件的情况下删除了加密文件。

尝试了文件恢复,但是并不好用,于是尝试反解密此问题。

思路:现在手里有错误明文,已知正确密钥,且错误密钥比正确密钥短,目标是获取正确明文。正确明文需要正确密钥和密文,现在缺少密文。密文需要错误明文和错误密钥,现在缺少错误密钥。因此第一步就是获得错误密钥。

另外找寻一个正常的 MP4 文件,截取文件头一定数量的字节与错误明文做异或运算,得到的结果存在重复序列,可以推测该重复序列就是错误密钥。用错误密钥和错误明文异或得到密文,进而得到正确明文。

幸运的是,MP4 文件的前 23 个字节是相同的,而正确密钥的长度是 22 字节,错误密钥是 3 字节。

总结

这是一个简单的解密案例,有太多凑巧的条件才得以完成。

解决问题的过程中,注意到自己缺乏工程素养:发现问题、定义问题、解决问题。无法准确定义问题,费了很大功夫才找到错误密钥,而且编程水平有所下降。

另一方面,做事不够严谨,文件要做校验,加密前后做比对,以及文件需要备份。 这些致命问题一个都没避免。

2022.04.09

EOF

Built with Hugo
Theme Stack designed by Jimmy