在压缩和加密时,我应该先压缩还是先加密?

66
如果我先使用AES加密文件,然后再使用ZLIB压缩它,那么比起先压缩再加密,压缩效率会降低吗?换句话说,我应该先压缩还是先加密呢?或者这两个步骤的顺序无所谓吗?

1
它们根本不是同一个问题。这个问题询问的是效率,另一个问题则是关于安全性的。 - Ferruccio
我觉得这个问题似乎从未得到完全回答,因为所有的答案似乎都是从“压缩数据大小”(或压缩比率,或者你想叫它什么)的角度讨论效率。另一个需要考虑的方面是处理数据所需的总CPU时间,通过这个度量标准,对于一个可压缩的(即文本而非二进制)有效载荷,如果大小不小于几KB,则压缩然后加密更具有计算效率(甚至比仅加密未压缩的数据并且不进行任何压缩)。 - aroth
6个回答

73

首先压缩文件。一旦加密文件,您将生成一系列似乎随机的数据流,这些数据将无法进行压缩。压缩过程取决于在数据中找到可压缩的模式。


11
它并不是真正的随机。只是在加密后,没有任何压缩算法能够再次识别出这个模式。 - finnw
1
足够正确。它看起来是随机的。这个过程是确定性的,因此给定相同的数据和密钥,您将获得相同的随机结果。 - Ferruccio
2
假设加密算法采取措施来消除模式(例如使用带有随机初始向量的CBC模式块密码),加密数据与随机数据无法区分。 - yfeldblum
3
有没有任何实用的(有限时间内)压缩算法可以完全随机化消息?压缩数据总会有残留模式,理论上可以利用这些模式破解加密吗?许多压缩算法在压缩文件中添加头/尾标识符,那些残余的自然/模式将在多个不同的压缩消息中是相同的(假设它们使用了相同的压缩算法),这给黑客提供了统计信息,可以潜在地利用未加密(但已压缩)消息。 - hobs
如果你想获得更小的文件大小和更好的安全性,可以先压缩,再加密,然后再次压缩。最终压缩可能无法再压缩任何内容,但它会使数据随机化。 - Zintom
显示剩余9条评论

39

将加密前进行压缩可以更节省空间,但同时也会降低安全性。因此,我不同意其他答案。

大多数压缩算法使用“魔术”文件头,这可能会被用于统计攻击。

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


那么,这是一个权衡吗?看起来有两个选择:1)加密,然后压缩以获得更高的安全性但压缩效果较差。2)先压缩,再加密以获得更有效的压缩,但引入了漏洞。 - Ajoy Bhatia
2
这不需要一个已知明文攻击才能对你选择的密码原语进行可行性攻击吗? - Awn
如果您想获得更好的文件大小和安全性,请先压缩、加密,然后再次压缩。最终的压缩无法再进行压缩,但它将使数据随机化。 - Zintom

24

如果您的加密算法很好(而且带有适当的链接模式的AES算法很好),那么没有任何压缩器能够缩小加密文本。或者,如果您喜欢另一种方式:如果您成功地压缩了一些加密文本,那么现在是时候质疑加密算法的质量了。

这是因为加密系统的输出应该与纯随机数据无法区分,即使是坚决攻击者也不行。压缩器不是恶意攻击者,但它的工作是尝试找到非随机模式,并用更少的位数表示它们。压缩器不应该能够在加密文本中找到任何这样的模式。

因此,您应该首先压缩数据,然后加密结果,而不是相反。例如,在OpenPGP格式中就是这样做的。


10

首先进行压缩。如果你先加密,那么你的数据就会变成(本质上)一串随机比特流。随机比特流是不可压缩的,因为压缩需要在数据中寻找模式,而根据定义,随机流没有模式。


3
当然很重要。一般来说,先压缩后加密更好。
ZLib使用Huffman编码和LZ77压缩。例如,如果在纯文本上执行Huffman树,则平衡度和最优性将更好,因此压缩率将更高。
即使压缩结果似乎已经“加密”,也可以在压缩之后进行加密,但通常可以轻松检测到文件是否已经被压缩,因为文件通常以PK开头。
ZLib不会自带加密。这就是我实现ZeusProtection的原因。源代码也可在github上获得。

1
从实际角度考虑,我认为你应该先压缩文件,因为许多文件已经预先压缩了。例如,视频编码通常涉及大量压缩。如果你加密这个视频文件然后再压缩它,它现在已经被压缩了两次。第二次压缩不仅会得到可怜的压缩比,而且再次压缩大文件或流需要大量的资源。正如Thomas PorninFerruccio所述,加密文件的压缩可能无论如何都没有太大效果,因为加密文件的随机性。
我认为最好、最简单的策略可能是只在需要时压缩文件(使用白名单或黑名单),然后无论如何都对它们进行加密。

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