记Java中AES加密踩的坑
一、异常
1.java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding
在使用AES算法的时候,你可能在 KeyGenerator kgen = kgen = KeyGenerator.getInstance("AES");
或者 Cipher cipher = Cipher.getInstance("AES");
这里报了NoSuchAlgorithmException
的异常,那么很好,你进坑了。
如果你有写过Android App,你会发现你平时都是这么干的,但是为什么在Java中就报错了?
上网找了好久,但都没能解决我的问题。最终找到一个比较合理的解释
Android支持PKCS7Padding填充方式,而java默认支持是PKCS5Padding填充方式
这也就大概知道了上面Cannot find any provider supporting AES/CBC/PKCS7Padding
是怎么回事,要解决这个问题可以去BouncyCastle下载组件以支持PKCS7Padding填充。
- 上BouncyCastle官网
下载对应JDK版本的jar包,笔者使用的是JDK1.8,所以下载最新版bcprov-ext-jdk15on-159.jar - 把下载的bcprov-ext-jdk15on-159.jar分别复制到
${jdk_home}\jre\lib\ext
(eg:D:\Java\jdk1.8.0_144\jre\lib\ext)
${jre_home}\lib\ext
(eg:D:\Java\jre1.8.0_144\lib\ext) - 修改java.security文件
${jdk_home}\jre\lib\security\java.security
(eg:D:\Java\jdk1.8.0_144\jre\lib\security\java.security)
${jre_home}\lib\security\java.security
(eg:D:\Java\jre1.8.0_144\lib\security\java.security)
添加Java的默认加密提供者security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
- 在使用AES前,加入
Security.addProvider(new BouncyCastleProvider());
即可,如果显示该class还没导入,那就手动导入到该工程就好
2.java.security.InvalidKeyException: Illegal key size
参考stack overflow:https://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters
Java密码扩展(JCE)无限强度管辖权策略文件 6
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
Java密码扩展(JCE)无限强度管辖权策略文件7
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
Java密码扩展(JCE)无限强度管辖权策略文件8
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下载对应的文件后,替换
${jdk_home}/jre/lib/security
${jre_home}/lib/security
目录下的 local_policy.jar 和 US_export_policy.jar 文件