当前位置: 首页 > 知识库问答 >
问题:

为什么随机IV对AES-CBC没有问题而对AES-GCM没有问题

笪昌翰
2023-03-14

我一直在研究AES-GCM/AES-CTR,主要是为AEAD。我还没有用这个实现任何东西,但从我所读到的一切来看,基本上nonce只是一个短的IV,有一个内部计数器用于每个加密调用。开发人员/需要在32位计数器循环返回之前确保nonce更改,否则相同的nonce(IV)可能与相同的密钥一起使用,这可能会加密相同的纯文本并泄漏加密密钥。

我真的不明白为什么AES-CBC可以使用随机IV但我读到的一些东西表明,对AES-GCM使用随机nonce(IV)是一个坏主意。我唯一能想到的是AES-CBC的IV比AES-GCM的nonce长,所以AES-GCM重复nonce的可能性更大。

我需要加密的数据是从几个字节到10-20 GB的任何地方。我知道AES-GCM有一个数据大小的限制(~60GB),它可以在计数器周期之前加密。我可以绕过这个限制,因为我的数据低于这个限制。

有人能解释一下为什么AES-GCM不建议使用随机瞬时吗?

共有1个答案

宣原
2023-03-14

GCM基于CTR模式,如果用相同的键重用一个nonce(非常好的示例),它会继承多次pad(或两次pad)问题。如果在CBC模式下重用IV,那么观察者唯一能检测到的就是消息前缀的相等性。

观察者可以通过CBC模式检测到以前发送的消息被再次发送,这可能不会给他们太多的信息,但如果关于内容结构的某些信息已知,CTR为他们提供了推断消息内容的能力。

AES-GCM模式的nonce预计为96位长。如果您随机生成nonce,那么您需要在2n/2=248消息之后生成一个重复的nonce(请参见生日问题)。也就是说,如果您使用相同的密钥生成了2个48个加密消息,则生成重复nonce的概率为50%。这是相当多的信息,但它可以发生得更早。

 类似资料:
  • 我从Python得到一个加密的base64字符串。 格式是AES 256 CBC,但当我尝试使用Android解密时,它将解密字符串返回为nil。 这里我使用https://github.com/fukata/aes-256-cbc-example

  • 我面临的一些问题,没有收到通知在一些电话。我也不接受GCM的意图。这是我打电话给GCM注册时的日志。在像Nexus和Moto这样的手机上,它运行得非常好。但在Lava和Karbonn这样的低端手机上,我就面临着这个问题。 D/PowerManagerService(649):AcquireWakeLockInternal:lock=1114432392,Flags=0x1,tag=“gcm_con

  • 我一直在试图找出java安全/加密库的方法,我相信我在理解发生了什么方面取得了一些进展。我想我设法让加密部分工作了。在encrypt方法中,如果我只是尝试返回,我会得到一些看起来像加密文本的不可读的杂乱无章的东西。当我试图不返回它,而是继续调用decrypt并进行明文-->encrypt-->decrypt是我所拥有的一切时,问题就来了 所以我用一些明文调用encrypt,并尝试返回明文以确保它工

  • 我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/

  • 老师们好: 下面是一段C 语言结合openssl库做 AES CBC 128 PCSKPadding7 加密, 加密的部分是可以, 解密是总是出现乱码。请老师们帮忙给看看: 程序输出如下: Ciphertext (Base64): O4SkNWTfpKVOSrvpdcwbXg== Decrypted text: :▒▒1aٞ▒tp▒▒L▒$b;▒▒5dߤ▒NJ▒▒u▒ 代码如下

  • 下面的表达没有问题- 但以下两个有编译时间问题- 为什么呢?