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

Bouncycastle加载加密私钥报InvalidAlgorithmParameterException(Java11)

问题产生原因
  • JDK 9及以上版本调整了安全Provider的默认优先级,内置的SunJCE Provider优先级高于手动添加的BouncyCastle(BC)Provider。Java 8环境下BC Provider优先级更高,解密时默认调用BC的PBE算法实现,该实现会自动从PKCS8加密私钥结构中提取所需的盐、迭代次数等PBE参数,不需要额外传入。
  • 你代码中的JceOpenSSLPKCS8DecryptorProviderBuilder未显式指定Provider,Java 11环境下会优先调用SunJCE的PBEWithMD5AndDES算法实现(对应异常中的OID 1.2.840.113549.1.5.3),而SunJCE的该实现要求必须显式传入PBE参数,否则就会抛出InvalidAlgorithmParameterException: Parameters missing异常。
  • 你当前使用的BC 1.57版本发布时间较早,对Java 9+的模块化、Provider优先级适配存在缺陷,也会加剧该问题的出现。
修复方案

方案1(优先采用,改动最小)

显式给解密构造器指定使用BouncyCastle Provider,修改decryptorProvider构造代码即可:

// 原来的代码
// InputDecryptorProvider decryptorProvider = new JceOpenSSLPKCS8DecryptorProviderBuilder().build(password.toCharArray());
// 修改为下面的代码,指定使用BC Provider
InputDecryptorProvider decryptorProvider = new JceOpenSSLPKCS8DecryptorProviderBuilder()
        .setProvider(BouncyCastleProvider.PROVIDER_NAME)
        .build(password.toCharArray());

如果修改后仍报错,可以调整BC Provider的插入优先级,将初始化Provider的代码改为:

// 将BC Provider插入到优先级第1位
Security.insertProviderAt(new BouncyCastleProvider(), 1);

方案2(适配高版本JDK建议)

升级BouncyCastle依赖版本到1.60及以上,新版本已经针对Java 9+的安全体系做了适配,避免Provider优先级导致的调用异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:24:00