【问题标题】:Identifying an AES encrypted file识别 AES 加密文件
【发布时间】:2019-11-06 23:38:57
【问题描述】:

有没有一种方法可以根据文件内容来识别或检查 AES 加密文件(例如通过在文件开头查找字母“PK”来识别 ZIP 文件的方式)?是否有任何与 AES 加密文件相关的幻数?

我们在工作流存储库中有多个文件,这些文件要么是纯文本(可能是 excel、XML、JSON、文本等),要么是 AES-256 加密的,但不知道哪些是 AES 加密的。我需要编写 Java 代码来识别 AES 加密文件并自动解密它们。谢谢!

【问题讨论】:

  • 这取决于加密文件是否已加密并包含在某种标准格式中。如果没有,您可以轻松识别文本文件或任何其他结构化文件,并假设其他所有文件都是您的加密文件。

标签: java encryption aes


【解决方案1】:

在没有任何标准头的情况下,您可以查看字节频率。 AES 加密数据(或者实际上任何用像样算法加密的数据)似乎是一个随机的字节序列。这意味着 0-255 字节值的分布将大致平坦(即所有字节值的可能性相同)。

但是,文本文档将主要包含可打印字符 - 有些比其他字符多得多。空格、换行符、元音等将非常常见。

因此,您可以为各种文件构建字节计数直方图,并寻找一种简单的方法将它们分类为加密或未加密。例如,查看 5 个最不常见字节值的总数与 5 个最常见字节值的总数之比。对于加密文件,我希望这个比率接近 1.0,而对于普通文本文档,这个比率与 1.0 相差甚远(我确信可以使用更复杂的统计指标......)。

当然,这对于极短的文档可能效果不佳。

另见:

【讨论】:

    【解决方案2】:

    AES 是一种分组密码。就其本身而言,它只能将一个 128 位值转换为另一个看似随机的 128 位值。为了加密更多数据,添加了一种操作模式和可能的填充方案。如果你想更进一步,比如生成加密文件,你真的需要定义一种文件格式,因为前面提到的机制没有提供这种格式。

    所以,如果你说你有一个 AES 加密的文件,除了你的文件以某种方式被加密之外,这并没有任何意义。

    现代加密的结果看起来像随机噪声,因此您可以将加密文件的汉明权重与未压缩的结构化文件的汉明权重进行比较。正如 DNA 所提到的那样,可能会有差异。压缩文件也看起来像随机噪声,但它们可能包含偏差,如果文件足够长,这些偏差可能就足够大了。

    有些文件格式包含标识符how,数据已加密。大多数自制格式没有任何接近标识符的内容,因为它们是为特定应用程序编写的,并且协议或文件格式不会经常更改。开发人员选择了一些“密码套件”,并且从不费心让它变得灵活。如果您知道生成文件的程序,那么您可能会发现它们是否已加密。如果该程序是开源的,这很容易。如果它是封闭源代码,您仍然可以对其进行逆向工程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 2012-02-18
      相关资源
      最近更新 更多