我在这里阅读的更多内容是关于GCM和CBC之间的差异,我对此又有疑问。

在CBC模式下,执行加密的人是提供IV的人。

但是,在GCM中,我读到nonce value是内部的-因此它是一个值,需要保持跟踪加密/解密值的人?我专门指的是AES-GCM的Java BouncyCastle实现。

nonce值是否有效地由对带有内部计数器的数据进行加密的人员提供的IV?

#1 楼

是的,现时将使用nonce附加一个计数器,以生成CTR模式密钥流。

它还将用作GHASH的输入:GHASH是用于验证数据的多项式MAC。

随机数本身不必是随机的,它可以是一个计数器。但是对于使用相同密钥加密的每个消息,它绝对必须唯一。在具有相同密钥和随机数的两个不同消息上使用GCM基本上可以使攻击者解密这两个消息并伪造更多消息。 (有一些限制,但它们不足以使它不破坏加密系统。)

因此,您可以让每一方都跟踪作为随机数的计数器,或者可以在每条消息之前以明文形式发送;只要它是唯一的。

有关真实协议中的示例,请参阅TLS 1.2的GCM规范:https://tools.ietf.org/html/rfc5288#section-3。它将来自握手的值和计数器连接起来以形成现时值。

评论


$ \ begingroup $
一个较小的更正:如果随机数不完全是12个字节,则生成内部计数器的方法比您描述的要复杂得多。另一方面,我从未见过有人在GCM中实际使用12字节以外的大小
$ \ endgroup $
–雨披
2012年12月23日的16:22

#2 楼

有一个外部提供的随机数(可以通过计数器来实现),还有一个内部处理的计数器,该计数器针对每个加密块递增。

#3 楼

在计数器模式下,答案肯定是肯定的。该链接后面的图和说明,基本上CTR使用带有计数器的随机数,因为它是可并行的,因此IV一直在使用。

GCM的区别在于,在其下游添加了一些有趣的有限域代数IVs。在某些c ++示例中,这涉及到GCM对于IV的输入喜欢的内容。