AES(128或256)加密是否会扩展数据?如果是,扩展多少?

48

我希望为一个软件产品添加AES加密,但担心数据大小会增加。我猜测数据确实会增加,那么我就需要添加压缩算法来进行补偿。


3
由于加密的目的是增加熵,我认为压缩对其影响不大。不过,你可以试一下看会发生什么。 - Aaron Maenpaa
7个回答

63

AES不会扩展数据。此外,输出通常不可压缩;如果您想压缩数据,请在加密之前进行压缩。

但请注意,AES加密通常与填充结合使用,这将使数据的大小增加(尽管只增加几个字节)。


1
请注意,除了填充之外,加密数据通常需要CipherBlockmode,这需要一个IV(“初始化值”),为了安全起见,还需要MAC算法来防止修改。对于AES和大多数块模式,IV为16字节,最常见的HMAC(Sha1)是另外16字节。 - Bas Goossen

27

AES不会拓展数据量,除了在最后一个区块结束时添加几个字节的填充。

生成的数据无法被压缩,因为它们基本上是随机的 - 没有基于字典的算法能够有效地压缩它们。最佳实践是先压缩数据,然后再加密。


1
请注意,即使输入长度已经是加密块大小的整数倍,也必须添加一些填充字节;需要有一些填充,以便解密时可以确定有多少填充字节。 - Tom Anderson

13

在加密之前对数据进行压缩是很常见的。之后再压缩是行不通的,因为 AES 加密后的数据看起来像是随机的(对于除任何标头和其他内容之外的任何好的密码术都是如此)。

然而,在某些情况下,压缩可能会引入侧信道攻击,因此您必须分析自己的使用情况。最近有报道称针对加密 VOIP 的侧信道攻击:要点是不同的音节在使用 VBR 进行压缩时会产生特定的比特率变化,因为一些声音比其他声音更容易被压缩。因此,一些(或全部)音节可能会在充分分析的情况下被恢复,因为数据以生成速度传输。解决方法要么是使用(效率较低的)CBR 压缩,要么是使用缓冲区以恒定速率传输数据,而不管编码器输出的数据速率如何(增加延迟)。

AES 将 16 字节的输入块转换为 16 字节的输出块。唯一的扩展就是将数据舍入到整个块数。


感谢提供VoIP攻击示例。想到自己可能会受到这样的威胁,真是一场噩梦。 - tuxayo

5

我相信AES加密不会对被加密的数据增加任何信息,因为这会泄漏有关状态变量的信息,而在密码学中这是一个坏事情。

如果您想混合压缩和加密,请按照此顺序执行。原因是加密数据(理想情况下)看起来像完全随机的数据,而压缩算法最终会使数据变大,因为它无法真正压缩其中任何内容,并且需要与任何压缩文件格式相关的开销。


0
如果需要压缩,请在加密之前进行。

0

不会。唯一的变化将是添加少量填充以使数据对齐到块的大小。

但是,如果您正在压缩内容,请注意应该在加密之前进行此操作。加密数据通常应该与随机数据无法区分,这意味着它不会被压缩。


0

@freespace 和其他人:我在密码学课上记得的一件事是,在加密之前不应该压缩数据,因为一些可重复的压缩流块(例如节标题)可能会使破解您的加密更容易。


2
如果你的算法对已知明文攻击如此脆弱,那么无论如何你都会遭遇困境。许多常见的结构化格式中也存在同样可预测的线索。大多数现代系统都设计成以防止此类攻击成为可能的模式运行。 - Brian
正确!压缩数据通常会有比实际纯文本更少的重复或可猜测的段。假设您正在加密一个Java代码文件。会有人猜到//经常出现吗?还有:Zip供应商在加密之前进行压缩。 - Cheeso
@Cheese 听起来像一个随机 IV 应该处理的事情。 - FluorescentGreen5
1
许多年后,@Kasprzol被证明是正确的。CRIME和BREACH漏洞。 - Slbox

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