我正在尝试从PHP读取base64编码和AES 128位加密字符串,但我收到了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:数据不是块大小对齐
这可能是由填充造成的?
修改
答案 0 :(得分: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 !
我建议您在加密中使用填充,否则无法处理任意大小的输入。
答案 1 :(得分:1)
在调用doFinal()时抛出IllegalBlockSizeException,如果:“cipher是块密码,没有请求填充(仅在加密模式下),并且此密码处理的数据的总输入长度不是块大小;或者如果此加密算法无法处理提供的输入数据。“ - http://docs.oracle.com/javase/6/docs/api/javax/crypto/Cipher.html#doFinal%28%29。所以它的输入数据或块大小都不好。
答案 2 :(得分:0)