通过URL参数解码的文本发送mcrypt加密的字符串是混乱的


Sending an mcrypt-encrypted string via a URL parameter - decoded text is mangled

我弄乱了一个简单的授权方案。我认为,在没有SSL或其他HTTP认证的情况下,最简单的方法是共享密钥加密。根据PHP手册中的一个简单示例,我提出了以下内容:

$text = "boggles the invisible monkey will rule the world";
$key = "This is a very secret key";
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $text, MCRYPT_MODE_ECB, $iv);
$iv = base64_encode($iv);
$enc = base64_encode($enc);
echo '<a href="temp2.php?iv='.$iv.'&text='.$enc.'">link</a><br />';

接收此请求的页面(temp2.php)如下所示:

$key = "This is a very secret key";
$iv = base64_decode($_GET["iv"]);
$enc = base64_decode($_GET["text"]);
$crypttext = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB, $iv);
echo "$crypttext<br>";

这非常接近,但是它不能正确解码——它回显

boggles the invisible monkey will rule t—;eôügJë

我不确定挂起是什么,我尝试了urlencode/urldecode和htmlentities,认为也许一个字符在请求中被损坏,但没有区别。

我还遗漏了什么吗?也许填充?

谢谢

您的加密文本最终看起来像这样:

Z5DlBqT8yEB4HKLkAlvfJoWaHgnNVLFh7jls6L85sLriedc82uFQxm+M62I41oB7

看到那个加号了吗?url中的加号会被转换成空格。

当手动将加号转换为空格并解密结果时,输出是您所看到的损坏的垃圾。

在将IV和加密文本插入链接之前,您应该通过rawurlencode (而不是 urlencode)运行IV和加密文本。这将正确地编码加号,这将在整个过程中保存它。您不需要(也不应该)在另一边urldecode字符串—PHP将为您完成此操作。