You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bouncy Castle升级至1.70后编译报错:类型不兼容问题求助

解决Bouncy Castle PGP 1.70升级后的类型不兼容问题

这个错误是由于Bouncy Castle 1.70版本对PGPEncryptedDataList.getEncryptedDataObjects()方法的泛型返回类型做了调整:

  • 1.60版本中该方法返回Iterator<PGPPublicKeyEncryptedData>
  • 升级至1.70后,返回类型改为更通用的Iterator<PGPEncryptedData>,因为加密数据列表可能包含多种加密数据类型(比如PGPPublicKeyEncryptedData和PGPSecretKeyEncryptedData)

修复方案

将迭代器声明改为父类型PGPEncryptedData,遍历过程中通过类型判断筛选出你需要的PGPPublicKeyEncryptedData实例:

修改后的代码示例:

public static void decryptFile(Input in, Output out, Input keyIn, char[] password) {
    Security.addProvider(new BouncyCastleProvider());
    in = org.bouncycastle.openpgp.PGPUtil.getDecoderStream(in);
    KeyFingerPrintCalculator calc = new JcaKeyFingerprintCalculator();
    PGPObjectFactory pgpF = new PGPObjectFactory(in, calc);
    PGPEncryptedDataList enc;

    Object o = pgpF.nextObject();
    if (o instanceof PGPEncryptedDataList) {
        enc = (PGPEncryptedDataList) o;
    } else {
        enc = (PGPEncryptedDataList) pgpF.nextObject();
    }

    // 修改迭代器类型为PGPEncryptedData
    Iterator<PGPEncryptedData> it = enc.getEncryptedDataObjects();
    PGPPrivateKey key1 = null;
    PGPPublicKeyEncryptedData key2 = null;

    // 遍历并筛选目标类型对象
    while (it.hasNext()) {
        PGPEncryptedData data = it.next();
        if (data instanceof PGPPublicKeyEncryptedData) {
            key2 = (PGPPublicKeyEncryptedData) data;
            // 后续可添加密钥匹配逻辑
            break; // 根据业务需求决定是否终止遍历
        }
    }
}

说明

BC库的这次调整是为了更严谨地支持加密数据列表的多态场景,需要你在遍历过程中显式判断类型,确保只处理符合业务需求的加密数据实例。

内容的提问来源于stack exchange,提问作者Wolverine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:47:56