使用 AES 256 加密,我需要 IV 吗?

信息安全 AES
2021-08-10 11:06:44

我正在研究使用 256 位密钥使用 AES 进行加密,我注意到各种语言的许多方法,例如http://php.net/manual/en/function.openssl-encrypt.php,我注意到IV 参数是可选的。这是否意味着我可以使用单个 256 位字符串作为密钥完全实现 AES 加密/解密?IV 有什么用途,如果我省略它,安全性会显着降低吗?

为我的无知道歉,我首先被扔进了一项让我感到非常迷失方向的任务,试图把它拼凑起来:)

谢谢!

2个回答

假设您使用相同的密钥加密两条消息,两条消息以相同的 16 字节明文开头。(16 字节是 AES 的块大小,与密钥大小无关。)密文的第一个块是否相同?如果是这样,您已经向攻击者泄露了一些信息。此信息是否敏感取决于您的应用程序,但这已经是一个不好的迹象。如果加密泄漏的数量超过消息的符号,则说明它没有发挥作用。

IV 的基本思想是以有原则的方式在每条消息中添加一些随机内容。这如何工作取决于模式。(核心 AES 操作仅适用于 16 字节块。模式是一种将其扩展到更长消息的方法。)例如,使用CBC,每个块的加密是根据密钥、明文块和密文计算的上一个区块;对于第一个块,使用 IV 代替不存在的前一个块的密文。IV 通常与密文一起以明文形式发送,通常是在加密消息的前 16 个字节中发送。

CTR模式在技术上使用计数器而不是 IV,但在操作上它们的工作方式非常相似:发送者随机生成一个 16 字节的随机值,并在加密消息的开头发送。在 CTR 模式下,为另一条消息重用该值是灾难性的,因为 CTR 通过将明文与从密钥和计数器推导出的伪随机流进行异或运算来工作。如果您有两个使用相同计数器值的加密消息,则它们的 XOR 是两个明文的 XOR。

对选择不当的 IV 的攻击比我在这里列出的要多。为每条消息生成一个随机 IV(使用加密质量的随机生成器,与生成密钥相同),你会没事的。

有一个例外:如果您为每条消息生成一个新密钥,您可以选择一个可预测的 IV(所有位为 0 或其他)。您仍然需要使用带有 IV 的模式(ECB 不好,例如它会在明文中公开重复,因为两个相同的输入块将具有相同的加密)。不过,这种情况很少见(它是为了存储而不是为了通信而出现的)。

请注意,先验加密仅确保数据的机密性,而不是其完整性。根据您对数据的处理方式,这可能是个问题。特别是,如果攻击者可以提交临时密文进行解密,或者可以提供额外的明文进行加密,这可能会暴露一些信息。一些模式,如EAXGCM提供经过身份验证的加密:密文只有在真实时才会被解密。如果可能,请使用其中之一。

另请注意,AES-128 在实践中与 AES-256 一样安全

如果您对自己的工作不满意,请尝试使用一些高级库,而不是直接使用加密货币。

如果您只使用每个键一次,那么不使用 IV 就可以了。如果您多次使用一个密钥,则每次都应该使用不同的 IV,因此不会重复使用 (key, IV) 对。

IV 的确切要求取决于所选的链接模式,但随机 128 位值通常就可以了。您加密的每条消息都应该不同。将其与密文一起存储,通常作为前缀。