Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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 使用轻量级API生成Bouncy Castle RSA密钥对_Java_Security_Encryption_Rsa_Bouncycastle - Fatal编程技术网

Java 使用轻量级API生成Bouncy Castle RSA密钥对

Java 使用轻量级API生成Bouncy Castle RSA密钥对,java,security,encryption,rsa,bouncycastle,Java,Security,Encryption,Rsa,Bouncycastle,令人惊讶的是,网络上关于使用Bouncy Castle的轻量级API的信息非常少。在环顾四周一段时间后,我能够总结出一个基本示例: RSAKeyPairGenerator generator = new RSAKeyPairGenerator(); generator.init(new RSAKeyGenerationParameters ( new BigInteger("10001", 16),//publicExponent SecureRandom

令人惊讶的是,网络上关于使用Bouncy Castle的轻量级API的信息非常少。在环顾四周一段时间后,我能够总结出一个基本示例:

RSAKeyPairGenerator generator = new RSAKeyPairGenerator();
generator.init(new RSAKeyGenerationParameters
    (
        new BigInteger("10001", 16),//publicExponent
        SecureRandom.getInstance("SHA1PRNG"),//prng
        1024,//strength
        80//certainty
    ));

AsymmetricCipherKeyPair keyPair = generator.generateKeyPair();
我对RSA和幕后发生的数学有基本的了解,因此我了解什么是
publicExponent
strength
。我假设
publicExponent
指的是
phi(pq)
的互质,从我收集的数据来看,只要使用适当的填充,互质可以很小(如3)。然而,我不知道
确定性
指的是什么(有些地方提到它可能指的是一个百分比,但我想确定一下)。
SecureRandom
的使用不言自明。这本书毫无价值(毫不奇怪)。我唯一的猜测是,这与生成的关键点的准确性有关,但我想再次确认。所以我的问题是
确定性
公共指数
的合适值是什么

附言。
请不要回答“这取决于上下文-您希望信息的安全程度”。除非另有规定,否则假设最高安全级别(即4096位RSA密钥或更高)是相当安全的。。。我还希望链接到提供了Bouncy Castle轻量级API使用示例的源代码(我对JCA实现或任何与之相关的示例都不感兴趣)。

您对这两个都使用了正确的值

publicExponent应该是一个。0x10001(F4)是当前的建议值。3(F1)也被认为是安全的

RSA密钥生成需要素数。然而,生成绝对素数是不可能的。和其他加密库一样,BC使用可能素数。确定性表示您希望该数字为素数的确定程度。任何高于80的值都会大大降低密钥生成的速度


请注意,RSA算法在素数不是真素数的情况下仍然有效,因为BC检查相对素数。

我必须深入研究它们的源代码以“确定”,但我相信
确定性
参数会直接传递给构造函数,“新的
BigInteger
表示素数的概率将超过(1-1/2确定性)。此构造函数的执行时间与此参数的值成比例。”

因此,当值为80时,280中有不到1%的概率该数字不是素数。该评论建议素数生成时间与此参数呈线性关系,但您应该测试该时间,以确保是否选择增加它。使用与您使用的键大小一致的值可能是有意义的例如,NIST说1024位RSA密钥的强度与80位对称密钥一样。对于2048位RSA密钥,您可能希望使用112位的确定性(等效强度对称密钥大小),依此类推

听起来您已经意识到在特殊情况下使用3作为公共指数的脆弱性。现在几乎普遍使用65537值。

这是一个很好的参考。特别是,附录B第3节有许多安全参数,以及素数生成算法。
确定性
是Mille的迭代次数r-Rabin素性检验。

了解有关如何计算确定性值的更多信息

预览帕罗·埃伯曼的答案:

x位的确定性意味着某事物(在这个 情况p为素数)不为真小于2−x、 这是 与正确猜测计算机上的随机x位值的概率相同 第一次尝试,因此得名

如何选择x?我们希望p(和q)不是素数的概率 足够小,在这一点上的失效概率不是 比其他方式更大的系统可能被破坏——比如猜测 对称密钥、模分解等

这里有一个对称和非对称密钥大小的对应表 应该有帮助。选择与你选择一个相同的基本确定性 公钥使用时附带的对称密钥大小


考虑到“可能素数”的要点是你不能将其因子化,你如何检查它是否与另一个数相对素数?相对素数检查不只是另一个概率检查吗?相对素数可以通过计算GCD轻松检查。如果它是1,2个数是相对素数。生成可证明的pr并非不可能ime整数,但它更昂贵,而且被认为对RSA是不必要的。尤利·莫雷尔(Ueli Maurer)多年前给出了一个快速算法。另外,你确定在生成非素数“素数”的情况下该算法仍然有效吗?我自己没有检查过。BC检查(p-1)(q-1)的相对素数,但如果,比如说,p不是素数,那么(p-1)(q-1)不是phi(n)的正确值,所以数学问题就解决了。运行RSA是对相关数字进行的一种卷积概率素性测试。如果p是非素数,则RSA将在许多输入上失败——但我们谈论的是一个p,它刚刚通过了一项旨在使非素数以高概率失败的测试。“漏洞”“将3人列为公众代表大多是一个重大的、历史性的误解。65537是计算机科学中货物崇拜的一个典型例子。65537不错,但3也不错;如果3导致了弱点,那么你就做错了别的事情,而使用65537可能救不了你。@Thomas:关于将公共指数的值设置为65537,我也这么怀疑。它也可能大于65537,对吗?任何素数都可以?@yamsha:公共指数可以是相对于p-1和q-1的素数的任何值(其中p和q是RSA模的素数因子)。RSA密钥生成器使用提供的公共指数作为参数,并选择ap