我一直在使用AES-CBC进行加密,每次加密纯文本时我都会使用随机IV。据我所知,这是推荐的方法。
我一直在研究AES-GCM / AES-CTR,主要用于AEAD。我还没有用这个来实现任何东西,但从我读过的所有内容来看,基本上nonce只是一个短路的IV,并且有一个内部计数器用于每个加密调用。开发人员/需要确保在32位计数器循环返回之前更改nonce,否则相同的nonce(IV)可能与相同的密钥一起使用,该密钥可以加密相同的纯文本并泄漏加密密钥。
我真正理解的是,为什么AES-CBC可以随机静脉注射,但我读过的一些内容表明AES-GCM的随机nonce(IV)是一个坏主意。我唯一能想到的是AES-CBC的IV比AES-GCM的nonce更长,因此AES-GCM的重复nonce的可能性更大。
我需要加密几个字节到10到20 GB之间的数据。我知道AES-GCM对计数周期之前可以加密的数据大小(~60GB)有限制。我可以解决这个限制,因为我的数据低于这个限制。
有人可以阐明为什么不建议使用AES-GCM的随机现时量吗?
答案 0 :(得分:9)
如果使用相同的密钥(very nice example)重用nonce,则GCM基于CTR模式并继承了多次填充(或两次填充)问题。如果IV在CBC模式下重用,那么观察者唯一能够检测到的是消息前缀的相等性。
观察者可以检测到先前发送的消息是使用CBC模式再次发送的,这可能不会给他们太多,但CTR使他们能够推断消息的内容,如果有关内容结构的一些信息众所周知。
AES-GCM模式的随机数预计为96位长。如果您随机生成随机数,那么在2 n / 2 = 2 48 消息之后,您应该生成重复的随机数(请参阅生日问题)。也就是说,如果使用相同的密钥生成2个 48 加密消息,则生成重复随机数的概率为50%。这是很多消息,但它可以更早发生。
答案 1 :(得分:3)
GCM是计数器模式(CTR)的变体。正如您所说,对于计数器模式的任何变体,必需不会使用相同的键重复Nonce。因此,CTR模式Nonces通常包括一个计数器或一个计时器元素:保证在密钥的生命周期内不会重复的东西。
如果Nonce纯粹是随机的,那么它将重复的可能性很小。这个问题很容易避免,因此建议不要使用随机数。
在CBC模式下,IV会弹出第一个块的内容。如果不改变第一个块(或使用固定的IV),则第一个块(仅)的加密实际上处于ECB模式,这是不安全的。 CBC模式的随机IV避免了这个问题。
因此治疗方法的差异:CTR(以及从GCM派生的模式)需要保证唯一的Nonce。像CBC这样的模式需要一个随机的IV。
答案 2 :(得分:1)
使用随机IV / nonce进行GCM已被指定为官方推荐 - 例如 - NIST。如果有人提出不同意见,那么他们就可以了。
当使用随机IV时,生日问题极大地增加了IV碰撞的机会。使用nonce的默认大小(12字节或96位),碰撞的可能性不高。在模式变得脆弱之前,仍然可以加密超过十亿个文件或消息。
如果GCM容易受到攻击,那么攻击者可能会发现用于生成身份验证标记的(内部)密钥。除此之外,由于GCM在内部使用CTR模式,因此文件/消息中的数据的机密性可能会丢失。因此,如果重复使用IV,GCM将会失败。
由于上述限制和漏洞,需要仔细设计和实施随机IV。因此,建议使用经过良好测试的加密随机数生成器来生成IV的值。
有关IV生成及其产生的限制的更多信息,请参见NIST specification SP 800-38D on GCM的第8.2和8.3节。
在NIST规范中,需要将完整的96位用于随机IV。因此,没有任何备用位可以在IV中包含其他信息,因为不建议使用非默认大小为96位的IV。
NIST指定使用相同密钥为随机生成的IV加密2 ^ 32(40亿)个消息的限制。