Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SecureRandom中正确使用setSeed()方法生成RSA素数_Java_Random_Cryptography_Rsa - Fatal编程技术网

Java 如何在SecureRandom中正确使用setSeed()方法生成RSA素数

Java 如何在SecureRandom中正确使用setSeed()方法生成RSA素数,java,random,cryptography,rsa,Java,Random,Cryptography,Rsa,我想为RSA密钥生成生成两个素数。我认为,为了增加两个素数的随机性,随机性可以如下生成: SecureRandom r = SecureRandom.getInstance("SHA1PRNG"); r.setSeed(1232); p = BigInteger.probablePrime(1024, r); q = BigInteger.probablePrime(1024, r); 我的问题是:你认为使用SecureRandom会增加p和q的随机性吗?如果是这样,我如何随机设置setSee

我想为RSA密钥生成生成两个素数。我认为,为了增加两个素数的随机性,随机性可以如下生成:

SecureRandom r = SecureRandom.getInstance("SHA1PRNG");
r.setSeed(1232);
p = BigInteger.probablePrime(1024, r);
q = BigInteger.probablePrime(1024, r);

我的问题是:你认为使用
SecureRandom
会增加
p
q
的随机性吗?如果是这样,我如何随机设置
setSeed()
的值,而不是将其设置为固定值(这里我选择了1232)?

正如CodesInChaos已经显示的那样,SUN provider的默认实现使用系统随机数生成器自动进行种子设定。由于Java本身没有(明确的)熵源,它或多或少地依赖于系统作为其种子

在从SUN提供程序中的
“SHA1PRNG”
检索数据之前,千万不要调用
setSeed
,因为这将使您的RNG(随机数生成器)成为确定性RNG-它将只使用给定的种子,而不是将种子添加到状态。换句话说,它将始终生成相同的伪随机比特或值流

setSeed
的初始调用可能因提供程序而异。有时它会将种子用作唯一的种子,但也可能只是将种子添加到当前状态。在以后的Android版本(4.2以后)中,种子只是添加到随机状态,因此
“sha1rn”
将保持完全随机

也许生成随机数生成器的最佳方法就是

SecureRandom r = new SecureRandom();
让Java运行时找出最好的


如果您想使用显式算法(但SUN/Oracle对此描述不清),则可以使用:

SecureRandom r = SecureRandom.getInstance("SHA1PRNG");
就像你的代码一样

现在,还可以使用NIST算法,使用
“DRBG”
作为算法描述,然后可以使用安全属性为VM配置

无论是
“SHA1PRNG”
还是
“DRBG”
都不是实现要求,并且每个运行时/提供者使用的算法或它们的种子方式可能不同。我永远不会使用它们来重新生成以前生成的字节或值流;请使用流密码。例如,您可以将密码实例
cipher
用于
“AES/CTR/NoPadding”
并加密零值字节以获取密钥流


如果要添加熵,请使用:

// just used to make sure that the SecureRandom is seeded by the OS
r.nextBytes(new byte[8]);
r.setSeed(1232);
常量值或文本不包含太多(如果有的话)熵。熵的通常来源是当前时间(或者更好的,
System.nanoTime()
),鼠标移动等


对于Java 8,有一个新方法,其描述如下:

返回使用SecureRandom.strongAlgorithms安全属性中指定的算法/提供程序选择的SecureRandom对象

有些情况需要强随机值,例如在创建高价值/长寿命的秘密(如RSA公钥/私钥)时。为了帮助指导应用程序选择合适的强SecureRandom实现,Java发行版在
SecureRandom.strongAlgorithms
Security属性中包含了已知的强SecureRandom实现列表


应将其用作对构造函数调用的替换。请注意,这可能会返回一个阻塞RNG,即:一个可能阻塞线程直到有足够的熵可用的RNG。它还可能会耗尽阻塞其他应用程序的操作系统熵池,因此只能谨慎使用。

正如CodesInChaos已经显示的那样,SUN provider的默认实现会使用系统随机数生成器自动为自己种子。由于Java本身没有(明确的)熵源,它或多或少地依赖于系统作为其种子

在从SUN提供程序中的
“SHA1PRNG”
检索数据之前,千万不要调用
setSeed
,因为这将使您的RNG(随机数生成器)成为确定性RNG-它将只使用给定的种子,而不是将种子添加到状态。换句话说,它将始终生成相同的伪随机比特或值流

setSeed
的初始调用可能因提供程序而异。有时它会将种子用作唯一的种子,但也可能只是将种子添加到当前状态。在以后的Android版本(4.2以后)中,种子只是添加到随机状态,因此
“sha1rn”
将保持完全随机

也许生成随机数生成器的最佳方法就是

SecureRandom r = new SecureRandom();
让Java运行时找出最好的


如果您想使用显式算法(但SUN/Oracle对此描述不清),则可以使用:

SecureRandom r = SecureRandom.getInstance("SHA1PRNG");
就像你的代码一样

现在,还可以使用NIST算法,使用
“DRBG”
作为算法描述,然后可以使用安全属性为VM配置

无论是
“SHA1PRNG”
还是
“DRBG”
都不是实现要求,并且每个运行时/提供者使用的算法或它们的种子方式可能不同。我永远不会使用它们来重新生成以前生成的字节或值流;请使用流密码。例如,您可以将密码实例
cipher
用于
“AES/CTR/NoPadding”
并加密零值字节以获取密钥流


如果要添加熵,请使用:

// just used to make sure that the SecureRandom is seeded by the OS
r.nextBytes(new byte[8]);
r.setSeed(1232);
常量值或文本不包含太多(如果有的话)熵。熵的通常来源是当前时间(或者更好的,
System.nanoTime()
),鼠标移动等


对于Java 8,有一个新方法,其描述如下:

返回使用SecureRandom.strongAlgorithms安全属性中指定的算法/提供程序选择的SecureRandom对象

某些情况需要强随机值,例如创建