11

我在搞乱一个简单的授权方案。我认为没有 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,认为请求中可能有一个字符被破坏,但没有区别。

还有什么我想念的吗?也许填充?

谢谢

4

1 回答 1

29

碰巧您的加密文本最终会看起来像:

Z5DlBqT8yEB4HKLkAlvfJoWaHgnNVLFh7jls6L85sLriedc82uFQxm+M62I41oB7

看到那个加号了吗?URL 中的加号会变成空格。

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

在将 IV 和加密文本粘贴到链接之前,您应该通过rawurlencode( not )运行 IV 和加密文本。urlencode这将正确编码加号,这将在整个过程中保留它。您不需要(也不应该)urldecode另一端的字符串——PHP 会为您完成此操作。

于 2011-04-22T17:12:48.747 回答