2017-03-05 127 views
0

我有base64中的ECDSA私鑰字符串(我從此https://stackoverflow.com/a/8571649/7661555答案中檢查此字符串與正則表達式)。從base64字符串創建私鑰ECDSA私鑰

我試着從這個字符串中生成PrivateKey實例。 我包括SpongyCastle在我的項目,並嘗試使用此代碼生成它:

 PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(encKey); 

     KeyFactory keyFactory = KeyFactory.getInstance("ECDSA", "SC"); 

     PrivateKey priv = keyFactory.generatePrivate(privKeySpec); 

但是當我運行這段代碼,我得到下一個例外:

W/System.err的:java.security。 spec.InvalidKeySpecException:編碼密鑰規格不被識別

你能告訴我我做錯了什麼嗎?

P.S. 生成PrivateKey後,我想用它來簽署另一個字符串。 爲此我找到下一個代碼:

 Signature sig = Signature.getInstance("SHA256withECDSA"); 
     sig.initSign(priv); 
     sig.update(token.getBytes()); 

這是對的嗎?或者這可能導致另一個異常?

回答

0

你在你的問題中提到的正則表達式只是檢查一個字符串是否是base64編碼的。

你可以分享,你是如何從EC私鑰生成base64字符串的?

private String getBase64Value(PrivateKey privateKey) { 
    return Base64.encodeToString(privateKey.getEncoded(), Base64.NO_WRAP); 
} 

private PrivateKey reconstructPrivateKey(String base64Value) throws InvalidKeySpecException, NoSuchAlgorithmException { 
    KeyFactory kf = KeyFactory.getInstance("EC"); 
    byte[] bytes = Base64.decode(base64Value, Base64.NO_WRAP); 
    return kf.generatePrivate(new PKCS8EncodedKeySpec(bytes)); 
}