【问题标题】:How to read DER DSA private key to AsymmetricKeyParameter in bouncy castle (Java)如何在充气城堡(Java)中读取 DER DSA 私钥到 AsymmetricKeyParameter
【发布时间】:2015-04-09 07:13:24
【问题描述】:

如何将带有私有 DSA 密钥(4096 位)的 DER 文件读入 AsymmetricKeyParameter 以便在 DSASigner 中使用?

我尝试了以下代码:

 byte[] privateKeyBytes = FileUtils.readFileToByteArray(new File(
                    "sign-key-private.der"));
 AsymmetricKeyParameter privateKey = PrivateKeyFactory
                    .createKey(privateKeyBytes);

结果是异常:

java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.ASN1Integer
    at org.bouncycastle.asn1.ASN1Sequence.getInstance(Unknown Source)
    at org.bouncycastle.asn1.x509.AlgorithmIdentifier.getInstance(Unknown Source)
    at org.bouncycastle.asn1.pkcs.PrivateKeyInfo.<init>(Unknown Source)
    at org.bouncycastle.asn1.pkcs.PrivateKeyInfo.getInstance(Unknown Source)
    at org.bouncycastle.crypto.util.PrivateKeyFactory.createKey(Unknown Source)
    at test.security.core.Program.main(Program.java:41)

【问题讨论】:

  • DER 文件是否以任何方式编码,或受密码保护?
  • 根据来源,调用了以下方法:PrivateKeyFactory.createKey(PrivateKeyInfo.getInstance(new ASN1InputStream(inputStream).readObject()));请尝试手动执行此操作,使用new FileInputStream("sign-key-private.der");查看哪个步骤失败
  • 从源和堆栈跟踪,它试图解析 ANS 编码的算法标识符,期望一个序列,并获得一个 ASN 编码的整数。那么......您是否有机会使用 openssl 转储 .DER 文件的内容并确保它可以成功执行此操作?
  • DER 文件不受密码保护,由 XCA 0.9.3 生成。我通过转换为 PEM 文件解决了这个问题

标签: java bouncycastle dsa


【解决方案1】:

我最终使用的解决方法是将密钥转换为 PEM 格式并使用以下内容:

 @Cleanup
 FileReader privateKeyReader = new FileReader(new File("key.pem"));
 @Cleanup
 PEMParser parser = new PEMParser(privateKeyReader);

 PEMKeyPair keyPair = (PEMKeyPair) parser.readObject();
 AsymmetricKeyParameter privateKey = PrivateKeyFactory
     .createKey(keyPair.getPrivateKeyInfo());
 AsymmetricKeyParameter publicKey = PublicKeyFactory
     .createKey(keyPair.getPublicKeyInfo());

【讨论】:

    【解决方案2】:
    byte[] privateKeyBytes = FileUtils.readFileToByteArray(new File("sign-key-private.der"));
    KeyFactory kf = KeyFactory.getInstance("RSA", "BC");
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
    RSAPrivateKey rsaKey = (RSAPrivateKey) kf.generatePrivate(keySpec);
    AsymmetricKeyParameter privateKeyParameter = new RSAKeyParameters(true, rsaKey.getModulus(), rsaKey.getPrivateExponent());
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2022-10-30
    • 2015-06-29
    • 2015-08-09
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多