我一直在努力解密一个给定的字符串,由远程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