Java Algid分析错误,不是序列

Java Algid分析错误,不是序列,java,security,rsa,Java,Security,Rsa,尝试使用以下方法从文件中读取RSA私钥时 public PrivateKey getPrivateKey() throws NoSuchAlgorithmException, InvalidKeySpecException, IOException { final InputStream inputStream = getClass().getClassLoader() .getResourceAsStream("

尝试使用以下方法从文件中读取RSA私钥时

public PrivateKey getPrivateKey()
        throws NoSuchAlgorithmException,
        InvalidKeySpecException, IOException {

    final InputStream inputStream = getClass().getClassLoader()
                    .getResourceAsStream("privatekey");
    byte[] privKeyBytes = null;
    try {
        privKeyBytes = IOUtils.toByteArray(inputStream);
    } catch (final IOException exception) {
        LOGGER.error("", exception);
        IOUtils.closeQuietly(inputStream);
    }

    LOGGER.debug("privKeyBytes: {}", privKeyBytes);

    String BEGIN = "-----BEGIN RSA PRIVATE KEY-----";
    String END = "-----END RSA PRIVATE KEY-----";
    String str = new String(privKeyBytes);
    if (str.contains(BEGIN) && str.contains(END)) {
        str = str.substring(BEGIN.length(), str.lastIndexOf(END));
    }

    KeyFactory fac = KeyFactory.getInstance("RSA");
    EncodedKeySpec privKeySpec =
            new PKCS8EncodedKeySpec(Base64.decode(str.getBytes()));
    return fac.generatePrivate(privKeySpec);
}
我有个例外

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
    at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:200) ~[na:1.6.0_23]
    at java.security.KeyFactory.generatePrivate(KeyFactory.java:342) ~[na:1.6.0_23]
在fac.generatePrivate(privKeySpec)呼叫中

这个错误意味着什么

谢谢


Dmitri

表示您的密钥不是PKCS#8格式。最简单的方法是使用
opensslpkcs8-topk8
命令转换密钥一次。或者,您可以使用的类。

我也遇到了同样的问题,而密钥的格式并不是真正的问题。
我所要做的就是打电话给

java.security.Security.addProvider(
         new org.bouncycastle.jce.provider.BouncyCastleProvider()
);


一切正常

您必须使用私钥创建PCKS8文件

private.pem=>私钥文件的名称
openssl genrsa-out private.pem 1024
public_key.pem=>公钥文件的名称
openssl rsa-in private.pem-pubout-outform pem-out public_key.pem
‫‪私钥‬‬ => PCKS8格式的私钥名称!您可以在java中读取此格式
openssl pkcs8-topk8-notify PEM-in private.PEM-out private_key.PEM-nocrypt

谢谢,成功了。下面是命令:opensslpkcs8-topk8-nocrypt-in myrsakey.pem-out myrsakey_pcks8如果不是pkcs8格式,它可以是什么格式?如果可以有多个选项,如何在使用OPENSSL命令转换为PKCS8之前知道格式?@PSatishPatro:私钥是PKCS#1格式的。在本例中,线索是“----BEGIN RSA PRIVATE KEY-----”,它表示这是“PEM”格式的PKCS#1 PRIVATE。这是我的问题-该文件是使用创建PKCS#1格式的
genrsa
生成的(这是OP加载的格式,从
BEGIN RSA PRIVATE KEY
头可以看出),而PKCS#8是一种不同的格式(在PEM中,由于不同的头可以检测到编码:
BEGIN PRIVATE KEY
)。我的密钥生成器现在看起来是这样的:
openssl genrsa 2048 | openssl pkcs8-topk8-nocrypt-out private.pem
您有类似的EC私钥密钥生成器吗?@RahulAgrawal,很遗憾,没有公钥呢?默认情况下是否为PKCS#8格式?@SaiRamReddy“-outform PEM”设置输出格式,请查看文档: