2016-03-08 130 views
1

我將公鑰轉換爲字節數組。我想將其轉換回公鑰。我跟着這個link,但得到的錯誤:將字節數組轉換回公鑰

Operation failed: javax.crypto.spec.SecretKeySpec incompatible with java.security.PublicKey

因爲我知道,這是一個公共密鑰,有沒有將其轉換爲Publickey,而不是SecretKey

編輯

我創建使用RSAPublicKeySPec公鑰。現在有沒有錯誤,但簽名驗證失敗,因爲當我看到新創建的公鑰的密鑰材料時,它與我通過的不同。

密鑰材料我通過 3082010a0282010100ab7f161c0042496ccd6c6d4dadb919973435357776003acf54b7af1e440afb80b64a8755f8002cfeba6b184540a2d66086d74648346d75b8d71812b205387c0f6583bc4d7dc7ec114f3b176b7957c422e7d03fc6267fa2a6f89b9bee9e60a1d7c2d833e5a5f4bb0b1434f4e795a41100f8aa214900df8b65089f98135b1c67b701675abdbc7d5721aac9d14a7f081fcec80b64e8a0ecc8295353c795328abf70e1b42e7bb8b7f4e8ac8c810cdb66e3d21126eba8da7d0ca34142cb76f91f013da809e9c1b7ae64c54130fbc21d80e9c2cb06c5c8d7cce8946a9ac99b1c2815c3612a29a82d73a1f99374fe30e54951662a6eda29c6fc411335d5dc7426b0f6050203010001

密鑰材料使用我RSAPublicKeySpec 30820122300D06092A864886F70D01010105000382010F003082010A0282010100AB7F161C0042496CCD6C6D4DADB919973435357776003ACF54B7AF1E440AFB80B64A8755F8002CFEBA6B184540A2D66086D74648346D75B8D71812B205387C0F6583BC4D7DC7EC114F3B176B7957C422E7D03FC6267FA2A6F89B9BEE9E60A1D7C2D833E5A5F4BB0B1434F4E795A41100F8AA214900DF8B65089F98135B1C67B701675ABDBC7D5721AAC9D14A7F081FCEC80B64E8A0ECC8295353C795328ABF70E1B42E7BB8B7F4E8AC8C810CDB66E3D21126EBA8DA7D0CA34142CB76F91F013DA809E9C1B7AE64C54130FBC21D80E9C2CB06C5C8D7CCE8946A9AC99B1C2815C3612A29A82D73A1F99374FE30E54951662A6EDA29C6FC411335D5DC7426B0F6050203010001

顯然,由於主要材料是錯誤的驗證將無法將其轉換爲公共密鑰後得到了!我不明白爲什麼它會被改變。

但是當我使用java.security.PublicKey(匿名內部類)直接創建公鑰時,密鑰材料不會被修改。但是,當我通過它來驗證,我得到錯誤的算法類型錯誤(我通過RSA的算法)

代碼片段

PublicKey pubKey = new PublicKey() { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public String getFormat() { 

      return "PKCS1"; 
     } 

     @Override 
     public byte[] getEncoded() { 

      return keyMat; 
     } 

     @Override 
     public String getAlgorithm() { 

      return "SHA256withRSA"; // tried with "RSA", getting same error 
     } 
    }; 

    return pubKey; 
} 
+0

檢索鏈接中的示例使用對稱密碼(DES)。對稱密碼中沒有「公鑰」概念。請提供您用於創建/分發密鑰的代碼。 – flo

+0

@flo對,所以,而不是DES,我使用不同的算法,如RSA – Manoj

回答

2

Here

//Takes your byte array of the key as constructor parameter 
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(myKeyBytes); 

//Takes algorithm used to generate keys (DSA, RSA, DiffieHellman, etc.) as 1st parameter 
//Takes security provider (SUN, BouncyCastle, etc.) as second parameter 
KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN"); 

//Creates a new PublicKey object 
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec); 
+0

我不想生成密鑰,我只是想將其轉換。 – Manoj

+1

@Manoj如果只有密鑰的字節數組,則必須重新生成密鑰,因爲所述字節數組使用特定的密鑰規範進行編碼。您需要指定此密鑰規範,以便可以從密鑰字節列表中重新創建密鑰。被「生成」的唯一對象是給定一個字節數組的新的PublicKey對象。密鑰本身的值不會被更改/重新創建。 java.security.spec.InvalidKeySpecException: –

+0

當轉換爲X509EncodedKeySpec @public獲取錯誤不適當的密鑰規範:IOException異常:寒冷的分析錯誤,而不是一個序列 \t在com.ibm.crypto.provider.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java :25) \t在java.security.KeyFactory.generatePublic(KeyFactory.java:145) \t在TestVerify.main(TestVerify.java:65) – Manoj