如何从Java中String格式的公钥提取其对应的公钥算法名称?
问题解答
可以提取算法名称。你使用的是标准X.509格式编码的公钥,其ASN.1结构SubjectPublicKeyInfo的首部就包含算法标识符(OID),可以直接解析得到对应的标准算法名称,无需提前预知。
方案1:纯JDK实现(无需第三方依赖)
如果使用的是JDK8,可直接通过内置的X.509解析工具实现:
import java.security.KeyFactory; import java.security.PublicKey; import java.util.Base64; import sun.security.x509.AlgorithmId; import sun.security.x509.X509Key; import java.security.spec.X509EncodedKeySpec; public class PubKeyParse { public static void main(String[] args) throws Exception { String stringPubKey = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmRk7MSZQCX2u4UIQgVzma1JEo3yASVafls/5nw/V9T6e5EbsK64MM0KhsPH9aK/aElRt1+Rxtd1AsHVvsQJjKw=="; byte[] publicBytes = Base64.getDecoder().decode(stringPubKey); // 解析公钥得到算法名 X509Key x509Key = X509Key.parse(publicBytes); AlgorithmId algId = x509Key.getAlgorithmId(); String algorithmName = algId.getName(); // 后续生成PublicKey逻辑 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes); KeyFactory keyFactory = KeyFactory.getInstance(algorithmName); PublicKey publicKey = keyFactory.generatePublic(keySpec); } }
如果是高版本JDK限制了sun包访问,可以自行实现简易的ASN.1结构解析提取算法OID,再映射为标准算法名即可。
方案2:基于BouncyCastle加密库实现(更通用)
如果项目已经引入BouncyCastle加密组件,可直接通过以下代码实现,兼容性更强:
import java.security.PublicKey; import java.util.Base64; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; public class PubKeyParse { public static void main(String[] args) throws Exception { String stringPubKey = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmRk7MSZQCX2u4UIQgVzma1JEo3yASVafls/5nw/V9T6e5EbsK64MM0KhsPH9aK/aElRt1+Rxtd1AsHVvsQJjKw=="; byte[] publicBytes = Base64.getDecoder().decode(stringPubKey); // 直接解析公钥,无需提前指定算法 SubjectPublicKeyInfo pubInfo = SubjectPublicKeyInfo.getInstance(publicBytes); PublicKey publicKey = new JcaPEMKeyConverter().getPublicKey(pubInfo); } }
使用该方案需要提前引入BouncyCastle相关依赖。
针对你提供的示例公钥的快速解决方案
你贴出的公钥实际使用的是*EC(椭圆曲线)*算法,对应曲线为secp256r1(P-256),直接将algorithmName赋值为"EC"即可直接运行你的原有代码。
内容的提问来源于stack exchange,提问作者MA1
相关产品推荐
相关产品推荐

