首页 > 解决方案 > 是否有没有 IV 的 AES-128 CBC 加密?

问题描述

我正在尝试开发一个需要 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) 

标签: c#encryptionopensslcryptography

解决方案


iv 是可选的还是有默认的 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?</p>

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


推荐阅读