【问题标题】:How to get the RSA public-key from private-key Object in Java如何从 Java 中的私钥对象中获取 RSA 公钥
【发布时间】:2014-09-05 13:02:30
【问题描述】:

如何从RSA密码系统中的私钥对象java.security.PrivateKey中获取相关的公钥对象java.security.PublicKey。

【问题讨论】:

    标签: java cryptography rsa private-key public-key


    【解决方案1】:

    Java 可以通过使用模数和指数来创建公钥:

    RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
    kf.generatePublic(keySpec);
    

    所以我们需要从私钥中提取这些值:

    KeyFactory kf = KeyFactory.getInstance("RSA");
    RSAPrivateKeySpec priv = kf.getKeySpec(privateKey, RSAPrivateKeySpec.class);
    

    RSAPrivateKeySpec-Object 现在包含我们需要的模数,但指数不是我们需要的公钥。

    对于公钥,指数通常为 65537: http://en.wikipedia.org/wiki/65537_(number)

    因此我们现在可以创建公钥:

    KeyFactory kf = KeyFactory.getInstance("RSA");
    RSAPrivateKeySpec priv = kf.getKeySpec(privateKey, RSAPrivateKeySpec.class);
    
    RSAPublicKeySpec keySpec = new RSAPublicKeySpec(priv.getModulus(), BigInteger.valueOf(65537));
    
    PublicKey publicKey = kf.generatePublic(keySpec);
    

    【讨论】:

    • RSA 的公钥指数不固定为 65537,这只是它最常见的值。由于私钥指数依赖于公钥指数,因此该解决方案并非适用于所有情况。
    • @Syon 你是对的,我更正了这个,但使用 e≠65537 会降低与现有硬件或软件的兼容性,并违反安全机构的某些标准或规定,因此你不会找到这通常。更多信息在这里:crypto.stackexchange.com/questions/3110/…
    • 我同意你引用的帖子,如果你正在创建一个新的公钥/私钥对。不过,您的问题是关于从现有私钥派生公钥。您可以这样做的唯一方法是使用用于创建原始密钥对的公钥指数。在所有情况下都无法使用 65537,因为它可能不是公钥指数。与现有硬件或软件的兼容性无关。
    • 只转换为RSAPrivateKey 有什么问题(在确认它是当然是RSAPrivateKey 之后)?
    【解决方案2】:

    您需要将私钥转换为 RsaPrivateCrtKey。如果转换成功,您可以提取公钥。如果演员阵容失败,严格来说你没有足够的信息。

    public static RSAPublicKeySpec getPublicKeySpec(PrivateKey priv) {
        RSAPrivateCrtKey rsaCrtKey = (RSAPrivateCrtKey) priv; // May throw a ClassCastException
        return new RSAPublicKeySpec(rsaCrtKey.getModulus(), rsaCrtKey.getPublicExponent());
    }
    

    如果转换失败,您可以尝试猜测公共指数,并使用标准 RSA 关系 (xe)d = x mod N 检查您的猜测对于所有 x。对于您对 e 的猜测,请尝试等式中的随机 x 值,看看该关系是否始终成立。然而,这种技术只能产生概率性的答案。

    【讨论】:

      猜你喜欢
      • 2012-01-02
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2018-11-27
      • 2022-11-22
      • 2023-03-21
      • 2019-08-15
      • 1970-01-01
      相关资源
      最近更新 更多