解密AES返回填充在字符串的前面


PHP Decrypting AES returns padding at front of string?

我一直在努力解密一个给定的字符串,由远程ColdFusion服务器生成,在PHP中使用AES在CBC模式与PKCS5填充。我已经到了可以几乎完美地解密字符串的地步,问题是字符串开头似乎有一些乱七八糟的东西。我以为填充发生在最后,但是看看解密的字符串,末尾什么也没有,但是开始被填充,所以字符串有64个字符长(原始字符串有32个字符长)。我试图切换我的填充删除代码,看看开始而不是结束,但这些字符不提供任何信息,我可以用它来破译多少填充删除,所以我认为他们来自其他地方。这是目前为止的代码

function decrypt($hash) {
  $enc_key = "Oq2vh+gswPn2CRPccODtKg==";
  $cipher = "rijndael-128";
  $str = mcrypt_decrypt($cipher, base64_decode($enc_key), base64_decode($hash), MCRYPT_MODE_CBC);
  $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
  $pad = ord($str[($len = strlen($str)) - 1]);
  $len = strlen($str);
  $decrypted = substr($str, 0, strlen($str) - $pad);
  if($decrypted != NULL) {
    $params = explode ('|', $decrypted);
  }
  return (object)array(
    'input' => $hash,
    'pad' => $pad,
    'len' => $len,
    'blocksize' => $block,
    'aes_key' => $enc_key,
    'cipher' => $cipher,
    'result' => $params,
    'decrypted' => $decrypted,
    'padded' => $str
  );

如果我加密字符串(使用ColdFusion, ' ' AES/CBC/PKCS5Padding ' '算法和base64编码):

"test@example.com|test|1400863515"

我得到加密字符串:

QRO04vmtw76Qvl0hscmYZ/SFGNv/8d88H9kT60JA5IJdg/KMT7udrn2IZuQzkOPvLjXoc4novzTMGsk0CMxjvg==

,当我通过上面的PHP函数运行它时,我得到如下输出:

¹¾Sò'->äe¿fÏäJ±test@example.com|test|1400863515

开头的那些字符是什么?为什么最后没有填充物?我已经在SO和其他地方读了几十篇文章(这就是我走到这一步的原因),但最后一篇文章让我挠头。

(From comments…)

CBC模式需要一个iv。"使用不正确的IV解密会导致明文的第一个块损坏…"。尝试在两边使用相同的iv