一尘不染

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

java

令人惊讶的是,网络上关于使用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文档完全毫无价值(毫无疑问)。我唯一的猜测是,它与生成的键的准确性有关,但是我还是想确定一下。所以我的问题是certainty和的适当值是publicExponent多少?

PS:请不要回答“这取决于上下文-
您希望信息的安全性”。除非另有说明,否则假定最高的安全级别(即4096位RSA密钥或更高)是非常安全的…我也希望获得链接的链接,这些链接提供了使用Bouncy
Castle的轻量级API的很好的示例(我不喜欢所有对JCA实施或与此有关的示例感兴趣的人。


阅读 380

收藏
2020-12-03

共1个答案

一尘不染

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

publicExponent应该是Fermat编号。0x10001(F4)是当前推荐值。3(F1)也被认为是安全的。

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

请注意,在素数不是真素数的情况下,由于BC检查相对素数,因此RSA算法仍然可以使用。

2020-12-03