Java开发中的加密、解密、签名、验签,密钥,证书(上篇)( 四 )

使用方法如下:@Testpublic void testAES() throws Exception {byte[] encodedKey = SecurityUtil.generateAESKey();String data = "http://kandian.youth.cn/index/this is a good boy";byte[] encryptedData = http://kandian.youth.cn/index/SecurityUtil.encryptByAES(encodedKey, data.getBytes());byte[] decryptedData = SecurityUtil.decryptByAES(encodedKey, encryptedData);Assert.assertEquals(data, new String(decryptedData));}虽然AES支持128、192或 256的密钥长度 , 但是当我们使用192或256位长度的密钥时 , 会收到这个异常:java.security.InvalidKeyException: Illegal key size or default parameters
java.security.InvalidKeyException: Illegal key size or default parameters at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026) at javax.crypto.Cipher.implInit(Cipher.java:801) at javax.crypto.Cipher.chooseProvider(Cipher.java:864) at javax.crypto.Cipher.init(Cipher.java:1249) at javax.crypto.Cipher.init(Cipher.java:1186) at com.example.architecture.util.SecurityUtil.encryptByAES(SecurityUtil.java:161) at com.example.architecture.util.SecurityUtilTest.testAES(SecurityUtilTest.java:97) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)原因是JRE中自带的local_policy.jar 和US_export_policy.jar是支持128位密钥的加密算法 , 而当我们要使用192或256位密钥算法的时候 , 已经超出它支持的范围 。
解决方案:去官方下载JCE无限制权限策略文件 。
JDK5 | JDK6 | JDK7| JDK8
下载后解压 , 可以看到local_policy.jar和US_export_policy.jar以及readme.txt

  • 如果安装了JRE , 将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件 。
  • 如果安装了JDK , 还要将两个jar文件也放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件 。
AES128和AES256主要区别是密钥长度不同(分别是128bits , 256bits)、加密处理轮数不同(分别是10轮 , 14轮) , 后者强度高于前者 , 当前AES是公认的较为安全的对称加密算法 。
【Java开发中的加密、解密、签名、验签,密钥,证书(上篇)】至此 , 上篇结束 , 更多精彩内容 , 欢迎继续阅读下篇 。
参考资料:
对称加密/2152944
非对称加密算法/1208652