有没有一种方法可以从字节数组生成PrivateKey?我使用getEncoded()方法得到了这个字节数组,但现在我必须将它转换回PrivateKey。
谢谢, Vuk
谢谢, Vuk
//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做过任何事情,但似乎可以使用KeyFactory类。您可能需要下载BouncyCastle库。
丢弃编码的字节数组。在JavaCard上,我记得没有直接解码它的方法 - 您必须分别设置不同的密钥组件。
例如,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);
顺便说一句:如果您有JavaCard相关的问题,我建议你在Oracle论坛上的JavaCard Forum上寻求帮助。如果您在那里搜索RSAPrivateKey,您会发现一些有趣的帖子。
//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);
你可以自己解码 PKCS#8 编码的 blob(ASN.1 BER 解析)并设置组件,或者从私钥中获取组件(至少是私有指数和模数)作为 Java BigIntegers,将它们转换为无符号字节数组,并按照 Robert 的说明在 Java Card API 中设置它们。PKCS#8 解析可以在 Java Card 上完成,但这是一个相当可怕的练习。