22

令人惊讶的是,Web 上关于使用 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指的是我收集的互质数,它可以很小(如 3)。phi(pq)但是,我不知道certainty指的是什么(有些地方提到它可能指的是百分比,但我想确定一下)。的使用SecureRandom是不言自明的。RSAKeyGenerationParameters的文档完全没有价值(这并不奇怪)。我唯一的猜测是它与生成的密钥的准确性有关,但我想再次确定。certainty所以我的问题是什么是合适的值publicExponent

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

4

4 回答 4

11

您对两者都使用了正确的值。

publicExponent 应该是一个费马数。0x10001 (F4) 是当前推荐值。3(F1)也被认为是安全的。

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

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

于 2010-06-21T18:03:13.520 回答
9

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

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

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

于 2010-06-21T18:09:18.530 回答
3

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

于 2010-06-22T00:51:25.773 回答
2

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

Paŭlo Ebermann 的回答预览:

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

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

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

于 2012-07-01T18:08:37.427 回答