当前位置: 首页 > 面试题库 >

在Java中加载RSA私钥(algid解析错误,而非序列)

慕永年
2023-03-14
问题内容

我正在尝试将用ssl生成的RSA私钥加载到Java中,我的代码是:

生成密钥

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/aLIBNYErvmTtVWVaBkirrc8KQJABr+z
+sJB6S6X/fGHRkDkKJKeRvQo54QiUzHdENbwq0cQAVcMJbNZ/1c3oen2/1JLoNY5
I+dG8dCnEaGBT65VMQJBAIDqH1Kqs5tb51cpt6h9ot31SUVud5pSML/babwp3pRs
1s6poreym4PkAyRug0Dgcj1zVLt25TlOHvrL9r3Swq8=
-----END RSA PRIVATE KEY-----

加载:

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);

并抛出一个IOException : algid parse error, not a sequence。错误在哪里?

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)

问题答案:

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

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;
}

您所需要的只是模数和指数。



 类似资料:
  • 问题内容: 尝试使用方法从文件中读取RSA私钥时 我例外 在fac.generatePrivate(privKeySpec)调用中。 这个错误是什么意思? 谢谢 德米特里 问题答案: 这意味着您的密钥不是PKCS#8格式。最简单的方法是使用命令一次转换密钥。或者,您可以使用Bouncycastle轻量级API的类。

  • 问题内容: 我正在尝试使用RSA私钥加密某些内容。 我遵循以下示例:http : //www.junkheap.net/content/public_key_encryption_java, 但将其转换为使用私钥而不是公共密钥。遵循该示例,我认为我需要做的是: 读取DER格式的私钥 生成PCKS8EncodedKeySpec 从KeyFactory调用generatePrivate()获得一个私钥

  • 我在Java写一个安全的文件共享应用程序。一般的架构是这样的: 用户希望加密文件以在多个用户之间安全共享 应用程序在客户端上生成一个随机UUID,并将其用作AES 256密码,然后使用UUID对数据进行加密 然后使用每个人的公钥对UUID进行RSA加密。每个共享用户一次 每个加密的UUID数据包作为文件的一部分存储在自定义文件头中 然后将文件上载到其他人可以访问的服务器 用户可以使用各自的私钥读取

  • 问题内容: 我正在为SAML 1.1断言消费者服务开发测试工具。测试必须生成签名的SAMLResponse,并将其提交给以Base64编码的ACS。ACS必须能够使用X509公共证书来验证签名的消息。 我能够构建SAMLResponse,添加必要的断言等。但是,当我尝试对对象进行签名时,我遇到了问题。这是我当前代码的一个片段: 错误发生在倒数第二行。我在控制台中看到以下内容: 尽管不是常规或安全的

  • 问题内容: 我正在尝试从java中的文件加载私钥。该密钥由ssh-agent生成。我实际上正在使用以下代码: 但是它产生了这个异常: 这是私钥: 有什么建议?谢谢。 问题答案: 您确定它是RSA吗?您还确定密钥的格式正确吗? 如果两个问题的答案都是肯定的,则可以尝试使用bouncycastle lib 编辑: 尝试从密钥中删除这些行: 更新:请 确保您的私钥为PKCS8格式,如果不需要,请按此处进

  • 我在使用Java Bouncycastle的客户机和使用Python RSA库的密钥服务器之间交换私钥时遇到了困难。PEM格式用于通过REST传输密钥。keyserver无法解密我提供的密钥(加密密码更改时需要),它需要PKCS#1或PKCS#8密钥和PEM,如下所示: 但是BouncyCastle的输出(使用JCEpeEncryptorBuilder和JcaMiscPEMGenerator)的起