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

Encryption 压缩和加密时,我应该先压缩还是先加密?,encryption,compression,performance,aes,zlib,Encryption,Compression,Performance,Aes,Zlib,如果我对一个文件进行AES加密,然后ZLIB对其进行压缩,那么压缩的效率会比我先压缩然后加密的效率低吗 换句话说,我应该先压缩还是先加密,这有关系吗?先压缩。加密文件后,将生成一个随机数据流,该数据流是不可压缩的。压缩过程取决于在数据中找到可压缩模式。先压缩。如果你加密,那么你的数据就会变成(本质上)一个随机比特流。随机位是不可压缩的,因为压缩查找数据中的模式,而根据定义,随机流没有模式。如果您的加密算法很好(并且AES具有适当的链接模式),则没有压缩器能够压缩加密文本。或者,如果你喜欢另一种方

如果我对一个文件进行AES加密,然后ZLIB对其进行压缩,那么压缩的效率会比我先压缩然后加密的效率低吗


换句话说,我应该先压缩还是先加密,这有关系吗?

先压缩。加密文件后,将生成一个随机数据流,该数据流是不可压缩的。压缩过程取决于在数据中找到可压缩模式。

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

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

这是因为加密系统的输出应该与纯粹的随机数据无法区分,即使是由确定的攻击者。压缩器不是恶意攻击者,但它的工作原理是试图找到可以用较少位表示的非随机模式。压缩器应该无法在加密文本中找到任何此类模式


因此,您应该先压缩数据,然后加密结果,而不是反过来。这就是在中所做的,例如。

当然它很重要。通常最好先压缩,然后加密

ZLib使用。例如,如果在纯文本上执行哈夫曼树,它将更加平衡和优化,因此压缩率将更好

即使压缩结果看起来是“加密”的,压缩后也可以进行加密,但可以很容易地检测到压缩,因为文件通常以PK开头


ZLib不提供本机加密。这就是我实施的原因。源代码也可以在上找到。

从实用的角度来看,我认为您应该首先压缩,因为许多文件都是预压缩的。例如,视频编码通常涉及大量压缩。如果你加密这个视频文件,然后压缩它,它现在已经被压缩了两次。第二次压缩不仅会获得令人沮丧的压缩比,而且再次压缩将需要大量资源来压缩大型文件或流。如上所述,由于加密文件的随机性,加密文件的压缩可能不会产生任何影响


我认为最好也是最简单的策略可能是只在需要的时候压缩文件(使用白名单或黑名单),然后不管怎样对它们进行加密。

加密前的压缩肯定更节省空间,但同时也不太安全。这就是我不同意其他答案的原因

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


例如,有一个。

它不是真正随机的。只是加密后,任何压缩算法都无法发现模式。这是真的。看起来很随意。该过程是确定性的,因此给定相同的数据和密钥,您将得到相同的随机结果。@finnw假设加密算法采取步骤删除模式(例如在CBC模式下使用带随机IV的分组密码),加密数据与随机数据无法区分。@Ferruccio如果您使用,在CBC模式下使用随机IV的分组密码,然后,给定相同的数据和相同的密钥,您将得到不同的随机结果。是否有任何实用的(有限时间)压缩算法将消息完全随机化?压缩后的数据是否总是有一个剩余模式,可以用来破坏加密(理论上)?难道许多压缩算法不在压缩文件中添加页眉/页脚签名吗?在多个不同的压缩消息(假设它们使用相同的压缩算法)中,该剩余的性质/模式是相同的,这为破解者提供了关于未加密(但压缩)消息的统计信息,他可以利用这些信息。它们根本不是同一个问题。这个问题是关于效率的,另一个是关于安全性的。我觉得这个问题从来没有得到完全的回答,因为答案似乎都是从“压缩数据大小”(或压缩比,或你想称之为什么)的角度来讨论效率的。要考虑的另一个方面是处理数据所需的总CPU时间,并且通过该措施对非平凡大小的可压缩(即文本、非二进制)有效载荷(即超过几KB的任何内容)进行压缩和加密(甚至与加密未压缩的数据和完全不压缩)相比,计算效率更高。.那么,这是一种权衡吗?看起来有两种选择:1)加密,然后压缩以获得更高的安全性,但压缩效率较低。2) 压缩,然后加密以获得更有效的压缩,但会引入一个漏洞。这难道不需要针对您选择的加密原语进行已知的明文攻击吗?如果您想要更好的文件大小和安全性,请压缩,加密,然后再次压缩。最终压缩将无法压缩任何内容,但它将随机化数据。