使用AES/GCM/NoPadding加密时抛出GCMParameterSpec相关异常的原因
解决AES/GCM加密时
InvalidAlgorithmParameterException的问题 嘿,这个报错确实有点反直觉——毕竟GCMParameterSpec就是专门为AES/GCM模式设计的参数类对吧?出现"GCM can not be used with class javax.crypto.spec.GCMParameterSpec"这个错误,大概率是以下几个原因导致的:
JDK版本太旧或存在兼容性bug:早期的JDK版本(比如JDK 7的部分早期更新版)对GCM模式的支持不完善,有些实现会错误地拒绝
GCMParameterSpec。如果你的项目还在使用老版本JDK,升级到JDK 8及以上版本基本就能解决这个问题。安全Provider不兼容:如果你的代码手动指定了加密Provider,或者JRE默认的Provider不是支持GCM的版本(比如某些第三方定制Provider),就可能出现这个错误。可以尝试显式指定官方支持的Provider,比如
SunJCE,它对GCM模式的支持是完善的。IV长度不符合规范:虽然错误信息没直接指向,但GCM模式推荐使用12字节(96位)的IV,有些老的Provider会对非标准长度的IV抛出参数错误。如果你的
iv变量长度不是12字节,调整一下试试。
修复后的代码示例
// 安全生成12字节的标准GCM IV byte[] iv = new byte[12]; new SecureRandom().nextBytes(iv); // 显式指定支持GCM的Provider Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "SunJCE"); GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv); SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); cipher.init(Cipher.ENCRYPT_MODE, keySpec, parameterSpec);
内容的提问来源于stack exchange,提问作者Surendra Naidu
相关产品推荐
相关产品推荐

