You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:54:01