我希望为一个软件产品添加AES加密,但担心数据大小会增加。我猜测数据确实会增加,那么我就需要添加压缩算法来进行补偿。
我希望为一个软件产品添加AES加密,但担心数据大小会增加。我猜测数据确实会增加,那么我就需要添加压缩算法来进行补偿。
AES不会扩展数据。此外,输出通常不可压缩;如果您想压缩数据,请在加密之前进行压缩。
但请注意,AES加密通常与填充结合使用,这将使数据的大小增加(尽管只增加几个字节)。
AES不会拓展数据量,除了在最后一个区块结束时添加几个字节的填充。
生成的数据无法被压缩,因为它们基本上是随机的 - 没有基于字典的算法能够有效地压缩它们。最佳实践是先压缩数据,然后再加密。
在加密之前对数据进行压缩是很常见的。之后再压缩是行不通的,因为 AES 加密后的数据看起来像是随机的(对于除任何标头和其他内容之外的任何好的密码术都是如此)。
然而,在某些情况下,压缩可能会引入侧信道攻击,因此您必须分析自己的使用情况。最近有报道称针对加密 VOIP 的侧信道攻击:要点是不同的音节在使用 VBR 进行压缩时会产生特定的比特率变化,因为一些声音比其他声音更容易被压缩。因此,一些(或全部)音节可能会在充分分析的情况下被恢复,因为数据以生成速度传输。解决方法要么是使用(效率较低的)CBR 压缩,要么是使用缓冲区以恒定速率传输数据,而不管编码器输出的数据速率如何(增加延迟)。
AES 将 16 字节的输入块转换为 16 字节的输出块。唯一的扩展就是将数据舍入到整个块数。
我相信AES加密不会对被加密的数据增加任何信息,因为这会泄漏有关状态变量的信息,而在密码学中这是一个坏事情。
如果您想混合压缩和加密,请按照此顺序执行。原因是加密数据(理想情况下)看起来像完全随机的数据,而压缩算法最终会使数据变大,因为它无法真正压缩其中任何内容,并且需要与任何压缩文件格式相关的开销。
不会。唯一的变化将是添加少量填充以使数据对齐到块的大小。
但是,如果您正在压缩内容,请注意应该在加密之前进行此操作。加密数据通常应该与随机数据无法区分,这意味着它不会被压缩。
@freespace 和其他人:我在密码学课上记得的一件事是,在加密之前不应该压缩数据,因为一些可重复的压缩流块(例如节标题)可能会使破解您的加密更容易。