根据 Java 中的 m 字节种子生成 n 个随机字节
Generate n random bytes based on m-byte seed in Java
我想从给定的m字节种子生成n个随机字节].生成的序列必须可重现;对于相同的种子,必须生成相同的序列。 n 可以 高于 或 低于 米。
我想到的以下两种琐碎的方法是有偏见的:
- 散列 m 字节以创建一个长种子来提供新的
java.util.Random
生成器。 问题: 如果 n<8,我将丢弃熵,因为 Java 中的默认随机种子是 8 字节长。
- 散列 m 字节以生成一些 "random" 数据。 问题: 这个上限 n 到某个值(例如 SHA1 为 20)。
有标准的方法吗?我在java.security
中没有看到任何相关的class,但我猜这是对密码学的基本需求?
注意:我不需要"crypto-level extra-secure"随机数,只需要通过基本统计随机性测试的随机数。此外,我更喜欢依赖标准代码,而不是必须自己编写所有代码。
Edit: java.security.SecureRandom(byte[] seed)
不符合要求,生成的序列是纯随机的并且不仅仅依赖于种子(至少在我的 JVM 上是这样,但是我想要一个可预测的结果)。
郑重声明,上面讨论的(相当慢的)解决方案:
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);
}
}
这会在 ~500 毫秒内生成 1M "random" 字节,并通过非常基本的统计随机性测试。也许选择比 SHA1 更快的散列会加快速度,没有调查。
我想从给定的m字节种子生成n个随机字节].生成的序列必须可重现;对于相同的种子,必须生成相同的序列。 n 可以 高于 或 低于 米。
我想到的以下两种琐碎的方法是有偏见的:
- 散列 m 字节以创建一个长种子来提供新的
java.util.Random
生成器。 问题: 如果 n<8,我将丢弃熵,因为 Java 中的默认随机种子是 8 字节长。 - 散列 m 字节以生成一些 "random" 数据。 问题: 这个上限 n 到某个值(例如 SHA1 为 20)。
有标准的方法吗?我在java.security
中没有看到任何相关的class,但我猜这是对密码学的基本需求?
注意:我不需要"crypto-level extra-secure"随机数,只需要通过基本统计随机性测试的随机数。此外,我更喜欢依赖标准代码,而不是必须自己编写所有代码。
Edit: java.security.SecureRandom(byte[] seed)
不符合要求,生成的序列是纯随机的并且不仅仅依赖于种子(至少在我的 JVM 上是这样,但是我想要一个可预测的结果)。
郑重声明,上面讨论的(相当慢的)解决方案:
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);
}
}
这会在 ~500 毫秒内生成 1M "random" 字节,并通过非常基本的统计随机性测试。也许选择比 SHA1 更快的散列会加快速度,没有调查。