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

And*_*rey 19 java security encryption rsa bouncycastle

令人惊讶的是,网上关于使用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();
Run Code Online (Sandbox Code Playgroud)

我有RSA的一个基本的了解,并且会在幕后数学,让我明白了什么publicExponentstrength是.我认为只要使用适当的填充,我publicExponent指的是互质phi(pq)并且从我收集的它可以是小的(如3).但是,我不知道是certainty指什么(某些地方提到它可能指的是一个百分比,但我想确定).使用SecureRandom是不言自明的.RSAKeyGenerationParameters文档完全没有价值(毫不奇怪).我唯一的猜测是它与生成的键的准确性有关,但我想再次确定.所以我的问题是什么是适当的价值certaintypublicExponent

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

ZZ *_*der 10

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

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

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

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


eri*_*son 8

我不得不钻研他们的源代码是"一定",但我相信certainty参数直接传递给BigInteger构造函数,它说:"概率新BigInteger表示一个素数将超过(1 - 1/2 确定性.此构造函数的执行时间与此参数的值成比例."

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

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

  • @yamsha:另外,一些广泛部署的RSA实现在使用大型公共指针时遇到了麻烦.例如,Windows中的标准RSA实现(在Internet Explorer连接到HTTPS网站时使用)不允许不适合32位无符号整数的公共指数.使用e = 3或e = 65537"无处不在". (3认同)
  • 作为公众指数的3个"漏洞"大多是一个巨大的,历史性的误解.65537是计算机科学中货物崇拜的一个主要例子.65537也不错,但3也不差; 如果3导致弱点,那么你正在做其他错误,而使用65537代替可能无法拯救你. (2认同)
  • @yamsha:公共指数可以是_relatively prime_到p-1和q-1的任何值(其中p和q是RSA模数的主要因子).RSA密钥生成器使用提供的公共指数作为参数,并选择适当的p和q.这排除了偶数值.任何奇数(1除外)都可以用作公共指数; 仅使用素数使得密钥生成器稍微简单一些.公钥操作的成本随着公共指数的大小而增加,因此您可能希望保持较小. (2认同)