我确信这个问题没有一个答案,只是试图找出一般方法。
使用Java 1.4.2,我需要生成一个密钥和IV,以便在对称算法中使用。这些值将通过安全通道与收件人预先共享。
我可以使用KeyGenerator.keyGenerate()生成密钥。但除非我错过它,否则没有生成随机IV的功能。
我应该做一些完全随意的事情,比如从内存中拉出16个随机字节吗?或者是否有一种生成足够随机初始化向量的首选方法?
答案 0 :(得分:13)
这取决于您使用密码的模式。如果您正在使用CBC,只要您的RNG良好,SecureRandom
中的字节是最简单的,也可能是最安全的......
大多数Java提供程序会自动生成所需的参数,但为了让您了解所选的内容,您需要了解密码和模式。例如,如果您使用的是需要IV的模式,则可以执行以下操作:
cipher.init(Cipher.ENCRYPT_MODE, secret);
IvParameterSpec spec =
cipher.getParameters().getParameterSpec(IvParameterSpec.class);
byte[] iv = spec.getIV();
这允许提供者选择合适的方法来生成IV本身。但是如果你在使用ECB模式的密码上使用相同的方法,它就会失败。
使用计数器模式显然需要非常小心,以避免重复使用计数器。
答案 1 :(得分:7)
对于某些实现,SecureRandom类将通过生成真正的随机数来帮助您:
许多SecureRandom实现都是 以伪随机数的形式 发电机(PRNG),这意味着它们使用 一种确定性的算法来产生一个 来自真实的伪随机序列 随机种子。其他实现可能 产生真正的随机数,然而 其他人可能会使用两者的组合 技术。
它有两个方法getProvider()
和getAlgorithm()
,它们可以为您提供有关使用哪个实现的一些信息。从this page看来,伪随机生成器SHA1PRNG(用真正的随机数据播种)似乎是其中之一,甚至是当前唯一可用的。
答案 2 :(得分:6)
正如其他答案暗示的那样,使用安全的随机数生成器来创建IV。
尽管如此,您不需要通过安全通道发送IV - 通常只是将其添加到消息中。请记住,对于每条消息使用新的IV比使用IV保密的更强远更重要。在密钥的同时预先共享IV而不是重新使用IV(坏),或者限制您可以发送的消息数。
答案 3 :(得分:1)
如果您正在使用GUI或者您可以访问用户数据输入硬件(首选鼠标)的系统调用,则可以在用户移动时创建一对鼠标指针坐标向量。将它们添加到某个字符串。比在字符串上使用您喜欢的哈希函数来创建具有高熵的完全随机IV。