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

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

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

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

我应该做一些完全随意的事情,比如从内存中拉出16个随机字节 或者是否有一种产生足够随机初始化向量的首选方法?

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

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

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

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

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

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

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

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

正如其他答案暗示的那样,使用安全的随机数生成器来创建IV。

尽管如此,您不需要通过安全通道发送IV – 通常只是将其添加到消息中。 请记住,为每条消息使用新的IV比保持IVs保密更为重要。 在密钥的同时预先共享IV并不意味着您重新使用IV(不良),或者限制您可以发送的消息数量。

如果您正在使用GUI或者您可以访问用户数据输入硬件(首选鼠标)的系统调用,则可以在用户移动时创建一对鼠标指针坐标向量。 将它们添加到某个字符串。 比在字符串上使用您喜欢的哈希函数来创建具有高熵的完全随机IV。