使用轻量级 API 生成充气城堡 RSA 密钥对

2022-09-02 01:37:19

令人惊讶的是,网络上关于使用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和幕后发生的数学有基本的了解,所以我明白了什么和是什么。我推测指的是一个共素数,从我收集到的东西来看,只要使用适当的填充,它就可以很小(如3)。但是,我不知道指的是什么(有些地方提到它可能指的是一个百分比,但我想确定)。的使用是不言自明的。RSAKeyGenerationParameters的文档完全没有价值(这并不奇怪)。我唯一的猜测是它与生成的密钥的准确性有关,但我再次想要确定。所以我的问题是 什么是适当的值 和 ?publicExponentstrengthpublicExponentphi(pq)certaintySecureRandomcertaintypublicExponent

附言:请不要回复“这取决于上下文 - 您希望信息有多安全”。除非另有说明,否则假定最高程度的安全性(即4096位RSA密钥或更高)是相当安全的...我也很感激那些提供使用Bouncy Castle轻量级API的好例子的来源链接(我对JCA实现或任何与之相关的示例都不感兴趣)。


答案 1

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

公共表示符应该是费马数。0x10001 (F4) 是当前建议的值。已知3(F1)也是安全的。

RSA 密钥生成需要质数。但是,不可能生成绝对素数。像任何其他加密库一样,BC使用可能的素数。确定性表示您希望该数字为素数的确定程度。任何高于 80 的操作都会大大减慢密钥生成速度。

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


答案 2

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

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

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