我一直在努力解决由远程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和其他地方的几十篇帖子(这就是我如何做到这一点)但最后这篇文章让我摸不着头脑。
答案 0 :(得分:0)
(来自评论......)
CBC模式需要iv
。 “Decrypting with the incorrect IV causes the first block of plaintext to be corrupt ...”。尝试在两侧使用相同的iv