2012-04-25 66 views
1

我寫了一個加密和解密函數。加密工作正常,但我總是在解密中得到IllegalBlockSizeException。IllegalBLockSizeException解密時

public static String aes_encrypt (String text, String key) 
{ 
    SecretKey skey = new SecretKeySpec(key.getBytes(), "AES"); 
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE"); 
    cipher.init(Cipher.ENCRYPT_MODE, skey); 

    return new String((cipher.doFinal(text.getBytes()))); 

} 

而這裏的解密函數:

public static String aes_decrypt (String text, String key) 
{ 

    SecretKey skey = new SecretKeySpec(key.getBytes(), "AES"); 
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE"); 
    cipher.init(Cipher.DECRYPT_MODE, skey); 

    return new String((cipher.doFinal(text.getBytes()))); 
} 

下面是測試這個簡單的main方法:

public static void main (String args[]) 
{ 
    String text = "Hello, world!"; 
    String key = "nv93h50sk1zh508v"; 
    String en, de; 

    System.out.println("Text: " + text); 
    System.out.println("Encrypted: " + (en = aes_encrypt(text, key)) 
      + " length = " + en.length()); 
    System.out.println("Decrypted: " + (de = aes_decrypt(en, key))); 
} 

有誰知道如何「墊」的加密字符串正確使我可以解密它? (我試過用填充0的字符串,直到長度爲16的整數倍,但得到的東西像string not properly padded

感謝

+0

你爲什麼寫自己的代碼?你有沒有試過「Bouncy Castle」圖書館? (http://www.bouncycastle.org/java.html) – 2012-04-25 19:23:59

+0

我寧可不使用第三方庫。 – 2012-04-25 19:28:53

+0

@CarlosTasada Bouncy Castle可以做很多事情。如果您的意思是使用CMS等容器格式,請儘可能多地指出並指出一個示例。 – 2012-04-25 21:14:23

回答

2

我認爲這個問題是您使用String構造函數。這將使用文本編碼機制轉換爲字符串,該機制可能不會保留字節數組中的每個值 - 系統默認編碼中不支持的值可能會被丟棄,從而使編碼數據比應該縮短。如果你想要一個字符串表示,轉換爲十六進制或基本64編碼。並在解密方法開始時反轉您在此使用的任何編碼。

這不是一個填充問題 - 加密調用會填充這個罰款,你缺乏字節,因爲你的手段將字節數組編碼爲一個字符串。

你會在this SO question的答案中找到一些基本的64條指令。

+0

請問你能更具體嗎?所以我需要將字節數組轉換爲十六進制值?謝謝 – 2012-04-25 19:30:14

+0

你顯然想要一個字節數組的文本表示,所以你可以傳遞一個字符串(儘管你總是可以將加密表單保存爲一個字節數組......)。所以常見的做法將涉及到轉換爲十六進制(包含32,65,99的字節數組將變爲204163)或編碼爲基本64(相同的數組將變爲IEFj)。 – 2012-04-25 19:35:39

相關問題