【问题标题】:AES 256 Encryption/Decryption without IV没有 IV 的 AES 256 加密/解密
【发布时间】:2023-04-06 04:34:01
【问题描述】:

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

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

我能做些什么来解决这个问题?

【问题讨论】:

  • 您是否将同一个密钥用于多个加密操作?
  • 是的,我使用相同的密钥来加密数据库上的每个数据
  • IV 不是秘密值;您可以将其与每个加密值一起明文存储
  • 您应该在问题中指定操作模式(例如CBC或CTR)。当前的答案假定为 CBC,但我在问题中没有看到任何暗示这就是正在使用的内容。
  • 如果您无法将 IV 存储在任何地方,那么您可以考虑使用格式保留加密 (FPE)。

标签: encryption cryptography aes


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您可以将 IV 与密文连接起来(它的长度是已知且恒定的),或者您可以将它们彼此相邻地存储在数据库中。 IV 不是秘密。它只是确保在每次加密时对分组密码进行不同的初始化,以便暴力破解一个文件解密不会危及所有其他文件。

    【讨论】:

    • “因此暴力破解一个文件解密不会危及所有其他文件”显然是错误的。蛮力强制意味着检索密钥(对于 AES 来说这几乎是不可能的,给定一个精心选择的密钥)。如果攻击者知道密钥,其他密文也将被泄露。对于 CBC 模式,重复 IV 意味着您可以将(部分)相同的明文与(部分)相同的密文区分开来。例如CTR 模式的影响会更大,甚至会导致机密性失效。
    • 不。 IV 是链式密码的“零”块。 IV 需要 (1) 随机的,(2) 不可预测的,但 (3) 不是秘密的。 stackoverflow.com/questions/5796954/…
    • 完全正确。需要一个唯一的 IV 以便“强制一个文件解密不会危及所有其他文件”这一事实是不正确的。如果您重复使用 IV,您将能够通过简单的 XOR'ing 破坏 CTR 模式,但这种攻击不会是暴力破解。暴力破解是为了找到分组密码排列的正确密钥。当攻击者找到密钥时,IV 不会保护任何东西。不过好吧,看来你没有混淆 IV 和 salt,所以我将删除该评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多