我在从公钥文本创建公钥时遇到问题。我从这个链接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/