顺便说一句:您拥有的是 one 公钥的“字符串”(文本)表示,特别是 X.509 和 PKIX 中定义的 ASN.1 结构 SubjectPublicKeyInfo 的 base64 编码,以及默认情况下在 Java 加密中使用,如 X509EncodedKeySpec 的文档中所述,但在 Key 中进行了更全面的解释。公钥的许多其他“字符串”表示形式完全不同,并且在 Java 中不那么容易使用。
Java 实际上有用于此结构和相关结构的类——并在处理 包含 SPKI 的 X.509 证书时使用它们——但它们是内部的且未记录,虽然在过去几年中可以只调用内部类,但 Java (Oracle) 现在正努力逐步使这变得更加困难或不可能,所以我不推荐它。
如果您可以专门使用第三方代码BouncyCastle,这很容易。与您要求的最接近的方法是解析 SPKI 并从中获取算法“名称”——但这是 ASN.1 对象标识符(又名 OID)的形式,而不是 Java 通常使用的名称。 如果您使用 BouncyCastle provider (bcprov*.jar) 进行 KeyFactory 调用,则它具有将此 OID 的别名映射到正常名称:
String stringPubKey = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmRk7MSZQCX2u4UIQgVzma1JEo3yASVafls/5nw/V9T6e5EbsK64MM0KhsPH9aK/aElRt1+Rxtd1AsHVvsQJjKw==";
byte[] publicBytes = Base64.getDecoder().decode(stringPubKey);
String oid = org.bouncycastle.asn1.x509.SubjectPublicKeyInfo.getInstance(publicBytes)
.getAlgorithm().getAlgorithm().toString(); /* yes, two different .getAlgorithm() ! */
PublicKey pk = KeyFactory.getInstance(oid, new org.bouncycastle.jce.provider.BouncyCastleProvider())
.generatePublic(new X509EncodedKeySpec(publicBytes));
System.out.println(oid + " -> " + pk.getAlgorithm());
但是,如果您使用 bcpkix*.jar 库(这取决于 bcprov 是否可用但不一定已注册),它会处理与 any 提供程序的 OID 名称映射(如普通 SunEC)并管理一站式为您提供 KeyFactory:
// setup as above
/*PublicKey*/ pk = new org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter().getPublicKey(
org.bouncycastle.asn1.x509.SubjectPublicKeyInfo.getInstance(publicBytes));
System.out.println(pk.getAlgorithm());