破解AES秘钥长度限制
高级加密标准
- AES:在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES。
密码说明
- 因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度均可以是128,192或256比特。加密过程中使用的密钥是由Rijndael密钥生成方案产生。
加密限制
- 因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制。比如默认不允许256位密钥的AES加解密。
应对策略
方法一:安装官方的策略文件
策略文件下载地址(jar包)
JDK6的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.htmlJDK7的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.htmlJDK8的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。
如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security下覆盖原来文件,记得先备份。
如果安装了JDK,将两个jar文件也放到%JDK_HOME%\jre\lib\security下。
方法二:使用反射修改JDK关键代码
//这里是通过反射移除了isRestricted 的变量修饰符:final
//然后将isRestricted 赋值为false即可
static {
//break JCE crypto policy limit
try {
Class<?> clazz = Class.forName("javax.crypto.JceSecurity");
Field nameField = clazz.getDeclaredField("isRestricted");
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(nameField, nameField.getModifiers() & ~Modifier.FINAL);
nameField.setAccessible(true);
nameField.set(null, java.lang.Boolean.FALSE);
} catch (Exception ex) {
ex.printStackTrace();
}
}
- 方法三:使用crypto.policy 解除受限加密
所需版本:Java 8 Update 151 (8u151)
在以前的发行版中,JCE 权限文件必须单独下载和安装,才能允许 JDK 使用不受限加密。现在,不再需要下载和安装步骤。要启用不受限加密,用户可以使用新的 crypto.policy 安全属性。
官方链接:—— [ Java 8 发行版要点说明 ]
文章摘录:
Java 8 Update 151 (8u151)
发行版要点说明新增功能:用于控制加密策略的新安全属性
本发行版引入了一项新功能,使得可以通过新安全属性控制 JDK 使用的 JCE 权限策略文件。在以前的发行版中,JCE 权限文件必须单独下载和安装,才能允许 JDK 使用不受限加密。现在,不再需要下载和安装步骤。要启用不受限加密,用户可以使用新的 crypto.policy 安全属性。如果在 java.security 文件中设置了新安全属性 (crypto.policy),或者在初始化 JCE 框架之前已经使用 Security.setProperty() 调用来动态设置了该安全属性,则将遵循该设置。默认情况下,此属性未定义。如果此属性未定义,并且传统 lib/security 目录中不存在传统的 JCE 权限文件,则默认加密级别将保留为“受限”。要将 JDK 配置为使用不受限加密,请将 crypto.policy 设置为“无限制”值。有关详细信息,请参阅本发行版随附的 java.security 文件中的说明。
注:在 Solaris 上,建议删除旧 SVR4 包,然后再安装新的 JDK 更新。如果在早于 6u131、7u121、8u111 的 JDK 发行版上完成了基于 SVR4 的升级(不卸载旧包),则您应在 java.security 文件中设置新的 crypto.policy 安全属性。