2013-02-17 98 views
2

我試圖從PHP讀取base64編碼和AES 128位加密字符串,但我得到IllegalBlockSizeException。Java從PHP加密/解密數據到Java,IllegalBlockSizeException

PHP加密:

encrypt("My f awesome test !"); 

function encrypt($string){ 
    $td = mcrypt_module_open('rijndael-128', '', 'cbc', "1cc251f602cf49f2"); 

    mcrypt_generic_init($td, "f931c96c4a4e7e47", "1cc251f602cf49f2"); 
    $enc = mcrypt_generic($td, $string); 

    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    return base64_encode($enc); 
} 

並且返回的值是:

McBeY73GQ5fawxIunVKpqUupipeRlt9ntyMRzjbPfTI =

現在我想用Java來閱讀:

static public String decrypt(String data) throws Exception { 
    data = new String(Base64.decode(data, Base64.NO_WRAP)); 

    byte[] keyByte = "f931c96c4a4e7e47".getBytes("UTF-8"); 
    byte[] ivByte = "1cc251f602cf49f2".getBytes("UTF-8"); 

    Key key = new SecretKeySpec(keyByte, "AES"); 
    IvParameterSpec iv = new IvParameterSpec(ivByte); 
    Cipher c = Cipher.getInstance("AES/CBC/NoPadding"); 
    c.init(Cipher.DECRYPT_MODE, key, iv); 
    byte[] bval = c.doFinal(data.getBytes("UTF-8")); 

    return new String(bval); 
} 

而且我得到一個例外:

javax.crypto.IllegalBlockSizeException:數據不是塊大小一致

這可能是由填充造成的?

EDIT

enter image description here

+0

爲什麼密碼設置爲解密模式?還應該明確指出錯誤發生的位置以及輸入的內容。 – spinkus 2013-02-17 11:42:25

回答

1

扔到調用doFinal(所述IllegalBlockSizeException)如果:「密碼是塊密碼,沒有填充已被請求(僅在加密模式),和總輸入由此密碼處理的數據長度不是塊大小的倍數;或者如果此加密算法無法處理所提供的輸入數據。「 - http://docs.oracle.com/javase/6/docs/api/javax/crypto/Cipher.html#doFinal%28%29。所以它要麼是不好的輸入數據要麼是塊大小。

3

您的錯誤是由於明文向字符串和字符串的轉換造成的。這是不必要的了 - 只需使用字節數組:

byte[] data = Base64 
    .decodeBase64("McBeY73GQ5fawxIunVKpqUupipeRlt9ntyMRzjbPfTI="); 
byte[] keyByte = "f931c96c4a4e7e47".getBytes("UTF-8"); 
byte[] ivByte = "1cc251f602cf49f2".getBytes("UTF-8"); 

Key key = new SecretKeySpec(keyByte, "AES"); 
IvParameterSpec iv = new IvParameterSpec(ivByte); 
Cipher c = Cipher.getInstance("AES/CBC/NoPadding"); 
c.init(Cipher.DECRYPT_MODE, key, iv); 
byte[] bval = c.doFinal(data); 

System.out.println(new String(bval)); // Prints My f awesome test ! 

,我建議你在你的加密使用填充,否則你不能用任意大小的輸入處理。

+0

感謝您的幫助,現在它正在工作,但我得到了一些額外的字符。我編輯了我的文章! – 2013-02-17 19:13:52

+0

@ZbarceaChristian我猜PHP代碼使用[零填充](http://en.wikipedia.org/wiki/Padding_%28cryptography%29#Zero_padding)?我建議你試着找到一種方法讓PHP代碼做類似PKCS5填充的事情。 – 2013-02-18 08:48:50