Java (Android) aes-128-cbc解密为明文不一致

Java (Android) aes-128-cbc decrypt to plaintext inconsistency

我在 Java (Android) 中有一个代码使用 aes-128-cbc 将明文加密为密文。我能够将此密文解密为 PHP 中的相应明文,但不能在 Java 中解密。

加密的Java代码如下,

String iv = "0000000000000000"; //Ignore security concerns
IvParameterSpec ivspec;
ivspec = new IvParameterSpec(iv.getBytes());

String plaintext = "Top Secret Data";
byte[] encrypted = null;

Cipher cipher;
cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, seckey, ivspec);
encrypted = cipher.doFinal(padString(plaintext).getBytes());

ciphertext = Base64.encodeToString(encrypted, Base64.DEFAULT);

Log.i("Encrypted Base64 Data", ciphertext);

对应的PHP解密成功的代码如下,

public function decrypt($data)
{
    $key = $_SESSION['sessionkey'];
    $iv = "0000000000000000";
    $data = base64_decode($data);

    $encobj = mcrypt_module_open('rijndael-128', '', 'cbc', $iv);
    mcrypt_generic_init($encobj, $key, $iv);
    $decrypted = mdecrypt_generic($encobj, $data);

    mcrypt_generic_deinit($encobj);
    mcrypt_module_close($encobj);

    return utf8_encode(trim($decrypted));
}

有问题的Java逆向为错误明文的解密代码如下

String iv = "0000000000000000";
IvParameterSpec ivspec;
ivspec = new IvParameterSpec(iv.getBytes());

byte[] decrypted = null;

Cipher cipher;
cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, seckey, ivspec);
decrypted = cipher.doFinal(Base64.decode(ciphertext, Base64.DEFAULT));
Log.i("Decrypted Data",decrypted.toString());

如果有人能指出 Java 解密代码有什么问题,我将不胜感激。

试试这个

  Cipher cipher;
  cipher = Cipher.getInstance("AES/CBC/NoPadding");
  cipher.init(Cipher.DECRYPT_MODE, seckey, ivspec);
  decrypted = cipher.doFinal(Base64.decode(ciphertext, Base64.DEFAULT)); //byte[]
  String result = new String(decrypted);
  Log.i("Decrypted Data",result);