我想从给定的 m -byte种子生成 n 随机字节。生成的序列必须可重现;对于相同的种子,必须生成相同的序列。 n 可以更高或更低,而不是 m 。
我想到的以下两个微不足道的方法都有偏见:
java.util.Random
生成器。 问题:如果n <8,则丢弃熵,因为Java中的默认随机种子长度为8个字节。有没有一种标准的方法可以做到这一点?我在java.security
中没有看到任何相关的类,但我想这是加密的基本需求?
注意:我不需要“加密级别额外安全”随机,只需随机传递基本统计随机性测试。此外,我更愿意依赖标准代码,而不是自己编写所有代码。
编辑:java.security.SecureRandom(byte[] seed)
不适合账单,生成的序列纯粹是随机的,不依赖于种子(至少在我的JVM上,但我想有可预测的结果)。
答案 0 :(得分:0)
对于记录,如上所述的一个(相当慢的)解决方案:
public byte[] rand(byte[] seed, int n) {
try {
byte[] data = null;
ByteArrayOutputStream ret = new ByteArrayOutputStream(n);
while (ret.size() < n) {
MessageDigest md = MessageDigest.getInstance("SHA1");
md.update(seed);
if (data != null)
md.update(data);
data = md.digest();
ret.write(data, 0, Math.min(n - ret.size(), data.length));
}
return ret.toByteArray();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
这会产生1M&#34;随机&#34;字节在~500ms,并通过非常基本的统计随机性测试。也许选择比SHA1更快的哈希会加速这个事情,没有调查过。