【问题标题】:Bouncy Castle : PEMReader => PEMParser充气城堡:PEMReader => PEMParser
【发布时间】:2013-02-17 07:49:15
【问题描述】:

使用 PEM 证书,例如

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,B9846B5D1803E.....

使用 BC 1.46,我使用以下代码提取密钥对:

int myFunc(String pemString, char [] password) {

    ByteArrayInputStream tube = new ByteArrayInputStream(pemString.getBytes());

    Reader fRd = new BufferedReader(new InputStreamReader(tube));

    PEMReader pr = new PEMReader(fRd, new Password (password), "BC");

     try {
            Object o = pr.readObject();
            if (o instanceof KeyPair)
    .....

现在我刚刚安装了 BC 1.48,他们告诉我 PEMReader 已被弃用,必须由 PEMParser 替换。

我的问题是,AFAIK,PEMParser 中没有密码的地方。

谁能给我一个示例如何将我的代码迁移到 PEMParser 版本?

【问题讨论】:

    标签: java bouncycastle


    【解决方案1】:

    我只是需要解决同样的问题,但没有找到答案。 所以我花了一些时间研究 BC API 并找到了一个适合我的解决方案。 我需要从文件中读取私钥,所以在 myFunc 方法中有 privateKeyFileName 参数而不是 pemString 参数。

    使用 BC 1.48 和 PEMParser:

    int myFunc(String privateKeyFileName, char [] password) {
         File privateKeyFile = new File(privateKeyFileName); // private key file in PEM format
         PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile));
         Object object = pemParser.readObject();
         PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(password);
         JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
         KeyPair kp;
         if (object instanceof PEMEncryptedKeyPair) {
            System.out.println("Encrypted key - we will use provided password");
            kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv));
        } else {
            System.out.println("Unencrypted key - no password needed");
            kp = converter.getKeyPair((PEMKeyPair) object);
        }
    }
    

    【讨论】:

    • 如果私钥是 PKCS#8 格式,则该对象将是 PrivateKeyInfo 的一个实例。你必须使用converter.getPrivateKey((PrivateKeyInfo) object);
    • 太棒了,这帮助我将已弃用的 BC 1.46 org.bouncycastle.openssl.PEMReader 类的用法适应于更新的 PEMParser 技术。非常感谢!
    • @xwatch 你好,你能提供进口吗?找不到类 PEMParser - 我有点新 - 使用 MAVEN 我有这个依赖 org.bouncycastlebcprov- jdk15on1.56 无法正常工作。
    • @JuanCarlos 你需要使用org.bouncycastle, bcpkix-jdk15on 神器
    【解决方案2】:

    对于bcpkix-jdk15on 的 1.55 版,解密代码更改为:

    kp = ((PEMEncryptedKeyPair) object).decryptKeyPair(decryptorProvider);
    

    我没有检查这是否是上述答案中的错误,或者只是版本之间的 API 差异。

    【讨论】:

      猜你喜欢
      • 2022-10-30
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      相关资源
      最近更新 更多