破解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 安全屬性。