java - 从 Bouncy CaSTLe 中的文本创建 RSA 公钥时出现问题

标签 java encryption jwt rsa

我在从公钥文本创建公钥时遇到问题。我从这个链接Creating RSA Public Key From String找到了解决方案。他们提到 Bouncy CaSTLe(轻量级 API)作为一个库来解决将公钥字符串转换为 RSA 公钥时出现的 InvalidKeySpecException 错误。但这个解决方案在我的案例中失败了。程序在这里抛出异常

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

Creating RSA Public Key From String

   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);

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

最佳答案

您现在编辑的数据是公钥,但不是 PKCS1 格式;它采用更常见(通常也更有用)的 X.509SubjectPublicKeyInfo 格式。此差异在the Q you linked中进行了解释。 。虽然 BouncyCaSTLe 支持这种格式,但 Java crypto (JCA) 也使用(技术上不精确的)名称 X509EncodedKeySpec 直接支持它,因此这样做要简单得多:

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

关于java - 从 Bouncy CaSTLe 中的文本创建 RSA 公钥时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55584486/

相关文章:

Java终端-开发

c - 如何使用 gpgme 解密子消息?

javascript - 如何在 JavaScript 中将 otpauth key 转换为 otp pin?

java - 我在运行 Java 程序时遇到问题

java - 与 AWS/alive.json 的 Android HTTPS 连接挂起

Java SSL 安全

python - 如何在 Python 3 中打开受密码保护的 zip 文件

java - 使用 vertx 进行 JWT 公钥/私钥身份验证中的握手

javascript - Vue SPA - 检查用户是否经过身份验证,如果没有则重定向到登录

c# - 将自定义验证添加到 ASP.NET Core 的 JWT token ?