重用密码但改变IV

时间:2016-11-18 06:55:52

标签: java encryption initialization-vector

出于性能原因,我们希望尽可能重用我们的Cipher对象(java)作为给定的密钥。但是,我们希望遵循良好的加密卫生,并在每组明文上使用随机IV进行加密。是否有可能重用相同的密码对象,更改IV,并且每次都不重新初始化密码对象(即,仅在开始时初始化一次)?我希望它在每次doFinal调用后使用新的IV。如有必要,我可以在每次doFinal调用后手动设置它。

我考虑过扩展IVParameterSpec并覆盖getIV方法,以便每次都生成一个随机的方法,但是,我有两个问题:

  1. 在实践中可能不是一个问题,但我怎么知道给定的CipherSpi对象对于给定的明文不会调用两次?对于给定的明文,我需要返回相同的IV,但对于不同的明文,我需要返回不同的IV。我想大多数提供商都不会这两次打电话,但我肯定不知道。

  2. 查看CipherSpi文档,看起来它在初始化时传递了IVParameterSpec,我不知道提供者是否会立即获得IV,然后在对象的生命周期内缓存它。如果它这样做那么IV将始终是相同的,无论加密的明文是否不同。

  3. 是否有不同的方法来重用Cipher对象,但在每次不需要重新初始化的doFinal调用之后更改IV?我知道像SIV这样的某些模式的IV要求不那么严格,但现在不是一个选择。此外,我知道我可以选择一个可能支持上述解决方案的特定提供商,但我希望提供一个与提供商无关的解决方案。

    谢谢!

1 个答案:

答案 0 :(得分:0)

根据我的理解,您可以使用固定的初始化向量,并为每个消息添加随机字节前缀。每个消息都有额外的AES调用开销,但是这与初始化Cipher所需的时间没有任何区别。以我为例,使用随机前缀的方法要快大约100倍(用Cipher中的ThreadLocal在16个线程中加密和解密6-128长的消息)。