PHP Decrypting AES返回字符串前面的填充?

时间:2014-06-19 19:21:07

标签: php encryption coldfusion aes pkcs#5

我一直在努力解决由远程ColdFusion服务器生成的给定字符串,在PHP中使用AES在CBC模式下使用PKCS5填充。我已经到了能完全解密字符串几乎的地步,问题是在字符串的开头似乎有些残缺。我认为padding发生在最后,但是查看解密后的字符串,最后没有任何内容,但是开头是填充的,因此字符串长度为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和其他地方的几十篇帖子(这就是我如何做到这一点)但最后这篇文章让我摸不着头脑。

1 个答案:

答案 0 :(得分:0)

(来自评论......)

CBC模式需要iv。 “Decrypting with the incorrect IV causes the first block of plaintext to be corrupt ...”。尝试在两侧使用相同的iv