压缩和encryption时,我应该先压缩还是先encryption?

如果我要AESencryption一个文件,然后ZLIB压缩它,那压缩的​​效率会比我先压缩然后encryption的效率低吗?

换句话说,我应该先压缩还是先encryption,还是重要?

先压缩。 一旦你encryption文件,你将产生一个随机数据stream,这将是不可压缩的。 压缩过程依赖于在数据中find可压缩模式。

encryption之前的压缩肯定会有更高的空间效率,但同时安全性较差。 这就是为什么我会不同意其他答案。

大多数压缩algorithm使用“魔术”文件头,可用于统计攻击。

例如,有一个CRIME SSL / TLS攻击 。

如果你的encryptionalgorithm是好的(AES和适当的链接模式,是好的),那么没有压缩器将能够缩小encryption的文本。 或者,如果您更喜欢这种方式:如果您成功地压缩了一些encryption的文本,那么是时候质疑encryptionalgorithm的质量了。

这是因为encryption系统的输出应该与纯粹的随机数据区别开来,即使是一个确定的攻击者也是如此。 压缩器不是一个恶意的攻击者,但是它通过试图find它可以用较less的位表示的非随机模式来工作。 压缩器不应该能够在encryption的文本中find任何这样的模式。

所以你应该首先压缩数据, 然后encryption结果,而不是相反。 这就是OpenPGP格式所做的。

先压缩。 如果你encryption,那么你的数据变成(本质上)一个随机位stream。 随机比特是不可压缩的,因为压缩在数据中寻找模式,并且根据定义,随机stream没有模式。

当然重要。 通常先压缩然后再encryption。

ZLib使用霍夫曼编码和LZ77压缩 。 如果以纯文本为例,Huffman树会更加平衡和优化,所以压缩率会更好。

即使压缩结果看上去是“encryption的”,encryption也可以在压缩之后进行,但是由于文件通常以PK开始,因此可以很容易地检测到压缩。

ZLib本身不提供encryption。 这就是为什么我实施了ZeusProtection 。 源代码也可以在github上find 。

确实,压缩器只能工作在具有明确定义的模式的数据集上,但是它首先是对数据进行encryption的探索,这样就可以很好地防止非随机模式,而这种模式可以用较less的时间复杂度来处理压缩器。

从实际的angular度来看,我认为你应该先压缩,因为很多文件都是预先压缩的。 例如,video编码通常涉及大量压缩。 如果你encryption这个video文件然后压缩它,它现在已经被压缩了两次。 第二次压缩不仅会得到令人沮丧的压缩比,而且还会压缩大量资源来压缩大文件或stream。 正如Thomas Pornin和Ferruccio所说,由于encryption文件的随机性,encryption文件的压缩可能没有什么效果。

我认为最好的和最简单的策略可能是仅仅根据需要压缩文件(使用白名单或黑名单),然后无论如何encryption。