我应该如何生成初始化向量?

2022-09-03 18:32:07

我相信这个问题没有一个答案,只是试图找出一个通用的方法。

使用Java 1.4.2,我需要生成一个密钥和IV以用于对称算法。这些值将通过安全通道与收件人预先共享。

我可以使用KeyGenerator.keyGenerate()生成的密钥。但除非我错过了它,否则没有生成随机IV的函数。

我应该做一些完全任意的事情,比如从内存中提取16个随机字节吗?或者有没有一种首选方法来生成足够随机的初始化向量?


答案 1

这取决于您使用密码的模式。如果您使用的是CBC,则来自a的字节是最简单,也可能是最安全的...只要你的RNG是好的。SecureRandom

大多数Java提供程序会自动生成所需的参数,但是为了让您弄清楚选择了什么,您需要了解密码和模式。例如,如果您使用的是需要 IV 的模式,则可以执行以下操作:

cipher.init(Cipher.ENCRYPT_MODE, secret);
IvParameterSpec spec = 
   cipher.getParameters().getParameterSpec(IvParameterSpec.class);
byte[] iv = spec.getIV();

这允许提供者选择合适的方法来生成IV本身。但是,如果您要使用ECB模式对密码使用相同的方法,它将失败。

使用计数器模式显然需要非常小心,以避免重复使用计数器。


答案 2

对于某些实现,SecureRandom 类将通过生成真正的随机数来帮助您:

许多 SecureRandom 实现采用伪随机数生成器 (PRNG) 的形式,这意味着它们使用确定性算法从真正的随机种子生成伪随机序列。其他实现可能会产生真正的随机数,而其他实现可能会结合使用这两种技术。

它有两种方法,它们应该为您提供有关使用哪种实现的一些信息。从这个页面来看,伪随机生成器SHA1PRNG(用真正的随机数据播种)似乎是其中之一,甚至是当前唯一可用的。getProvider()getAlgorithm()


推荐