首页 > 解决方案 > AES-128-cbc的IV在加解密时是否需要随机?

问题描述

我正在使用节点和加密模块来加密和解密一个大的二进制文件。我使用 crypto.createCipheriv 加密文件并使用crypto.createDecipheriv解密它。

对于加密,我使用如下随机 IV:

   const iv = crypto.randomBytes(16);
   const encrypt = crypto.createCipheriv('aes-128-cbc', key, iv)

我不明白的是,我还需要通过随机 IVcreateDecipheriv吗?这里的 SO说:

IV 需要相同才能进行加密和解密。

  1. IV可以是静态的吗?如果它不能,它是否被认为是一个秘密?我将IV存储在哪里?在有效载荷中?

  2. 如果我使用不同的随机 IV 进行加密和解密,我的有效负载会被解密,但前 16 个字节已损坏。这意味着,看起来 IV 需要相同,但从安全角度来看,除了 16 个字节之外,有效负载被解密也没有太大价值。

谁能详细说明首选方法是什么?谢谢你的帮助!

标签: encryptioncryptographyaescryptojscryptoapi

解决方案


Key+IV 对绝不能在使用 CBC 的两次加密上重复。这样做会泄漏有关第一个块的信息(在所有情况下),并且会创建重复的密文(如果您曾经两次加密相同的消息前缀,这将是一个问题)。

因此,如果您的密钥在每次加密时都发生了变化,那么您的 IV 可能是静态的。但没有人这样做。他们有一个可以重复使用的密钥。所以IV必须改变。

不要求它是随机的。它只是不应该重复并且它不能是可预测的(在攻击者可以控制消息的情况下)。随机是最简单的方法。随机以外的任何东西都需要大量的专业知识才能正确,所以使用随机。

在 CBC 中重用 Key+IV 对会削弱密码的安全性,但不会像在 CTR 中那样破坏它。与 CTR 一起重用的 IV 可能会导致微不足道的解密。在 CBC 中,它通常只是泄漏信息。这是一个严重的问题,但不是灾难性的。(并非所有不安全的配置都是一样的。)

IV不是秘密。每个人都可以知道。所以它通常被添加到密文中。


推荐阅读