【问题标题】:PHP: ASCII and UTF-8 strings comparisonPHP:ASCII 和 UTF-8 字符串比较
【发布时间】:2013-11-12 22:25:21
【问题描述】:

我有以下 test.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

Test.php 脚本应显示“Guid 和解密的 Guid 相等”。但它永远不会发生。我试图检查字符串的编码,$guid 是 ASCII,$encryptedGuid 是 UTF-8。你能帮我解决这个问题吗?我试图将 ASCII 转换为 UTF-8,但我没有成功,因为例如结果。 iconv 函数又是 ASCII。我认为将 ASCII 转换为 UTF-8 可以解决,但我不确定 $_GET 返回 ASCII 是否总是正确的。

非常感谢您的帮助。

【问题讨论】:

  • UTF-8 与 ASCII 100% 兼容,所以这不是问题。
  • 您的脚本对$guid$decryptedGuid 的值有何看法?另外,您不应该 urldecode $_GET 中的值。
  • @Fleshgrinder,如果 mcrypt 插入字节顺序标记,它当然可以。尝试逐个字符进行比较和/或检查字符串的长度,确认没有不可见的字符,如 BOM (Unicode U+FEFF) 或其他有趣的东西。
  • @DennisKrøger mcrypt_decrypt 适用于任意二进制数据。它不关心文本、编码或 BOM 的...
  • Hmmm... padding 好像是加密的,不过好像是你自己选的,默认是0 padding? (假设它也是使用 mcrypt 加密的)。无论如何,您应该可以使用 rtrim($decryptedString) 将其删除。

标签: php utf-8 ascii


【解决方案1】:

我遇到了类似的问题,感谢 Dennis 对 padding 的评论,我得以解决。

解密我的 AES 字符串后,我注意到 URL 中的一个特定参数不太正确...

E.g. test=1&foo=bar

看起来不错。但是,当我尝试与 URL(栏)中的最终值进行字符串比较时,它永远不会是真的。

if ($foo == 'bar')

所以,我使用 bin2hex 比较了字符串,在参数值 (0505050505) 的末尾添加了某种重复的字符串。我没有意识到这是加密添加到字符串中的填充。

由于某种原因 rtrim 对我没有帮助,所以我所做的是在加密之前在我的 URL 末尾添加了一个无用的参数(例如 padding=1)。这确保了我的最后一个“重要”参数没有将填充添加到字符串中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 2021-11-03
    • 1970-01-01
    • 2023-03-18
    • 2017-10-28
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多