两个问题:
1. 密钥超出了JDK默认的长度128时会报错:
java.security.InvalidKeyException: Illegal key size or default parameters
(参考别人的)因为美国的出口限制,Sun通过权限文件(local_policy.jar、US_export_policy.jar)做了相应限制。因此存在一些问题:
●密钥长度上不能满足需求(如:java.security.InvalidKeyException: Illegal key size or default parameters);
●部分算法未能支持,如MD4、SHA-224等算法;
●API使用起来还不是很方便;一些常用的进制转换辅助工具未能提供,如Base64编码转换、十六进制编码转换等工具。
Oracle在其官方网站上提供了无政策限制权限文件(Unlimited Strength Jurisdiction Policy Files),我们只需要将其部署在JRE环境中,就可以解决限制问题。
解决办法:
JDK8 jar包下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
JDK7 jar包下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
%JDK_Home%\jre\lib\security目录下,对应覆盖local_policy.jar和US_export_policy.jar两个文件。
%JRE_Home%\lib\security目录下,也需要对应覆盖这两个文件。
2. JDK自带的方法只支持PKCS5Padding,PKCS7Padding需要特殊处理:
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
具体加解密算法如下:
public class AesUtils { /** * 算法/模式/填充 **/ private static final String CipherMode = "AES/ECB/PKCS7Padding"; /** * 创建密钥 **/ private static SecretKeySpec createKey(String password) { byte[] data = null; if (password == null) { password = ""; } StringBuffer sb = new StringBuffer(32); sb.append(password); while (sb.length() < 32) { sb.append("0"); } if (sb.length() > 32) { sb.setLength(32); } try { data = sb.toString().getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { log.error("createKey error: ", e); } return new SecretKeySpec(data, "AES"); } public static String create32Key(String password) { StringBuffer sb = new StringBuffer(32); sb.append(password); while (sb.length() < 32) { sb.append("0"); } if (sb.length() > 32) { sb.setLength(32); } return sb.toString(); } /** * 加密字节数据 **/ public static byte[] encryptJava(byte[] content, String password) { try { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); SecretKeySpec key = createKey(password); Cipher cipher = Cipher.getInstance(CipherMode); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] result = cipher.doFinal(content); return result; } catch (Exception e) { log