2011-01-05 87 views
7

有沒有辦法從字節數組中生成私鑰?我使用getEncoded()方法得到了這個字節數組,但現在我必須將它轉換回PrivateKey。從字節數組中創建私鑰

謝謝, 武克

+0

這應該有幫助嗎? http://forums.oracle.com/forums/thread.jspa?threadID=1525932&tstart=105 – 2011-01-05 01:38:19

+0

不,這沒有幫助,但無論如何感謝 – Vuk 2011-01-05 02:09:57

回答

5

作爲對Java docs

鍵表示通常通過密鑰生成器,證書或用於管理鍵的各種身份類獲得。密鑰也可以通過使用密鑰工廠從關鍵規範(基礎密鑰材料的透明表示)中獲得。

KeyFactory類可以幫助你解決這個問題。

+0

我忘了說我正在使用javacard,它不支持KeyFactory類。它支持keyBuilder,但我無法真正弄清楚如何使用這個類來滿足我的需要。 – Vuk 2011-01-05 02:23:17

3

丟棄編碼的字節數組。在JavaCard上,AFAIR無法直接對其進行解碼 - 您必須分別設置不同的關鍵組件。

例如一個RSAPrivateKey需要與指數和彈性模量進行初始化:

rsaPrivate = (RSAPrivateKey) javacard.security.KeyBuilder.buildKey 
    (javacard.security.KeyBuilder.TYPE_RSA_PRIVATE, 
    javacard.security.KeyBuilder.LENGTH_RSA_512, false); 

byte[] exponent = {(byte) 7}; 
byte[] modulus = {(byte) 33}; 
rsaPrivate.setExponent(exponent, (short) 0, (short) exponent.length); 
rsaPrivate.setModulus(modulus, (short) 0, (short) modulus.length); 

BTW:對於JavaCard的問題,我建議在Oracle論壇JavaCard Forum。如果您在那裏搜索RSAPrivateKey,您會發現一些有趣的帖子。

+0

那麼getEncoded又有什麼意義呢?他們可能也會拋出一個UnsupportedOperationException異常。 – Jus12 2011-07-28 06:21:42

+0

getEncoded()僅在J2SE上可用。它以PKCS#8編碼形式返回一個私鑰,幾乎可以在任何地方使用。 JavaCard平臺是這些例外之一。 – Robert 2011-07-28 07:19:09

+0

@羅伯特一見。感謝您的澄清。 – Jus12 2011-08-24 16:23:35

7

我也在尋找這個答案,並最終找到它。 keyBytes是最初使用getEncoded()創建的字節數組。

//add BouncyCastle as a provider if you want 
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
//create a keyfactory - use whichever algorithm and provider 
KeyFactory kf = KeyFactory.getInstance("DSA", "BC"); 
//for private keys use PKCS8EncodedKeySpec; for public keys use X509EncodedKeySpec 
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(keyBytes); 
PrivateKey pk = kf.generatePrivate(ks); 

我從來沒有做過任何的JavaCard的,但是從這個post,它看起來像你可以使用的KeyFactory類。您可能需要下載BouncyCastle庫。

+1

謝謝。做得好!你爲我節省了數小時的研究。這應該被選作正確的答案,除非OP的平臺不支持充氣城堡。 – Jus12 2011-07-28 06:25:49

+0

我沒有得到你的意思是「如果你想要」。它是可選的嗎? – Jus12 2011-07-28 06:36:19

+0

@ Jus12我的意思是如果你想使用BouncyCastle,它並沒有作爲你所使用平臺上的提供者。例如,在Android上,我添加了BouncyCastle庫,並且必須使用該行將BC作爲提供者添加並使用BC的算法實現。很高興我可以幫助別人! :) – marchica 2011-07-29 15:42:15

0

要麼你必須自己解碼PKCS#8編碼的blob(ASN.1 BER解析)並設置組件,或者可以從私鑰(至少私有指數和模數)中獲取組件作爲Java BigIntegers ,將它們轉換爲無符號字節數組,並按照Robert的說明將它們設置在Java Card API中。可以在Java Card上完成PKCS#8解析,但這是一個非常可怕的練習。