我怎样才能读取使用JCA一个BouncyCastle的私钥PEM文件? [重复](How can

2019-07-18 00:28发布

这个问题已经在这里有一个答案:

  • 转换采用openSSH RSA密钥对javax.crypto.Cipher中的兼容格式 1个回答

在我们的应用程序的一个私钥使用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

将得到的输出I可以Base64编码,然后读取使用的爪哇/ 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密钥对对象作为输出。 要改写我原来的问题:我可以做的代码相当于上面,而不依赖于PEMReader(反过来不少其他BouncyCastle的类)?

Answer 1:

PEM文件的主要内部已经存储在PKCS#8格式,所以如果没有使用密码加密,你可以删除页眉(----- BEGIN RSA私钥-----),Base64编码解码输入,并得到所需要的字节数。



文章来源: How can I read a BouncyCastle private key PEM file using JCA? [duplicate]