2017-02-14 404 views
2

我試圖用AES解密一些數據。我已經擁有一個256位密鑰和16字節IV這樣的:JAVA AES 256解密

String key = "Hh1s1f4T2mpN3yCh4ngeL8t3r\\.Thxpp"; 

    int[] v = {11, 1, 555, 222, 241, 21, 11, 33, 35, 91, 45, 6, 14, 30, 22, 234}; 

    String IV = Arrays.toString(v); 

我已經告訴填充應該是PKCS7但是當我初始化密碼與AES/CBC/PKCS7PADDING它說:Cannot find any provider supporting AES/CBC/PKCS7PADDING

如果我用AES/CBC/PKCS5PADDING我得到Illegal key size但我檢查,關鍵尺寸爲32

public static String decrypt(String key, String initVector, String encrypted) { 
    try { 
     System.out.println("Key size: " + key.getBytes("UTF-8").length); 

     IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8")); 
     SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); 

     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); 
     cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); 

     byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted)); 

     return new String(original); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    return null; 
} 

回答

3

如果您通過AES-256獲得IllegalKeySize例外,請檢查以確保您的活動JVM中安裝了JCE Unlimited Cryptographic Strength Policy files。對於任何超過128 bits的AES密鑰長度,它們都是必需的。

(PKCS#7填充方案是effectively equivalent to PKCS #5 in Java(塊大小在規範中定義的不同),但Java從未添加的PKCS#7名的名單,因此使用PKCS5Padding是正確的。)

+0

感謝您的澄清,這解決了這個問題。很有趣,我們的生產環境確實包含了很多其他人所報道的這些庫。生產中的差異在於使用OpenJDK vs使用Oracle的開發。 –

-1

您需要使用充氣城堡作爲PKCS7PADDING供應商。

+0

在這種情況下,PKCS5只是一個命名問題,當AES添加到DES代碼時,名稱未更新爲PKCS7。這兩個名稱都適用於所有意圖和目的。 – zaph

1

首先看到的@Andy回答。

如果您收到「非法密鑰大小」錯誤,那麼密鑰大小不正確,您需要通過調試找出原因。創建爲UTF-8鍵

byte[] keyBytes = key.getBytes("UTF-8") 

一個變量,其顯示爲十六進制,這樣你可以清楚地看到它發生。

內聯轉換本質上不可調試。

PKCS#5填充是PKCS#7填充的一個子集,並且在每種情況下它都是相同的,PKCS#5只是懶惰開發人員從DES獲得的名稱保留。

PKCS#7 padding

PKCS#5填充相同PKCS#7填充,不同之處在於它僅被用於使用一個64位(8字節)的塊大小的塊密碼定義。在實踐中,兩者可以互換使用。