【问题标题】:Bouncy Castle RSA keypair generation using Lightweight API使用轻量级 API 生成 Bouncy Castle RSA 密钥对
【发布时间】:2012-07-02 02:08:37
【问题描述】:

令人惊讶的是,网络上关于使用 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 的使用是不言自明的。 documentation of RSAKeyGenerationParameters 完全没有价值(这并不奇怪)。我唯一的猜测是它与生成的密钥的准确性有关,但我想再次确定。所以我的问题是certaintypublicExponent 的合适值是多少?

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

【问题讨论】:

    标签: java security encryption rsa bouncycastle


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 鉴于“可能的质数”的意义在于您无法分解它,您如何检查它是否与另一个数字相对质数?相对素数检查不只是另一种概率检查吗?
    • 相对素数可以通过计算 GCD 轻松检查。如果是 1,则 2 个数是相对素数。
    • 并非不可能生成可证明的素数,但它更昂贵并且被认为对 RSA 来说是不必要的。 Ueli Maurer 多年前为此提供了一个快速算法。
    • 另外,如果生成非素数“素数”,您确定该算法仍然有效吗?我自己没有检查过。 BC 检查与 (p-1)(q-1) 的相对素数,但如果 p 不是素数,则 (p-1)(q-1) 不是 phi(n) 的正确值,因此数学崩溃了。
    • 运行 RSA 是一种对所涉及数字的复杂概率素数测试。如果 p 不是素数,那么 RSA 将在许多输入上失败——但我们谈论的是一个 p 刚刚通过了旨在使非素数以高概率失败的测试。
    【解决方案2】:

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

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

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

    【讨论】:

    • 3 作为公共指数的“漏洞”主要是一个重大的历史误解。 65537 是计算机科学中货物崇拜的典型例子。 65537还不错,但3也不错;如果 3 导致弱点,那么您做错了其他事情,而使用 65537 可能无法挽救您。
    • @Thomas:关于将公共指数的值设置为 65537,我很怀疑。它也可能大于 65537,对吧?任何素数都可以吗?
    • @yamsha:公共指数可以是与 p-1 和 q-1相对素数的任何值(其中 p 和 q 是 RSA 模数的素数)。 RSA 密钥生成器使用提供的公共指数作为参数,并选择适当的 p 和 q。这排除了偶数值。任何奇数(1除外)都可以作为公共指数;使用素数只会使密钥生成器稍微简单一些。公钥操作的成本随着公共指数的大小而增加,因此您可能希望保持较小。
    • @yamsha:另外,一些广泛部署的 RSA 实现在较大的公共指数方面存在问题。例如,Windows 中的标准 RSA 实现(当 Internet Explorer 连接到 HTTPS 网站时使用)不能容忍不适合 32 位无符号整数的公共指数。使用 e=3 或 e=65537 “无处不在”。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      See this answer on crypto.stackexchange.com 了解有关如何计算确定性值的更多信息。

      Paŭlo Ebermann 的回答预览:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-13
        相关资源
        最近更新 更多