基于Java

时间:2015-06-15 07:54:02

标签: java random random-seed

我想从给定的 m -byte种子生成 n 随机字节。生成的序列必须可重现;对于相同的种子,必须生成相同的序列。 n 可以更高更低,而不是 m

我想到的以下两个微不足道的方法都有偏见:

  • 散列 m 字节以创建一个长种子来提供新的java.util.Random生成器。 问题:如果n <8,则丢弃熵,因为Java中的默认随机种子长度为8个字节。
  • 散列 m 字节以生成一些“随机”数据。 问题:此上限 n 为某个值(例如,对于SHA1为20)。

有没有一种标准的方法可以做到这一点?我在java.security中没有看到任何相关的类,但我想这是加密的基本需求?

注意:我不需要“加密级别额外安全”随机,只需随机传递基本统计随机性测试。此外,我更愿意依赖标准代码,而不是自己编写所有代码。

编辑java.security.SecureRandom(byte[] seed)不适合账单,生成的序列纯粹是随机的,不依赖于种子(至少在我的JVM上,但我想有可预测的结果)。

1 个答案:

答案 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更快的哈希会加速这个事情,没有调查过。