AES-128-cbc的IV在加解密的时候需要随机吗?
Does the IV of AES-128-cbc need to be random during encryption and decryption?
我正在使用节点和加密模块来加密和解密大型二进制文件。我使用 crypto.createCipheriv and decrypt it using crypto.createDecipheriv.
加密文件
对于加密,我使用如下随机 IV:
const iv = crypto.randomBytes(16);
const encrypt = crypto.createCipheriv('aes-128-cbc', key, iv)
我不明白的是,我还需要为 createDecipheriv
传递随机 IV 吗? SO 说:
The IV needs to be identical for encryption and decryption.
IV 可以是静态的吗?如果不能,它是否被认为是秘密?我应该把 IV 存放在哪里?在有效负载中?
如果我使用不同的随机 IV 进行加密和解密,我的有效负载会被解密,但前 16 个字节已损坏。这意味着,看起来 IV 需要相同,但从安全角度来看,除了 16 个字节外,有效载荷被解密也没有太大价值。
谁能详细说明首选方法是什么?感谢您的帮助!
绝不能在使用 CBC 的两次加密中重复密钥 + IV 对。这样做会泄漏有关第一个块的信息(在所有情况下),并且会创建重复的密文(如果您曾两次加密相同的消息前缀,这将是一个问题)。
因此,如果每次加密时您的密钥都发生变化,那么您的 IV 可能是静态的。但没有人这样做。他们有一把可以重复使用的钥匙。所以IV必须改变。
没有要求是随机的。它只是不应该重复,并且它不能是可预测的(在攻击者可以控制消息的情况下)。随机是最简单的方法。除了随机之外的任何东西都需要大量专业知识才能正确,所以使用随机。
在 CBC 中重复使用 Key+IV 对会削弱密码的安全性,但不会像 CTR 中那样破坏它。与 CTR 一起重用的 IV 会导致微不足道的解密。在 CBC 中,它通常只是泄露信息。这是一个严重的问题,但不是灾难性的。 (并非所有不安全的配置都是一样的。)
IV 不是秘密。每个人都可以知道。所以它通常放在密文前面。
出于安全原因,需要选择 IV 以满足加密随机性安全要求(即在节点中使用 crypto.randomBytes( )
)。这显示在 Phil Rogaway's research paper 中。摘要在论文的图1.2中,我抄录在这里:
CBC (SP 800-38A): An IV-based encryption scheme, the mode is secure as a probabilistic encryption scheme, achieving indistinguishability from random bits, assuming a random IV. Confidentiality is not achieved if the IV is merely a nonce, nor if it is a nonce enciphered under the same key used by the scheme, as the standard incorrectly suggests to do.
实现此目的的正常方法是将 IV 包含在密文前面。接收方提取IV,然后解密密文。 IV 不是秘密,它只是用来为操作模式带来必要的安全属性。
但是,请注意,使用 CBC 加密并不能防止人们篡改数据。如果攻击者在一个块中摆弄密文位,它会影响 two plaintext blocks,其中一个是在非常受控的方式下。
长话短说,GCM 是使用 防止此类滥用的更好模式。在这种情况下,您不需要随机 IV,但绝不能让 IV 重复(在密码学中,我们称此 属性 为“随机数”)。 Luke Park 给出了一个如何实现它的例子,here。他对 nonce 使用随机性,这实现了 nonce 属性 用于所有实际目的(除非你正在加密 2^48 文本,这是非常大的)。
但是无论您使用何种模式,您都绝不能为给定的密钥重复 IV,这是一个非常常见的错误。
我正在使用节点和加密模块来加密和解密大型二进制文件。我使用 crypto.createCipheriv and decrypt it using crypto.createDecipheriv.
加密文件对于加密,我使用如下随机 IV:
const iv = crypto.randomBytes(16);
const encrypt = crypto.createCipheriv('aes-128-cbc', key, iv)
我不明白的是,我还需要为 createDecipheriv
传递随机 IV 吗? SO
The IV needs to be identical for encryption and decryption.
IV 可以是静态的吗?如果不能,它是否被认为是秘密?我应该把 IV 存放在哪里?在有效负载中?
如果我使用不同的随机 IV 进行加密和解密,我的有效负载会被解密,但前 16 个字节已损坏。这意味着,看起来 IV 需要相同,但从安全角度来看,除了 16 个字节外,有效载荷被解密也没有太大价值。
谁能详细说明首选方法是什么?感谢您的帮助!
绝不能在使用 CBC 的两次加密中重复密钥 + IV 对。这样做会泄漏有关第一个块的信息(在所有情况下),并且会创建重复的密文(如果您曾两次加密相同的消息前缀,这将是一个问题)。
因此,如果每次加密时您的密钥都发生变化,那么您的 IV 可能是静态的。但没有人这样做。他们有一把可以重复使用的钥匙。所以IV必须改变。
没有要求是随机的。它只是不应该重复,并且它不能是可预测的(在攻击者可以控制消息的情况下)。随机是最简单的方法。除了随机之外的任何东西都需要大量专业知识才能正确,所以使用随机。
在 CBC 中重复使用 Key+IV 对会削弱密码的安全性,但不会像 CTR 中那样破坏它。与 CTR 一起重用的 IV 会导致微不足道的解密。在 CBC 中,它通常只是泄露信息。这是一个严重的问题,但不是灾难性的。 (并非所有不安全的配置都是一样的。)
IV 不是秘密。每个人都可以知道。所以它通常放在密文前面。
出于安全原因,需要选择 IV 以满足加密随机性安全要求(即在节点中使用 crypto.randomBytes( )
)。这显示在 Phil Rogaway's research paper 中。摘要在论文的图1.2中,我抄录在这里:
CBC (SP 800-38A): An IV-based encryption scheme, the mode is secure as a probabilistic encryption scheme, achieving indistinguishability from random bits, assuming a random IV. Confidentiality is not achieved if the IV is merely a nonce, nor if it is a nonce enciphered under the same key used by the scheme, as the standard incorrectly suggests to do.
实现此目的的正常方法是将 IV 包含在密文前面。接收方提取IV,然后解密密文。 IV 不是秘密,它只是用来为操作模式带来必要的安全属性。
但是,请注意,使用 CBC 加密并不能防止人们篡改数据。如果攻击者在一个块中摆弄密文位,它会影响 two plaintext blocks,其中一个是在非常受控的方式下。
长话短说,GCM 是使用 防止此类滥用的更好模式。在这种情况下,您不需要随机 IV,但绝不能让 IV 重复(在密码学中,我们称此 属性 为“随机数”)。 Luke Park 给出了一个如何实现它的例子,here。他对 nonce 使用随机性,这实现了 nonce 属性 用于所有实际目的(除非你正在加密 2^48 文本,这是非常大的)。
但是无论您使用何种模式,您都绝不能为给定的密钥重复 IV,这是一个非常常见的错误。