检测加密的简单方法

4

有没有一种简单快捷的方法来检测加密文件?我听说过熵值计算,但如果我为驱动器上的每个文件都进行计算,那么检测加密将需要数天时间。

是否可能仅计算前100或1024个字节的某些值,然后进行决策?有人有相关资源吗?


你能告诉我们更多关于你想要实现的目标吗? - stmax
遍历整个驱动器并找到可疑文件,这些文件可能看起来像被加密了。告知用户这些文件的位置。然后用户可以决定如何处理,例如使用某些第三方软件进行解密。 - Alex
3个回答

3
我将使用交叉熵计算。对已知加密数据的X字节数进行交叉熵值计算(无论加密类型等都应接近1),您可能希望避免文件头和尾,因为这可能包含非加密文件元数据。
计算文件的熵;如果它接近于1,则可能是加密或/dev/random。如果与1相距很远,则很可能未加密。我相信您可以应用显着性测试来获得基线。
这大约需要10行Perl代码。我记不清使用了哪个库(尽管这可能会有所帮助:http://dingo.sbs.arizona.edu/~hammond/ling696f-sp03/addonecross.txt)。

这是一个关于主题的最正确的答案。有趣的是要知道交叉熵在压缩数据(zip、mp3、mkv)上的行为以及它在仅头部上的行为(就像OP建议的那样,比如1kB的头部)- 我猜熵对于这样的头部来说远非1,这足以检测到加密而不涉及文件格式识别。 - too

2
您可以创建一个识别特定常见加密文件形式的系统(例如:识别加密zip、rar、vim、gpg、ssl、ecryptfs和truecrypt)。任何尝试通过原始数据来确定加密的企图都很快会遇到隐写术讨论。

你对隐写术的理解是正确的。但是你提出的方法也无法应对它。因此,为了澄清最初的问题:如果我们跳过隐写术这个问题,只是针对常规加密进行防御,最好的方法是什么? - Alex
1
“打击常规加密”?我以为你只想检测加密数据的存在-这正是我的答案所涉及的。 - Thomas M. DuBuisson
1
没有所谓的“常规”加密。此外,在大多数格式中,加密都嵌入在某种容器格式(CMS、XML加密或专有格式)中。 - Maarten Bodewes
我所说的“fight”是指检测。对不起,我的英语不好。 - Alex
在这里http://www.utica.edu/academic/institutes/ecii/publications/articles/A0B3DC9E-F145-4A89-36F7462B629759FE.pdf中,我可以看到一些检测加密的统计方法,但它是基于整个文件的计算。 - Alex

0
好的加密的一个优点是你可以设计它以便无法被检测出来 - 例如,参考维基百科上关于可否认加密的文章。
每一种统计方法来检测加密都会给出各种“误报”,比如压缩数据或者一般情况下看起来随机的数据。
想象一下,我写了一个程序,输出两个文件:file1包含1024位的π,file2file1的加密版本。如果你对file1或者file2的内容一无所知,那么没有办法区分它们。事实上,π很有可能在某个地方包含了file2的内容!
编辑:
顺便说一句,反过来也不行(检测未加密的文件)。你可以编写一个程序,将加密数据转换为可读的英文文本,通过将单词或整个句子分配给其中的位/字节。

当然,没有银弹。但是如果使用文章中提到的方法,与第一篇回答中提到的方法相比,您预计有多少错误报警和真正的积极结果? - Alex
即使你提供的文章中也指出“可能是加密或压缩数据文件”(第7页)。除了像Thomas建议的分析已知的头部/格式之外,没有办法区分压缩和加密数据。我预计会有很多误报,因此“加密检测”根本没有意义。 - schnaader
你有没有读过引用的“可否认加密”(即可信否认性)文章?该方法并不能防止检测加密的存在。而且将加密编码为单词也无法隐藏随机性。另请参见https://arxiv.org/abs/2103.17059。 - Shelby Moore III

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接