Java 如何在SecureRandom中正确使用setSeed()方法生成RSA素数
我想为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
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对象 某些情况需要强随机值,例如创建