将一个PKCS#1编码的RSA私钥转换为可由普通Java使用的PKCS#8是可能的,可以使用Bouncy Castle的
bcprov库。
由于PKCS#1和PKCS#8之间的区别仅仅是前导PrivateKeyAlgorithmIdentifier,因此我们可以补充该标识以获取PKCS#8:
byte[] pkcs1Encoded = ...;
AlgorithmIdentifier algId = new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE);
PrivateKeyInfo privateKeyInfo = new PrivateKeyInfo(algId, ASN1Sequence.getInstance(pkcs1Encoded));
byte[] pkcs8Encoded = privateKeyInfo.getEncoded();
这可以被普通的 Java 所使用:
java.security.spec.KeySpec spec = new java.security.spec.PKCS8EncodedKeySpec(pkcs8Encoded)
java.security.KeyFactory.getInstance("RSA").generatePrivate(spec)
然而,如果您已经在使用Bouncy Castle,您可以使用它们的提供程序,不需要显式地将PKCS#1转换为PKCS#8,因为它们的KeyFactorySpi可以使用一个包含PKCS#1的
PKCS8EncodedKeySpec
。
e.g.:
java.security.spec.KeySpec spec = new java.security.spec.PKCS8EncodedKeySpec(pkcs1Encoded)
java.security.KeyFactory.getInstance("RSA", new BouncyCastleProvider()).generatePrivate(spec)
Bouncy Castle提供者也可以全局注册:
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())
...
java.security.spec.KeySpec spec = new java.security.spec.PKCS8EncodedKeySpec(pkcs1Encoded)
java.security.KeyFactory.getInstance("RSA").generatePrivate(spec)
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in pkcs1.key -out pkcs8.key
。请参考这里。 - Ben