2009-11-23 92 views
14

我确定这个问题没有一个答案,只是试图找出一个通用的方法。我应该如何生成一个初始化向量?

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

我可以KeyGenerator.keyGenerate生成密钥()。但是,除非我错过了它,否则不会生成随机IV。

我应该做的事情完全是任意像记忆拉16个随机字节?还是有一种生成足够随机的初始化向量的首选方法?

任何指导赞赏。

回答

7

对于一些具体实施中,SecureRandom类会帮助你通过产生真正的随机数:

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

它有两种方法,getProvider()getAlgorithm(),它应该给你一些关于使用哪种实现的信息。从this page看来,伪随机生成器SHA1PRNG(它是真正的随机数据种子)是其中之一,甚至是目前唯一可用的。

+1

@schnaader - nit-pick - SHA1PRNG不是真正的RNG。这是一个PRNG(根据您链接的页面)一个真正的随机种子。 – 2009-11-24 01:53:24

+0

你是对的,编辑答案。 – schnaader 2009-11-24 06:45:31

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模式下使用相同的密码方法,它会失败。

使用显然是一个计数器模式需要非常谨慎,以避免重复使用计数器。

6

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

正如旁白虽然,你并不需要通过安全通道来发送IV - 它通常只是它,预先准备的消息。请记住,它是远远更重要的是,您使用每个消息新鲜的IV,比你保持IVs秘密。同时预先共享IV,因为密钥意味着要么重复使用IV(坏),要么限制您可以发送的消息数量。

1

如果使用GUI或可以访问系统调用用户数据输入硬件(小鼠优选的)可以创建对鼠标指针的向量坐标作为用户移动它。将它们添加到一些字符串。比使用你最喜欢的哈希函数的字符串来创建完全随机的IV与高熵。