Algid解析错误,不是序列

DP_*_*DP_ 47 java security rsa

尝试使用该方法从文件中读取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);
}
Run Code Online (Sandbox Code Playgroud)

我得到了例外

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]
Run Code Online (Sandbox Code Playgroud)

在fac.generatePrivate(privKeySpec)调用.

这个错误是什么意思?

谢谢

德米特里

Dim*_*ris 65

我遇到了同样的问题,密钥的格式不是实际问题.
所有我必须做的就是去除那个例外就是打电话

java.security.Security.addProvider(
         new org.bouncycastle.jce.provider.BouncyCastleProvider()
);
Run Code Online (Sandbox Code Playgroud)


一切正常

  • 这如何解决这个问题? (14认同)
  • 解决方案有效,但其背后的原理是什么? (8认同)
  • 它有效......但为什么?! (7认同)
  • 这背后有何魔力? (4认同)
  • 哇谢谢你节省时间!我添加了以下依赖项来获取 BouncyCastleProvider: <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.70</version> </dependency> (4认同)
  • 这个魔法是如何运作的?0_o (3认同)

Jam*_*olk 60

这意味着您的密钥不是PKCS#8格式.最简单的方法是使用openssl pkcs8 -topk8 <...other options...>命令转换密钥一次.或者,您可以使用Bouncycastle轻量级APIPEMReader类.

  • 谢谢,它有效.这是命令:openssl pkcs8 -topk8 -nocrypt -in myrsakey.pem -out myrsakey_pcks8 (35认同)
  • @PSatishPatro:私钥采用 PKCS#1 格式。在本例中,线索是“-----BEGIN RSA PRIVATE KEY-----”,它表明这是“PEM”格式的 PKCS#1 私有密钥。 (2认同)

Pas*_*ibi 18

您必须使用私钥制作PCKS8文件!

private.pem =>私钥文件的名称

openssl genrsa -out private.pem 1024

public_key.pem =>公钥文件的名称

openssl rsa -in private.pem -poutout -outform PEM -out public_key.pem

private_key.pem => PCKS8格式的私钥名称!你可以在java中阅读这种格式

openssl pkcs8 -topk8 -inform PEM -in private.pem -out private_key.pem -nocrypt

  • 这是我的问题-该文件是使用`genrsa`生成的,它创建了PKCS#1格式(这是OP加载的格式,可以通过`BEGIN RSA PRIVATE KEY标头看到),而PKCS#8是不同的格式(由于头不同,可以检测到PEM编码:`BEGIN PRIVATE KEY`)。我的密钥生成器现在看起来像这样:`openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -out private.pem` (2认同)