是否有没有 IV 的 AES-128 CBC 加密?

Is there a AES-128 CBC encryption without IV?

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

我正在徘徊是否有像这样的 aes-128-cbc 加密方法的协议:

string Encrypt(string plainText, string encryptKey)

string Decrypt(string cipher, string encryptKey) 

Is iv optional or is there a default iv?

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

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

But didn't mention about how to provide a iv.

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

您也可以将 IV 作为不同的参数或有效负载元素单独发送,直到它到达需要 IV 来解密密文的收件人之前都没关系。

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

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

I nontice in openssl the encrypt text always start with 'Salted__'. Is that a agreement? And how does it save IV?

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