2011-01-05 90 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解析,但这是一个非常可怕的练习。