在Java中加载RSA私钥(algid parse error,而不是序列) [英] Load a RSA private key in Java (algid parse error, not a sequence)

查看:3264
本文介绍了在Java中加载RSA私钥(algid parse error,而不是序列)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



生成密钥

我正在尝试将ssl生成的私有RSA密钥加载到java中, / p>

  openssl genrsa -out mykey.pem 1024 

结果:

  ----- BEGIN RSA PRIVATE KEY ----- 
MIICXAIBAAKBgQCUibP4fY2PA / sGMKMbU6usuIGcOAqgQjD6c2ylVo05Oz7pgjnE
+ O0l2MFRUYUGT5KKk / W + 0cAXkxaQHE3n8A8X1mHT8eMDmWnzz0PeYjDE8LQmAw8R
Y2FnVKFAB36BIjdb5FsZmCk5QYKU5 + nWLMqH / J / IR5AyX5wR2SMoslUg2QIDAQAB
AoGAeJ1s7638IhLIZtldyRXjRKi6ToFPV50IKodJxOSIXt3WE0V05ZaA84eUSxUY
IOzCgRbuqVmnUz1USAdD18AecC8qc7tXTRALLy7q8fxklPwmGPUOvTFmI7gRMUnv
cWrq1gySk3SKpj0YmWnuY9Xmd2 + xoWLzUeFD1CROY5OTjIECQQDDlp1 + AL7 + duR0
XyMlkWLIk0nIbkQ5zlTAEipzmaeTSOJi6YG3EMMz3AGuZb7tw6HFxWqeg1hyKJ + T
cTM3WTdJAkEAwmrCDKE29n3wFOBKsZZFQbDgVOUXCBs2ubEI + ALe1DJU5BlfnrhJ
OINRCNgnwSFNbwxDTkDpR6J6Av2ElAvNEQJAV0dVvk5Wj50Ecz2lFHWdLD41taAn
B9igDxnMIcvWcK4cf + ENhmCPiwvJIEa8 / aLIBNYErvmTtVWV aBkirrc8KQJABr + Z
+ sJB6S6X / fGHRkDkKJKeRvQo54QiUzHdENbwq0cQAVcMJbNZ / 1c3oen2 / 1JLoNY5
I + dG8dCnEaGBT65VMQJBAIDqH1Kqs5tb51cpt6h9ot31SUVud5pSML / babwp3pRs
1s6poreym4PkAyRug0Dgcj1zVLt25TlOHvrL9r3Swq8 =
----- END RSA私钥-----

加载:



< p $ p> String privKeyPEM = readFile(mykey.pem);
privKeyPEM = privKeyPEM.replace(----- BEGIN RSA PRIVATE KEY -----,).replace(\\\
,);
//删除第一行和最后一行
privKeyPEM = privKeyPEM.replace(----- END RSA PRIVATE KEY -----,);
System.out.println(privKeyPEM);

// Base64解码数据
byte [] encoded = Base64.decode(privKeyPEM);

// PKCS8解码编码的RSA私钥
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance(RSA);
PrivateKey privKey = kf.generatePrivate(keySpec);

//显示结果
System.out.println(privKey);

它会抛出一个 IOException:algid解析错误,而不是序列。错误在哪里?

 线程main中的异常java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException :algid parse error,而不是序列
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)
at java.security.KeyFactory.generatePrivate(Unknown Source)
at base54.encrypt .RSAToy.main(RSAToy.java:36)
导致:java.security.InvalidKeyException:IOException:algid解析错误,而不是序列
at sun.security.pkcs.PKCS8Key.decode(未知来源)
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl。< init>(Unknown Source)
at sun.security.rsa .RSAPrivateCrtKeyImpl.newKey(未知来源)
at sun.security.rsa.RSAKeyFactory.generatePrivate(Unknown Source)


解决方案

如果需要,您仍然可以加载密钥,

  public static PublicKey bigIntegerTo PublicKey(BigInteger e,BigInteger m){
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(m,e);
KeyFactory fact = KeyFactory.getInstance(RSA);
PublicKey pubKey = fact.generatePublic(keySpec);
return pubKey;
}

public static PrivateKey bigIntegerToPrivateKey(BigInteger e,BigInteger m){
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m,e);
KeyFactory fact = KeyFactory.getInstance(RSA);
PrivateKey privKey = fact.generatePrivate(keySpec);
return privKey;
}

所有你需要的是模数和指数。


I'm trying to load a private RSA key generated with ssl into java, my code is:

Generate the key:

openssl genrsa -out mykey.pem 1024

Result:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCUibP4fY2PA/sGMKMbU6usuIGcOAqgQjD6c2ylVo05Oz7pgjnE
+O0l2MFRUYUGT5KKk/W+0cAXkxaQHE3n8A8X1mHT8eMDmWnzz0PeYjDE8LQmAw8R
Y2FnVKFAB36BIjdb5FsZmCk5QYKU5+nWLMqH/j/IR5AyX5wR2SMoslUg2QIDAQAB
AoGAeJ1s7638IhLIZtldyRXjRKi6ToFPV50IKodJxOSIXt3WE0V05ZaA84eUSxUY
IOzCgRbuqVmnUz1USAdD18AecC8qc7tXTRALLy7q8fxklPwmGPUOvTFmI7gRMUnv
cWrq1gySk3SKpj0YmWnuY9Xmd2+xoWLzUeFD1CROY5OTjIECQQDDlp1+Al7+duR0
XyMlkWLIk0nIbkQ5zlTAEipzmaeTSOJi6YG3EMMz3AGuZb7tw6HFxWqeg1hyKJ+T
cTM3WTdJAkEAwmrCDKE29n3wFOBKsZZFQbDgVOUXCBs2ubEI+ALe1DJU5BlfnrhJ
OINRCNgnwSFNbwxDTkDpR6J6Av2ElAvNEQJAV0dVvk5Wj50Ecz2lFHWdLD41taAn
B9igDxnMIcvWcK4cf+ENhmCPiwvJIEa8/aLIBNYErvmTtVWVaBkirrc8KQJABr+z
+sJB6S6X/fGHRkDkKJKeRvQo54QiUzHdENbwq0cQAVcMJbNZ/1c3oen2/1JLoNY5
I+dG8dCnEaGBT65VMQJBAIDqH1Kqs5tb51cpt6h9ot31SUVud5pSML/babwp3pRs
1s6poreym4PkAyRug0Dgcj1zVLt25TlOHvrL9r3Swq8=
-----END RSA PRIVATE KEY-----

Load:

String privKeyPEM=readFile("mykey.pem");
privKeyPEM= privKeyPEM.replace("-----BEGIN RSA PRIVATE KEY-----", "").replace("\n", "");
// Remove the first and last lines
privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", "");
System.out.println(privKeyPEM);

// Base64 decode the data
byte [] encoded = Base64.decode(privKeyPEM);

// PKCS8 decode the encoded RSA private key
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(keySpec);

// Display the results
System.out.println(privKey);

and it throws an IOException : algid parse error, not a sequence. Where is the error?

Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)
at java.security.KeyFactory.generatePrivate(Unknown Source)
at base54.encrypt.RSAToy.main(RSAToy.java:36)
Caused by: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(Unknown Source)
at sun.security.rsa.RSAKeyFactory.generatePrivate(Unknown Source)

解决方案

You could still load the keys if necessary,

public static PublicKey bigIntegerToPublicKey(BigInteger e, BigInteger m)  {
    RSAPublicKeySpec keySpec = new RSAPublicKeySpec(m, e);
    KeyFactory fact = KeyFactory.getInstance("RSA");
    PublicKey pubKey = fact.generatePublic(keySpec);
    return pubKey;
}

public static PrivateKey bigIntegerToPrivateKey(BigInteger e, BigInteger m) {
    RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m, e);
    KeyFactory fact = KeyFactory.getInstance("RSA");
    PrivateKey privKey = fact.generatePrivate(keySpec);
    return privKey;
}

all you need is the modulus and the exponent.

这篇关于在Java中加载RSA私钥(algid parse error,而不是序列)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆