c# - 是否有没有 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)
解决方案
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(密钥派生函数)。
推荐阅读
- flask-appbuilder - flask-appbuilder 和包含数据库实体列表的表单/批量编辑
- python - 使用 python 将字典发送到烧瓶服务器
- amazon-web-services - 禁用 AWS 代码提交上的批准按钮,直到 PR 被批准规则模板批准
- javascript - 获取图像宽度和高度在 vue js 中工作 50% 的时间
- sql-server - SQL 中的连续月份和间隔以获得最大连续月份和最大间隔月份
- flutter - Flutter:以编程方式监控 FPS、内存和 CPU 性能
- javascript - (NestJS, TypeORM) Javascript 承诺:Finally 块在此之前被调用
- azure-data-explorer - Kusto - 帮助编写 KQL Pivot
- ruby-on-rails - 避免在 Rails #where 中绑定变量
- fiddler - 复制、修改和发送请求 POST Fiddler