Java 使用安全随机生成一个长数

Java 使用安全随机生成一个长数,java,random,Java,Random,我已经在我的安全随机对象中植入了一个很长的数字。现在我想提取另一个长数字。但是只有一个名为nextBytes(byte[]b)的函数,它给出了一个随机的byte[] 有没有办法得到一个长号码? System.out.println(ranGen2.nextLong())//由Range2生成 结果: 4, -67, 69 4, -67, 69 -3292989024239613972 //this is using nextLong() -3292989024239613972

我已经在我的安全随机对象中植入了一个很长的数字。现在我想提取另一个长数字。但是只有一个名为
nextBytes(byte[]b)
的函数,它给出了一个随机的
byte[]

有没有办法得到一个长号码?

System.out.println(ranGen2.nextLong())//由Range2生成

结果:

4, -67, 69
4, -67, 69

   -3292989024239613972  //this is using nextLong()
-3292989024239613972 
Peter Lawrey代码的输出:(使用安全随机)

他们完全一样。你怎么能得到不同的号码?

这是我在使用Peter Lawrey的第二次更新后得到的输出(我使用的是windows操作系统,他似乎在使用其他操作系统,这造成了混乱)


SecureRandom扩展了Random,Random有一个
nextLong()
方法:

再次修订,这是正确的答案!(我应该听从自己的建议,更仔细地阅读文档)

你用的是什么?如果是这样,它将扩展Random,从而具有继承的nextLong()方法。当它覆盖next()时,所有典型的随机方法都将使用SecureRandom PRNG方法

(见注释中为什么我的第二个答案不正确..或者更不必要)

我建议创建一个long,只需使用接下来的8个字节或两个int(由next返回)组合它。这样做没有问题,我也看不出为什么你不能触摸所有的长值(想想两个32位的一半中的任何一个都可以有0到2^32的值,概率相等),或者为什么一个比另一个更可能(这意味着它不是伪随机的)


我不完全理解为什么随机文档指出nextLong()的限制,但我相信这是它所使用的线性算法的限制(我认为线性算法的周期比现代PRNG短得多,即当它们开始重复数字时)。出于好奇,我认为这值得在加密堆栈交换上探索。

注意:对于随机,给定的种子总是会产生相同的结果。有了SecureRandom,就不会了。种子只是增加了随机性

BigInteger randomNumber = new BigInteger(numBits, random);
您是否曾经使用过用户安全随机软件?种子的全部意义在于产生相同的数字序列。这也是安全随机的情况。两个具有相同值的安全随机数产生相同的随机数序列

先去试试吧


很好的建议,但在这种情况下,仅仅尝试一下并不总能给出完整的答案。

Random的种子值只有48位。它将如何生成128位的随机数(即安全随机数的大小)?这两件事并不像你想象的那样相关。伪随机数生成器可以生成与种子大小不直接相关的各种大小的输出。这完全取决于算法。你的种子所做的只是给系统增加熵。种子的值范围越大,你可能得到的熵就越多,但这并不影响你能产生多大的输出。流密码是伪随机输出比种子大得多的一个很好的例子。对于下层选民:你能解释一下你认为我的答案有什么错吗,或者提供一个替代解决方案吗?请参考此链接@AlexFlorescu:这个手动随机长生成将正是SecureRandom已经做的。阅读SecureRandom被命名为SecureRandom是有充分理由的。如果它的方法不能被安全地使用,它就不再安全了。:Random的种子值只有48位。它将如何生成128位的随机数(即安全随机数的大小)?@user1139023您只需看看实现。但其实很简单:将几个序列点连接在一起,得到一个更长的数字。这是
nextLong()
return((long)(next(32))的实际代码,仅供参考@Voo:由于类Random使用的种子只有48位,因此此算法不会返回所有可能的长值。请参阅此链接:如果使用SecureRandom,则除了种子和RNG引擎外,其他引擎都是SecureRandom引擎。拜托:名称是SecureRandom,它有一个nextLong()值。如果它不可用且不安全,你真的认为该方法会存在吗?或者至少你不认为javadoc中会出现一个大的红色警告吗?Sun的工程师比这更聪明。是的,我就是这么说的。读取:生成一个包含用户指定数量的伪随机位的整数(右对齐,带前导零)。此方法重写java.util.Random方法,并为从该类继承的所有方法(例如,nextInt、nextLong和nextFloat)提供随机位源。我已为您的评论添加了答案。@PeterLawrey:我已为我的问题添加了答案。@PeterLawrey:您在哪里?我也尝试了您的代码。请参阅我在问题中为您的代码获得的输出。@User116690:您使用的是安卓吗?Androids SecureRandom的行为与标准Java不同。@RasmusFaber:不,上面粘贴的代码用于在java中。但出于好奇,为什么它在android中会有不同的行为。@彼得·劳瑞:你不会得到相同的结果。我尝试了完全相同的代码,并在我的问题中打印了输出。去看看吧。我也执行了彼得的代码,我得到了他建议的输出类型:相同的种子,不同的输出。所以在我们开始ag之前也许你们都需要退后一步,想想我们可能遗漏了什么。是否存在版本差异或类似的问题?我想我已经找到了答案(本文帮助:)似乎SecureRandom将根据实现使用不同的PRNG,这就是为什么我猜测我们会看到不同的结果。我能够复制一些人看到的问题(使用相同的种子为不同的实例提供相同的输出)
-7580880967916090810 -7580880967916090810
7364820596437092015 7364820596437092015
6152225453014145174 6152225453014145174
6933818190189005053 6933818190189005053
-2602185131584800869 -2602185131584800869
-4964993377763884762 -4964993377763884762
-3544990590938409243 -3544990590938409243
8725474288412822874 8725474288412822874
-8206089057857703584 -8206089057857703584
-7903450126640733697 -7903450126640733697
SHA1PRNG appears to produce the same values with the same seed
The default PRNG on this system is SHA1PRNG
BigInteger randomNumber = new BigInteger(numBits, random);
public static void main(String... args) throws NoSuchProviderException, NoSuchAlgorithmException {
    testRNG("NativePRNG");
    testRNG("SHA1PRNG");
    System.out.println("The default PRNG on this system is " + new SecureRandom().getAlgorithm());
}

private static void testRNG(String prng) throws NoSuchAlgorithmException, NoSuchProviderException {
    SecureRandom sr1 = SecureRandom.getInstance(prng, "SUN");
    SecureRandom sr2 = SecureRandom.getInstance(prng, "SUN");
    sr1.setSeed(1);
    sr2.setSeed(1);
    for (int i = 0; i < 10; i++) {
        if (sr1.nextLong() != sr2.nextLong()) {
            System.out.println(prng + " does not produce the same values with the same seed");
            return;
        }
    }
    System.out.println(prng + " appears to produce the same values with the same seed");
}
NativePRNG does not produce the same values with the same seed
SHA1PRNG appears to produce the same values with the same seed
The default PRNG on this system is NativePRNG