【问题标题】:Is there a AES-128 CBC encryption without IV?是否有没有 IV 的 AES-128 CBC 加密?
【发布时间】:2021-02-13 01:13:09
【问题描述】:

我正在尝试开发一个需要 aes-128-cbc 来加密文本的 http 服务器。 要求是使用 aes-128-cbc 和 aes-key 加密文本。但是没有 提及如何提供iv。 iv 是可选的还是有默认的 iv?

如果有这样的aes-128-cbc加密方法的协议,我正在徘徊:

string Encrypt(string plainText, string encryptKey)

string Decrypt(string cipher, string encryptKey) 

【问题讨论】:

  • IV 每次都应该是唯一的,所以它可能是随机生成的。通常它被预先添加到未加密的二进制密文中,因此解密方法可能只是在解密之前从 blob 中读取它。真的应该没有理由指定特定的 IV...
  • 现在我知道 IV 是必要且随机的。但这是否意味着 IV 应该在我们提到它的前 16 位加密文本中,就像数学中的 1+1=2 一样?我在 openssl 中注意到加密文本总是以“Salted__”开头。那是协议吗?又是怎么救IV的?
  • 将完全取决于实现...en.wikipedia.org/wiki/Initialization_vector

标签: c# encryption openssl cryptography


【解决方案1】:

iv 是可选的还是有默认的 iv?

IV 允许安全地重复使用相同的加密密钥来加密多个输入。重复使用相同的密钥进行加密(没有 IV)可能会完全揭示明文或密钥,具体取决于密码和模式。

如果您对每条消息使用不同的密钥,则 IV 理论上可能是静态的。但是 - 我还是建议使用随机 IV。如果您对多条消息使用相同的密钥,那么您肯定需要一个随机且不可预测的 IV。

但没有提到如何提供静脉注射。

IV 通常需要是唯一的。一些加密模式有更高的要求,因为你使用的 CBC 模式需要是不可预测的 - 比随机更强的术语。 (谢谢凯拉卡)。通常 IV 被添加到密文之前,因为它具有固定长度(AES 为 16 个字节)并且需要用于解密。这是一种普遍的做法,但不是任何法律。常用的格式是<IV><ciphertext><hash>

您也可以将 IV 作为不同的参数或有效负载元素单独发送,直到它到达需要 IV 解密密文的接收者才重要。

有一些用于传递 IV、密文和身份验证的标准(JWE、WS-Security、PKCS#7、CMS 等),但通常这些标准需要复杂性和开销,对于简单的用例来说,通过IV 和密码以与消息消费者商定的格式。如果您想要标准化和简单的东西,我会为 JWE 担保。

顺便说一句:我看到通常会忽略身份验证哈希 (hmac),它确保密文不会更改。

我没有注意到 openssl 中的加密文本总是以“Salted__”开头。那是协议吗?又是如何拯救IV的?

Openssl 使用Salted__<8 byte salt><ciphertext> 格式,然后从提供的密码和盐生成加密密钥和IV。旧版本使用 EVP_BytesToKey 函数,新版本使用不同的 KDF(密钥派生函数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2018-03-25
    • 2016-12-05
    • 2022-12-16
    • 2013-08-11
    • 2011-07-03
    • 2019-08-17
    相关资源
    最近更新 更多