2011-08-01 90 views
14

當我在Android中運行此代碼時,它不會產生錯誤,但是當我在標準Java程序中運行它時,它會產生異常:java.security.InvalidKeyException:非法密鑰大小。java.security.InvalidKeyException:非法密鑰大小

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
SecretKeySpec keySpec = new SecretKeySpec(CHUNK_ENCRYPTION_KEY.getBytes(), 0, 32, "AES"); 
IvParameterSpec initVector = new IvParameterSpec(AES_INITIALIZATION_VECTOR.getBytes(), 0 , 16); 
cipher.init(Cipher.ENCRYPT_MODE, keySpec, initVector); 

CHUNK_ENCRYPTION_KEY是硬編碼到程序中的32字節密鑰。 AES_INITIALIZATION_VECTOR是一個16字節的硬編碼初始化向量。

有誰知道爲什麼它可以在Android上工作,而不是在桌面上?

+0

您的問題缺少一個問號。 – Snicolas

+0

@Hank我正面臨類似的問題。你有沒有解決這個問題? – NovusMobile

+0

不,我永遠無法解決這個 – Hank

回答

-1

也許你提供的KEY和Initialization Vector沒有32個字節,分別是16個字節長度。您也可以嘗試使用構造函數不帶參數的偏移和密鑰長度:

SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 
    IvParameterSpec ivSpec = new IvParameterSpec(iv); 
+0

我檢查了字節長度,當我轉換他們字節數組,如果我不做偏移量和長度,它會產生相同的異常。 – Hank

+0

您是否將十六進制字符串轉換爲字節? –

+0

是的,我的整個密鑰字符串由32個Unicode字符組成。 – Hank

24

在默認桌面JVM安裝(使用來自Sun /甲骨文的JRE或JDK),AES是限於128位密鑰大小。這是關於加密軟件的進口/出口法律的補充。要解鎖更大的AES密鑰,您需要下載並應用「JCE Unlimited Strength Jurisdiction Policy Files」(請參見this page的底部)。

密鑰大小限制由Cipher類中的代碼執行。改變加密提供者(例如,給Bouncy Castle或IAIK提​​供者之一)不會讓你繞過這個限制。

在一個不相關的音符,你不想使用原始getBytes()方法上String,因爲結果取決於當前的語言環境(不是每個人都使用UTF-8或甚至ASCII兼容編碼)。如果您想將密鑰表示爲文字字符串,請至少使用明確的編碼,例如:CHUNK_ENCRYPTION_KEY.getBytes("UTF-8")

1

在README中未明確指出「JCE Unlimited Strength Jurisdiction Policy Files」應該複製到jre內部JDK,否則它將無法工作。文件路徑應爲:/path/to/jdk1.7.0_xx/jre/lib/security

相關問題