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
相关产品推荐
相关产品推荐

