2

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

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

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

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

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

谢谢!

4

1 回答 1

0

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

于 2018-08-09T10:15:05.303 回答