Encryption 初始化向量(IV)-更新频率

Encryption 初始化向量(IV)-更新频率,encryption,cryptography,encryption-symmetric,Encryption,Cryptography,Encryption Symmetric,这是一个非常简单的问题,涉及到初始化向量(IV),当将对称加密(例如AES)与CBC一起使用时 我的问题是:应该为每个新的明文更改IV,还是为每个新会话创建一个IV就足够了 目前,我正在使用java实现和Cipher类,我注意到它确实第一次创建了一个新的IV,但是同一个IV也用于以后的明文 也许有一些关于这个主题的阅读资料 谢谢:)在CBC中,为了获得最大的安全性,IV必须是不可预测的 Should the IV change for each new plaintext or does it

这是一个非常简单的问题,涉及到初始化向量(IV),当将对称加密(例如AES)与CBC一起使用时

我的问题是:应该为每个新的明文更改IV,还是为每个新会话创建一个IV就足够了

目前,我正在使用java实现和Cipher类,我注意到它确实第一次创建了一个新的IV,但是同一个IV也用于以后的明文

也许有一些关于这个主题的阅读资料


谢谢:)

在CBC中,为了获得最大的安全性,IV必须是不可预测的

Should the IV change for each new plaintext or
does it suffice to create one for each new session?
我不完全清楚你给“明文”和“会话”的含义

如果您的意思是,对于每个会话,都有一个新的、新的密钥,并且交换的数据被切碎,然后进行加密,那么CBC通常将应用于整个片段链,这意味着片段Pn-1的密文块可以用作片段Pn的IV。因此,整个疗程只需一次静脉注射

Perhaps there is some reading resources about this topic?
当然可以,第6.2节。

注意:此答案仅与CBC模式下的IV加密有关

您需要使用相同的密钥为每个单独的加密“会话”创建一个新的IV。对于要加密安全的IV,攻击者应该无法从随机数中辨别它。Java默认使用zero IV,这意味着您不应该重用密钥来创建其他密码文本

因此,不应该在不设置新IV的情况下重用会话。基本上,对于任何协议来说,唯一安全的是下面的源代码。有几种方法可以使用协议中的其他信息创建安全的IV,但我不会详细介绍

Cipher aes=Cipher.getInstance(“aes/CBC/PKCS5Padding”);
//对每个密码文本重复此操作
byte[]ivBytes=新字节[aes.getBlockSize()];
SecureRandom rnd=新的SecureRandom();
rnd.nextBytes(ivBytes);
aes.init(Cipher.ENCRYPT_模式,sk,新的IvParameterSpec(ivBytes));
//现在将ivBytes前置到输出,例如首先将其写入流
//移除并在接收侧使用as IV
[编辑]:忘记了这个的简写符号:

aes.init(Cipher.ENCRYPT_模式,sk,new SecureRandom());
byte[]ivBytes=aes.getIV();

请注意,上面的代码不提供完整性保护。

我认为“会话”是指每组N次
update()
和单个
doFinal()
方法调用。我能确认一下吗?是的,请原谅我的混淆;对于session,我指的是owlstead(在上面的注释)对它的解释。请注意,Java并不总是有关于加密的最高级API,因为它很可能在每次调用init时错误地执行密钥扩展方法。谢谢!最后,我使用了您建议的同一种速记符号。不过,请注意填充oracle攻击,CBC不能防止它,这意味着攻击者可以在大约每字节128次尝试后看到您的纯文本。@MaartenBodewes如果CBC不能防止填充oracle攻击,我应该使用什么?什么是最安全的加密选项?谢谢。因为Java实现了GCM模式,它提供了对密文和明文的身份验证/完整性保护。这是一种集成MAC的模式。它根本不需要填充,但它会在密文中输出一个身份验证标记(在Java解释中,该标记是密文的一部分)。