记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填充。

  1. 上BouncyCastle官网
    下载对应JDK版本的jar包,笔者使用的是JDK1.8,所以下载最新版bcprov-ext-jdk15on-159.jar
    记Java中AES加密踩的坑_第1张图片
  2. 把下载的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)
  3. 修改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
  4. 在使用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 文件

你可能感兴趣的:(Java)