使用充气城堡阅读SSLeay格式私钥

时间:2015-02-10 11:32:08

标签: java cryptography bouncycastle jce

尝试读取SSLeay格式私钥时抛出InvalidKeyException。

请在下面找到详细信息: - 我有一个SSLeay格式私钥.pem格式以下面的文件

开头

-----开始RSA私钥-----

我正在编写代码以获取以字节格式保存的私钥并将其转换为PrivateKey。 变量 privateKeyBytes 包含字节格式的私钥/

String pkStrFormat = new String(privateKeyBytes, "UTF-8");
pkStrFormat = pkStrFormat.replaceAll("(-----BEGIN RSA PRIVATE KEY-----\\r?\\n|-----END RSA PRIVATE KEY-----+\\r?\\n?)","");
byte[] keyBytesOfPrivateKey = org.bouncycastle.util.encoders.Base64
                    .decode(pkStrFormat.getBytes());
KeyFactory ecKeyFac = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytesOfPrivateKey);            
PrivateKey priKey = ecKeyFac.generatePrivate(keySpec);

我得到以下例外: -

Caused by: java.security.InvalidKeyException: IOException : version mismatch: (supported:     00, parsed:     01
    at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:350)
    at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:356)

使用PKCS8格式密钥时,代码可以正常工作。

1 个答案:

答案 0 :(得分:1)

BEGIN RSA PRIVATE KEY开头的PEM文件是PKCS#1,而不是PKCS#8。对于固定算法RSA,PKCS#1本质上是PKCS#8,因此删除了算法标识符。要像https://superuser.com/questions/606215/openssl-pkcs8-default-format-gives-rsa-private-key中那样转换您的密钥:

openssl pkcs8 -topk8 -inform pem -in file.key -outform pem -nocrypt -out file.pem

或使用与Bouncy Castle : PEMReader => PEMParser类似的PEMParser(没有密码内容)