【问题标题】:Will Initialization Vectors grow in size in the future?初始化向量在未来会变大吗?
【发布时间】:2011-06-15 15:45:11
【问题描述】:
我目前使用 AES (256) 和 CBC 模式来加密数据。我将初始化向量与加密数据一起存储。现在我只是将 IV 添加到加密数据的开头,然后在解密时将其作为 硬编码 字节长度读取。
如果以后初始化向量长度发生变化,这个方法就会失效。
所以我的问题是:
将来会更长的 AES 密钥大小 = 更长的 IV 吗?或者换句话说,未来AES的块大小会发生变化吗?
如果是这样,最好的处理方法是什么?使用第一个字节作为 IV 长度的指示符,然后读取那么多字节?
【问题讨论】:
标签:
cryptography
aes
initialization-vector
【解决方案1】:
Rijndael 确实支持更大的块大小,但 AES 目前固定为 128 位块。 NIST 对较大的 Rijndael 块大小进行标准化似乎相对不太可能,因为这实际上是一种全新的算法,尚未被任何人实施。如果 NIST 认为需要更大尺寸的分组密码,则很可能会举办一场新的竞赛。
但是,我建议您在消息的开头附近添加某种算法标识符(您只需要一个字节),而不是 IV 长度,这不仅可以为您提供灵活性处理更大的 IV,但也可以在未来以其他方式扩展您的格式,例如新算法。例如 0 == AES-256/CBC、1 == AES-256/GCM、2=AES-2.0/CBC、3=AES-256/CBC 在某处带有特殊的额外标头,等等。
PS - 不要忘记也使用消息验证码,否则您将面临各种简单的消息修改攻击。
【解决方案2】:
初始化向量的目的是使第一个块随机化,这样用相同的密钥加密两次的相同数据不会产生相同的输出。
从信息论的角度来看,AES“只有”2^128 个不同的 IV,因为这些都是您可能与第一块实际数据进行异或的所有可能随机值。所以没有任何理由让 IV 大于密码的块大小。
更大的块大小可以证明更大的 IV 是合理的。较大的密钥大小不会。
根据定义,更大的块大小将意味着不同的算法。因此,无论您如何标记数据以表明您正在使用什么算法,这就是您将如何判断要使用的块大小(以及 IV 大小)的方式。
【解决方案3】:
作为替代解决方案,您可以切换到 AES-CTR 模式。计数器模式需要一个 Nonce,但 Nonce 不必与 AES 块大小相关联。如果 AES 块大小增加(不太可能,正如 Jack 所说),那么您可以保留相同大小的 Nonce。