如何使用JCA读取BouncyCastle私钥PEM文件?

在我们的一个应用程序中,使用BouncyCastle的PEMWriter存储私钥。 目前我正在调查是否可以摆脱BouncyCastle依赖,因为Java 7似乎拥有我们需要的一切。 唯一的问题是我无法读取存储在数据库中的私钥作为PEM编码的字符串(证书/公钥很好)。

如果我将私有密钥的PEM编码字符串从数据库保存到文件,我可以运行OpenSSL将密钥转换为PKCS#8格式,如下所示:

openssl pkcs8 -topk8 -inform PEM -outform DER \ -in private_key.pem -out private_key.der -nocrypt 

结果输出我可以base64编码,然后使用这个Java / JCA代码读取:

 byte[] privateKeyBytes = DatatypeConverter.parseBase64Binary(privateKeyDERcontents); PrivateKey prKey = KeyFactory.getInstance("RSA"). generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes)); 

这个私钥与预期存储的公钥匹配,即我可以从明文到密文和返回往返。

我的问题是:我能以某种方式直接读取原始PEM编码吗?

编辑

下面是一些使用BouncyCastle读取相关字符串的代码:

 if (Security.getProvider("BC") == null) { Security.addProvider(new BouncyCastleProvider()); } PEMReader pemReader = new PEMReader(new StringReader(privateKeyPEM)); KeyPair keyPair = (KeyPair) pemReader.readObject(); PrivateKey key = keyPair.getPrivate(); 

“privateKeyPEM”是数据库中的PEM编码字符串,否则此示例是自包含的。 有趣的是,它已经使用JCA KeyPair对象作为输出。 重新解释我的原始问题:我可以在不依赖于PEMReader(以及其他一些其他BouncyCastle类)的情况下执行上述代码的等效操作吗?

PEM文件中的密钥已经存储在PKCS#8格式中,因此如果没有使用密码加密,您只需删除标题(—– BEGIN RSA PRIVATE KEY —–),Base64-decode输入和得到所需的字节。