簡體   English   中英

如何從字符串公鑰中提取公鑰算法?

[英]How to extract the public key algorithm from a String public key?

我有一個 String 公鑰,我正在嘗試使用下面的代碼將其轉換為 Java PublicKey 對象,但是我不知道用於生成此公鑰的算法。 有沒有辦法從字符串公鑰中提取算法名稱?

 String stringPubKey = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmRk7MSZQCX2u4UIQgVzma1JEo3yASVafls/5nw/V9T6e5EbsK64MM0KhsPH9aK/aElRt1+Rxtd1AsHVvsQJjKw==";
 byte[] publicBytes = Base64.getDecoder().decode(stringPubKey);
 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
 KeyFactory keyFactory = KeyFactory.getInstance(algorithmName);
 PublicKey publicKey = keyFactory.generatePublic(keySpec);

Firat 旁白:您擁有的是公鑰的一個“字符串”(文本)表示,特別是在 X.509 和 PKIX 中定義的 ASN.1 結構 SubjectPublicKeyInfo 的 base64 編碼,並在 Java 加密中默認使用,如X509EncodedKeySpec文檔,但在Key更全面的解釋。 公鑰還有許多其他“字符串”表示,它們完全不同,在 Java 中不太容易使用。

Java 實際上有這個和相關結構的類——並在處理包含SPKI 的 X.509證書時使用它們——但它們是內部的和未記錄的,雖然在過去幾年里,可以只調用內部類 Java (Oracle)現在正在努力逐步使這變得更加困難或不可能,所以我不能推薦它。

如果您可以專門使用第三方代碼BouncyCastle,那就很容易了。 與您要求的最接近的方法是解析 SPKI 並從中獲取算法“名稱”——但這是采用 ASN.1 對象標識符又名 OID 的形式,而不是 Java 通常使用的名稱。 如果您使用 BouncyCastle提供程序( 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 是否可用但不一定已注冊),它會處理與任何提供程序(如普通 SunEC)的 OID 名稱映射,並一步為您管理 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());

我不確定,但我認為這是您提供的具有算法的密鑰規范。 請參閱此處的 getAlgorithm() 方法: https ://docs.oracle.com/javase/8/docs/api/index.html?java/security/KeyFactory.html

同樣在這里( https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#KeyFactoryEx )我看到了這個:

算法參數類 與 Keys 和 Keyspecs 類似,算法的初始化參數由 AlgorithmParameters 或 AlgorithmParameterSpecs 表示。 根據使用情況,算法可以直接使用參數,也可能需要將參數轉換為更便攜的格式進行傳輸或存儲。

一組參數的透明表示(通過 AlgorithmParameterSpec)意味着您可以單獨訪問該組中的每個參數值。 您可以通過相應規范類中定義的 get 方法之一訪問這些值(例如,DSAParameterSpec 定義了 getP、getQ 和 getG 方法,以分別訪問 p、q 和 g)。

相比之下, AlgorithmParameters 類提供了一種不透明的表示,您無法直接訪問參數字段。 您只能獲得與參數集關聯的算法的名稱(通過 getAlgorithm)和參數集的某種編碼(通過 getEncoded)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM