Java7调用AES/GCM/NoPadding解密报NoSuchAlgorithmException错误
问题解决方法
- 核心根因1:你使用的BouncyCastle依赖版本与Java 7不兼容。当前引入的
bcprov-jdk15to18-169.jar是适配JDK 15到JDK 18的版本,无法在Java 7环境下正常加载GCM算法实现,这是报错的最主要原因。 - 核心根因2:同时引入了
bcprov和bcprov-ext两个同类型依赖,容易出现类冲突,导致算法实现加载失败。 - 核心根因3:GCM模式在旧版本BouncyCastle中不支持
IvParameterSpec作为参数,需要使用专门的GCMParameterSpec类指定认证标签长度。
具体解决步骤
- 替换BouncyCastle依赖:移除现有的两个bcprov包,换成适配Java 7的
bcprov-jdk15on系列版本,推荐使用1.69或1.70版本,该系列兼容JDK 1.5到JDK 1.8。 - 清理重复依赖:只保留单个
bcprov-jdk15on包即可,不需要同时引入ext版本。 - 修改解密参数构造逻辑:将原有的
IvParameterSpec替换为GCMParameterSpec,指定GCM认证标签长度为128位(行业通用值),同时确保你的IV总长度为12字节(GCM官方推荐的IV长度,可避免额外安全风险)。 - (可选)如果动态注册Provider失效,可以改为静态注册:打开JDK安装目录下的
jre/lib/security/java.security文件,在provider配置列表末尾添加一行security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider,数字10可根据你现有provider的顺序调整。
修改后的参考代码如下:
public static byte[] decryptRes(final byte[] sessionKey, final String symetricKeyAlg, final String pkiProvider, final String encXML, final String msgRefNo) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException, InvalidAlgorithmParameterException { Security.addProvider(new BouncyCastleProvider()); final StringBuilder strBuilder = new StringBuilder(msgRefNo); strBuilder.append("0000"); // 显式指定字符集,避免不同环境默认字符集差异导致IV错误 byte[] iv = strBuilder.toString().getBytes(StandardCharsets.UTF_8); final SecretKeySpec symmKeySpec = new SecretKeySpec(sessionKey, "AES"); final Cipher symmCipher = Cipher.getInstance("AES/GCM/NoPadding", "BC"); // 替换为GCMParameterSpec,指定128位认证标签长度 symmCipher.init(Cipher.DECRYPT_MODE, symmKeySpec, new GCMParameterSpec(128, iv)); final byte[] xmlData = symmCipher.doFinal(base64Decode(encXML)); return xmlData; }
内容的提问来源于stack exchange,提问作者Pratyusha Vemulapalli
相关产品推荐
相关产品推荐

