2

我正在尝试从 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:数据未对齐块大小

这可能是由填充引起的?

编辑

在此处输入图像描述

4

3 回答 3

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 !

我建议您在加密中使用填充,否则您将无法处理任意大小的输入。

于 2013-02-17T14:27:22.147 回答
1

调用 doFinal() 时抛出的 IllegalBlockSizeException 如果:“密码是块密码,未请求填充(仅在加密模式下),并且此密码处理的数据的总输入长度不是块大小的倍数;或者如果此加密算法无法处理所提供的输入数据。” - http://docs.oracle.com/javase/6/docs/api/javax/crypto/Cipher.html#doFinal%28%29。所以它要么是错误的输入数据,要么是块大小。

于 2013-02-17T11:43:37.747 回答
0

这是加密/解密的工作版本

https://github.com/chaudhuri-ab/CrossPlatformCiphers

希望这对某人有所帮助,因为我花了一段时间来处理平台之间的小细节。

于 2017-05-30T00:51:20.430 回答