无需 IV 的 AES 256 加密/解密

问题描述 投票:0回答:3

我正在开发一个与位于 VPS 上的数据库通信的应用程序。 我需要在数据库中存储使用 AES-256 加密的信息。

如果我是正确的,当我加密时,会生成一个 IV 参数,并且每次加密都不同。但是,当我解密时,我没有这个参数,因为我只有密钥和数据库中的加密文本。

我可以做什么来解决这个问题?

encryption cryptography aes
3个回答
8
投票

您必须将初始化向量存储在某处。因为从概念上讲,在 CBC 模式中,IV 是密文的“第零”块,因此有些人将其存储为密文的前缀。然而,大多数低级解密库并不期望这一点,因此应用程序通常需要提供一个包装器,用于处理在加密后添加此前缀并在解密前将其删除。

理想情况下,您应该使用一些元数据来存储加密值,这些元数据指定所使用的加密算法、所需的任何参数,并指示使用什么密钥(请注意下面!)。这将包括使用 CBC 的分组密码的 IV。其标准格式是加密消息语法,或 PKCS #7。因为它是一个标准,所以您可能有多种选择来使用开源库来处理该格式。

通过包含此元数据,您可以执行诸如随时间轮换密钥或将数据迁移到新算法之类的操作。您不必使用相同的密钥以相同的方式加密每个值。

注意:当然,当我说元数据指示所使用的密钥时,这并不意味着包含密钥本身!对于预共享密钥,它只是一个标签,告诉您大密钥环上的哪个密钥将解密有效负载。对于基于密码的加密,将提供有关如何从隐含密码派生正确密钥的信息。


4
投票
您可以将 IV 与密文连接起来(其长度已知且恒定),也可以将它们相邻存储在数据库中。 IV 并不是什么秘密;它只是确保每次加密时块密码的初始化都不同,这样暴力破解一个文件就不会危及所有其他文件。


0
投票
如果没有 IV,您将无法解密消息的前 16 个字节,但您将能够解密其余部分。如果您在加密之前

开始时填充随机 16 个字节,然后使用随机 IV(可以与加密所用的不同)解密之后,删除前 16 个字节,剩下的就是您的原始消息。 PS:如果这听起来不对,我知道,只是谦虚地争论同样的事情。尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.