Encryption 如何区分实时通信中的加密和压缩

Encryption 如何区分实时通信中的加密和压缩,encryption,compression,reverse-engineering,data-analysis,raw-data,Encryption,Compression,Reverse Engineering,Data Analysis,Raw Data,我负责网络流量过滤器,需要将输入IP流量分为3组: 加密流量 压缩流量 既不加密也不压缩流量 压缩和加密的数据有许多相似的属性,如内容直方图中的熵和字符分散度。所以很难区分它们 当数据块较大(>1MB)时,有一种方法可以使用卡方分布、Pi近似误差和熵方法对数据进行分类 此算法对于少量数据(~1k)不准确 问题: 如何以90%以上的准确率区分实时流量(约1k个数据块)中的加密和压缩 我知道现代DPI(深度包检测)系统已经实现了一些算法来处理这个问题 你有什么想法吗?唯一的办法就是知道可能存在的

我负责网络流量过滤器,需要将输入IP流量分为3组:

  • 加密流量
  • 压缩流量
  • 既不加密也不压缩流量
压缩和加密的数据有许多相似的属性,如内容直方图中的熵和字符分散度。所以很难区分它们

当数据块较大(>1MB)时,有一种方法可以使用卡方分布、Pi近似误差和熵方法对数据进行分类

此算法对于少量数据(~1k)不准确

问题

如何以90%以上的准确率区分实时流量(约1k个数据块)中的加密和压缩

我知道现代DPI(深度包检测)系统已经实现了一些算法来处理这个问题


你有什么想法吗?

唯一的办法就是知道可能存在的压缩数据格式有限。然后,您可以开始使用所有这些格式进行解码。如果一个可以工作一段合理的距离(例如,大约100个字节),那么这很可能是一个未加密的压缩流。

您可以使用Shannon的来尝试设计一种启发式方法。压缩文件可能在字典大小边界处显示熵下降,而(加密良好的)文件则不会


几乎没有机会区分压缩加密文件和未压缩加密文件。一个实现良好的加密将不会泄露关于明文的任何信息,也不会通过熵泄露。

这是一个有趣的问题,但不幸的是,对于StackOverflow来说,它太宽了。你能缩小你问题的范围吗?至少有一个具体的算法?@ LukeJoshuaPark MC++程序分析网卡的传入IP数据包。然后找到每个包的熵。如果熵大于X,则可能是加密或压缩。但我如何才能确切地知道这是什么(压缩还是加密)?也许还有另一个标准来区分压缩和加密?非常感谢。您不能使用协议元数据/头吗?@smeso协议元数据(端口)不能告诉我任何有关加密或压缩的信息。示例:端口12345。我不知道数据是否需要加密。协议可以完全压缩,所以没有可见的头。我的意思是:另一端应该能够解压/解密数据,所以必须有某种东西告诉它该做什么。或者我们说的是一个从一开始就用未知算法完全加密或压缩的未知协议?我尝试过使用启发式方法。我编写了一个测试程序,将一个大文件分为128字节的块,然后计算单个块的熵、卡方、算术平均值,并构建GISTOGRAM。我对大型(1GB)AES加密文件和LZMA压缩文件进行了测试。压缩文件和加密文件的gistogram(熵、Chi、平均值)几乎相同(~98%重叠)。所以我认为这里不可能使用启发式。但这篇文章说,这是可能的,而且精确度很高: