从字节数组创建PrivateKey

时间:2011-01-05 01:31:43

标签: java cryptography javacard

有没有办法从字节数组生成PrivateKey?我使用getEncoded()方法得到了这个字节数组,但现在我必须将它转换回PrivateKey。

谢谢, 武克

5 个答案:

答案 0 :(得分:6)

我也在寻找这个答案,终于找到了答案。 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 :(得分:5)

正如Java docs

所述
  

密钥通常通过密钥生成器,证书或用于管理密钥的各种Identity类获得。也可以通过使用密钥工厂从关键规范(基础密钥材料的透明表示)获得密钥。

KeyFactory课程可以帮助您解决这个问题。

答案 2 :(得分: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,你会发现一些有趣的帖子。

答案 3 :(得分:0)

您必须自己解码PKCS#8编码blob(ASN.1 BER解析)并设置组件,或者您可以从私钥(至少私有指数和模数)获取组件作为Java BigIntegers,将它们转换为无符号字节数组,并按照Robert的说明在Java Card API中设置它们。 PKCS#8解析可以在Java Card上完成,但这是一个非常可怕的练习。

答案 4 :(得分:0)

//ECDSA algo of signature type prime256 of key
Security.addProvider(new BouncyCastleProvider());
KeyFactory factory = KeyFactory.getInstance("ECDSA", "BC");
ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");
ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(new BigInteger(1, privKey), spec);
PrivateKey privateKey = factory.generatePrivate(ecPrivateKeySpec);