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

令人惊讶的是,网上关于使用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和幕后发生的数学有基本的了解,所以我理解了publicExponentstrength是什么。 我认为publicExponent指的是phi(pq)的互质,并且从我收集的它可以是小的(如3),只要使用适当的填充。 但是,我不知道certainty是指什么(某些地方提到它可能指的是一个百分比,但我想确定)。 SecureRandom的使用是不言自明的。 RSAKeyGenerationParameters的文档完全没有价值(毫不奇怪)。 我唯一的猜测是它与生成的键的准确性有关,但我想再次确定。 所以我的问题是什么是certaintypublicExponent适当值?

PS请不要回答“这取决于具体情况 – 您希望信息的安全性”。 假设最高程度的安全性(即4096位RSA密钥或更高)是非常安全的,除非另有说明……我也非常感谢链接,这些链接提供了使用Bouncy Castle的轻量级API的良好示例(我不是所有对JCA实施感兴趣或任何与之相关的例子)。

您正在为两者使用正确的值。

publicExponent应该是费马数 。 0x10001(F4)是当前推荐值。 已知3(F1)也是安全的。

RSA密钥生成需要素数。 但是,生成绝对素数是不可能的。 与任何其他加密库一样,BC使用可能的素数。 确定性表明你希望这个数字是多么肯定。 高于80的任何东西都会大大降低密钥生成速度。

请注意,RSA算法仍然适用于质数不是真素数的不太可能的事件,因为BC检查相对质数。

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

因此,值为80时,2 80中的机会少于1,该数字将不是素数。 注释表明素数生成时间相对于此参数是线性的,但您应该测试以确定是否选择增加它。 使用与您正在使用的密钥大小一致的值可能是有意义的。 例如,NIST表示1024位RSA密钥与80位对称密钥一样强。 对于2048位RSA密钥,您可能希望使用112位的确定性(等效强度对称密钥大小),依此类推。

听起来你知道在特殊情况下使用3作为公共指数的漏洞。 现在几乎普遍使用值65537。

一个很好的参考是FIPS PUB 186-3 。 特别是,附录B第3节有许多安全参数,以及素数生成算法。 certainty是Miller-Rabin素性检验的迭代次数。

有关如何计算确定性值的更多信息, 请参阅crypto.stackexchange.com上的此答案 。

预览PaŭloEbermann的回答:

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

如何选择x? 我们希望p(和q)不是素数的概率足够小,以至于此点的失败概率不大于系统可能被破坏的其他方式 – 比如猜测对称密钥,分解模数等。

所以这里对称和非对称密钥大小的对应表应该有所帮助。 http://www.keylength.com/选择与您使用公钥时选择对称密钥大小相同的主要确定性。