如果我要对文件进行AES加密,然后对其进行ZLIB压缩,那么压缩效率是否会低于我先压缩然后加密后的效率?
换句话说,我应该先压缩还是首先加密,还是重要?
答案 0 :(得分:60)
先压缩。加密文件后,您将生成随机数据流,这些数据将不可压缩。压缩过程取决于在数据中找到可压缩模式。
答案 1 :(得分:31)
加密前的压缩肯定更节省空间,但同时安全性更低。这就是我不同意其他答案的原因。
大多数压缩算法使用" magic"文件头,可用于统计攻击。
例如,有CRIME SSL/TLS attack。
答案 2 :(得分:16)
如果你的加密算法是好的(和AES,具有正确的链接模式,那么),那么没有压缩器能够缩小加密文本。或者,如果您更喜欢它:如果您成功压缩了一些加密文本,那么现在是时候质疑加密算法的质量......
这是因为即使是确定的攻击者,加密系统的输出也应该与纯随机数据无法区分。压缩器不是恶意攻击者,但它通过尝试查找可以用较少位表示的非随机模式来工作。压缩器不应该能够在加密文本中找到任何这样的模式。
所以你应该首先压缩数据,然后加密结果,而不是反过来。这是在例如OpenPGP format。
中完成的答案 3 :(得分:7)
先压缩。如果加密,那么您的数据将变为(基本上)随机位流。随机位是不可压缩的,因为压缩会查找数据中的模式,而根据定义,随机流没有模式。
答案 4 :(得分:1)
当然重要。通常最好首先压缩然后加密。
ZLib使用Huffman coding and LZ77 compression。如果以纯文本形式执行霍夫曼树将更加平衡和最佳,因此压缩率会更好。
加密可以在压缩后跟进,即使压缩结果看起来是“加密的”,但很容易被检测到被压缩,因为文件通常以PK开头。
ZLib本身不提供加密。这就是我实施ZeusProtection的原因。源代码也可在github获得。
答案 5 :(得分:0)
压缩器确实只适用于具有良好定义模式的数据集,但它最初可以用于加密数据,从而产生可以由时间复杂度较低的压缩器处理的非常随机的非随机模式。
答案 6 :(得分:0)
从实际角度来看,我认为你应该首先压缩,因为许多文件都是预压缩的。例如,视频编码通常涉及大量压缩。如果您加密此视频文件然后压缩它,它现在已被压缩两次。不仅第二次压缩会产生令人沮丧的压缩率,而且再次压缩将需要大量资源来压缩大型文件或流。正如Thomas Pornin和Ferruccio所述,由于加密文件的随机性,加密文件的压缩无论如何都可能影响不大。
我认为最好也是最简单的策略可能是根据需要预先压缩文件(使用白名单或黑名单),然后加密它们。