我有以下测试.php脚本:
$AES_IV = "4epZqMl8BQukhip6WQjQHg==";
$AES_KEY = "zvKmer0cPiJdQQ1RPjQOCF/wURt+31UdingRoPj4+Yc=";
$guid = $_GET["guid"];
$encryptedGuid = urldecode($_GET["encryptedGuid"]);
$decryptedGuid = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, base64_decode($AES_KEY), base64_decode($encryptedGuid), MCRYPT_MODE_CBC, base64_decode($AES_IV));
echo "Guid is: ".$guid."</br>";
echo "Decrypted GUID is: ".$decryptedGuid."</br>";
if ($decryptedGuid === $guid)
{
echo "Guid and decrypted Guid are equals.";
}
else
{
echo "Guid and decrypted Guid are not equals.";
}
我按如下方式调用此脚本:
http://localhost:8087/test/test.php?guid=08201E62-DFA5-8A50-ACFC-A811871804CD&encryptedGuid=ED40y72BJvzXmN0Aj9eb85VdIJKu6LUYQuYSWMPOhIQcm5SIquZAhRMmhsC7ax2e
测试.php脚本应显示"Guid 和解密的 Guid 相等",但它永远不会发生。我试图检查字符串的编码,$guid是 ASCII,$encryptedGuid是 UTF-8。你能帮我如何解决这个问题吗?我试图将 ASCII 转换为 UTF-8,但我没有成功,因为例如 iconv 函数的结果再次是 ASCII。我认为将 ASCII 转换为 UTF-8 可能是解决方案,但我不确定 $_GET 返回 ASCII 是否总是正确的。
非常感谢您的帮助。
我遇到了类似的问题,由于丹尼斯对填充的评论,我能够解决它。
在我解密我的 AES 字符串后,我注意到 URL 中的一个特定参数不太正确......
E.g. test=1&foo=bar
看起来还不错。但是,当我尝试与 URL(bar)中的最终值进行字符串比较时,它永远不会是真的。
if ($foo == 'bar')
因此,我使用bin2hex
在参数值 (0505050505) 的末尾添加了某种重复的字符串来比较字符串。我没有意识到的是,这是通过加密添加到字符串中的填充。
出于某种原因,rtrim 对我没有帮助,所以我所做的是在加密之前在我的 URL 末尾添加一个无用的参数(例如 padding=1)。这确保了我的最后一个"重要"参数没有将填充添加到字符串中。