3

我目前正在使用 AES (256) 和 CBC 模式来加密数据。我将初始化向量与加密数据一起存储。现在我只是将 IV 添加到加密数据的开头,然后在解密时将其作为硬编码的字节长度读入。

如果以后初始化向量长度发生变化,这个方法就会失效。

所以我的问题是:

将来更长的 AES 密钥大小 = 更长的 IV 吗?或者,换句话说,未来 AES 的块大小会发生变化吗?

如果是这样,处理这个问题的最佳方法是什么?使用第一个字节作为 IV 有多长的指示符,然后读入那么多字节?

4

3 回答 3

4

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 - 不要忘记也使用消息验证码,否则您将面临各种简单的消息修改攻击。

于 2011-06-15T16:52:26.277 回答
2

初始化向量的目的是使第一个块随机化,这样用相同的密钥加密两次的相同数据不会产生相同的输出。

从信息论的角度来看,AES“只有”2^128 个不同的 IV,因为这些都是您可能与第一块实际数据进行异或的所有可能随机值。因此,没有任何理由让 IV 大于密码的块大小。

更大的块大小可以证明更大的 IV 是合理的。较大的密钥大小不会。

根据定义,更大的块大小将意味着不同的算法。因此,无论您如何标记数据以指示您正在使用什么算法,这就是您将如何判断要使用的块大小(以及 IV 大小)的方式。

于 2011-06-16T05:23:59.863 回答
0

作为替代解决方案,您可以切换到 AES-CTR 模式。计数器模式需要一个 Nonce,但 Nonce 不必与 AES 块大小相关联。如果 AES 块大小增加(不太可能,正如 Jack 所说),那么您可以保留相同大小的 Nonce。

于 2011-07-17T12:09:21.010 回答