从 Bouncy Castle 中的文本创建 RSA public 密钥时出现问题

Problem creating RSA public key from text in Bouncy Castle

我在从 public 键文本创建 public 键时遇到问题。我从这个 link 中找到了解决方案。他们将 Bouncy Castle(轻量级 API)作为一个库来解决将 public 密钥字符串转换为 RSA public 密钥时的 InvalidKeySpecException 错误。但是这个解决方案在我的案例中失败了。程序在这里抛出异常

线程中出现异常 "main" java.lang.IllegalArgumentException:序列大小错误:9

   String publicKeyB64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3AQKDhhtcM5A1a8R9/VX" +
            "mrocKGaQlat2/MRFy/Y1fTabYyKkfgaRXyrHiRn+imq3ljEgx/vLRTTPtLt8H79a" +
            "iMU6WJkQwG504NCnDRVB9DZBoAYDtBkjtje7I2Xs3tzvlNwM0bcCmmj/6QE9rHEv" +
            "xhvvXO8M332hINORLNiCF6NvYHrIVSa8EU4F0bnlWpoNi0YhP45uyOOuPpVmsaxp" +
            "MWOycf3nTICKK5BDylnVO7kMcL1utJxOOb1fsotaLuge4fF84DG4cPpLZko3ksB/" +
            "voOLTDv5QRsn++8qRciK4sptlnOs8g2TrXjE/rZlP9QmpUV4a3iQ1WmsqWQVizmw" +
            "PwIDAQAB";

    byte[] decoded = Base64.getDecoder().decode(publicKeyB64);
    org.bouncycastle.asn1.pkcs.RSAPublicKey pkcs1PublicKey = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(decoded);
    BigInteger modulus = pkcs1PublicKey.getModulus();
    BigInteger publicExponent = pkcs1PublicKey.getPublicExponent();
    RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    PublicKey generatedPublic = kf.generatePublic(keySpec);
    System.out.printf("Modulus: %X%n", modulus);
    System.out.printf("Public exponent: %d ... 17? Why?%n", publicExponent); // 17? OK.
    System.out.printf("See, Java class result: %s, is RSAPublicKey: %b%n", generatedPublic.getClass().getName(), generatedPublic instanceof RSAPublicKey);

所以我真的很期待处理这个问题的建议。

如果您的 public 密钥是正确的,那么您应该能够在命令行上阅读它以解决问题。尝试使用这些命令:

$ openssl rsa -inform PEM -pubin -in pub.key -text -noout
$ openssl pkey -inform PEM -pubin -in pub.key -text -noout

将 "pub.key" 替换为您的 public 密钥文件。

您现在编辑的数据是public密钥,但不是PKCS1格式;它采用更常见(通常更有用)的 X.509 SubjectPublicKeyInfo 格式。 中解释了这种差异。虽然 BouncyCastle 支持这种格式,但 Java crypto (JCA) 使用(技术上不精确的)名称 X509EncodedKeySpec 直接支持它,所以它更简单:

byte[] decoded = Base64.getDecoder().decode(publicKeyB64);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey generatedPublic = kf.generatePublic(new X509EncodedKeySpec(decoded));