我了解使用AES / GCM时不应两次使用初始化向量(IV)。我正在使用一个计数器作为初始化向量。每次发送新数据包时(我正在开发需要数据包加密的基于UDP的协议),我都会增加计数器并将其用作IV。

但是,由于我通常需要该协议来传输文件并在很长的一段时间内发送keepalive,因此原则上对于大文件,可以发送超过$ 2 ^ {32} $个数据包,或者多年来,可以发送$ 2 ^ {32} $个keepalive。为了保持IV始终唯一,我可能需要使用64位整数,但是每个数据包会增加4字节的开销,这可能会加起来非常大,如果不是绝对必要的话,我想避免。

所以我想知道:在AES / GCM中重用IV是多么糟糕?我能知道会有多危险吗?我的意思是:如果一旦我立即重复一次静脉输液后,我就很容易受到攻击,以至于我可以公开地公开我的钥匙,那么我必须采取对策。但是,如果仅当我多次使用同一IV时那才变得危险,那完全是另一回事。

评论

根据其定义IV不能重复使用。重用IV-不再是IV。那是因为IV必须是随机的。

#1 楼

甚至单个AES-GCM随机数重用也会造成灾难性的后果。这与两次填充相同。
在长达$ \ ell $的消息块中,在一次随机数重用之后,对手可以使用多项式根-将认证密钥缩小到$ \ ell $的可能性。查找并由此伪造具有高成功概率$ 1 / \ ell $的消息。


如何? $ \ ell $ -block消息是度数为\\ ell $的多项式,常数项为零;密钥$ r下的身份验证者s $是$ m \ mapsto m(r)+ s $,其中$ r $在消息之间重用,$ s $作为现时的秘密函数得出。对于同一随机数下的不同消息,找到身份验证者$ a = m(r)+ s $和$ a'= m'(r)+ s $,只有度数的$ {\ leq} \ ell $可能的根为- $ r $中的$ \ ell $多项式$ m(r)-m'(r)+ a'-a $是身份验证密钥的可能值。



使用96位随机数;如果不这样做,而是使用较小或较大的随机数,就好像您是随机选择随机数一样,可以安全处理的消息数量会急剧下降。但是,您当然可以将64位随机数填充为96位:重要的是随机数是唯一的。

如果32位随机数的成本过高, ,您可以定期重新输入密钥。例如,如果您首先建立了长期密钥$ k $,则可以在$ i ^ {\ mathit {th}} $时期使用$ \ operatorname {HMAC-SHA256} _k(i)$作为密钥,其中每个纪元涵盖40亿条消息,并且$ i $以某种规范的方式编码为位字符串。

#2 楼

一旦重用IV,您就会发现有人找到这两个纯文本的XOR,从而严重损害了他们的机密性。此外,使用GCM,单个IV重用会泄漏有关用于身份验证的密钥的大量信息;如果什至有几对重用的IV(甚至没有一个IV被多次使用;几个IV每个都被使用两次就足够了)会损害认证密钥。 GCM是流密码,如果身份验证机制失败(MAC是防止篡改的唯一方法),则完全具有延展性。

此外,如果使用非96位IV符合NIST规范的GCM。 NIST的GCM是为96位IV设计的,如果您指定一个不同长度的IV,则用于计算“实际” IV的功能将存在缺陷。

来源。

评论


$ \ begingroup $
我想补充一点,如果您担心IV重用的可能性(可能是由于处于随机性很差的平台上),则可以使用IV滥用防范方案。
$ \ endgroup $
–耶胡达·林德尔(Yehuda Lindell)
15年7月8日在8:06

$ \ begingroup $
@cpast谢谢!我一定会尽量避免重用。关于iv的长度不为96位的问题:我可以将其填充零吗?
$ \ endgroup $
–马特奥·蒙蒂
15年7月8日在14:25

$ \ begingroup $
@YehudaLindell我想按顺序使用IV,所以我认为我不应该担心随机碰撞。
$ \ endgroup $
–马特奥·蒙蒂
15年7月8日在14:26

$ \ begingroup $
实际上,如果您仅重复使用一次IV(用于不同的明文/ AAD),则攻击者可以将$ H $的可能值限制为少数值。
$ \ endgroup $
–雨披
2015年7月8日在16:44