我有一个 PHP 脚本,它通过以下方法对字符串进行基本加密:
<?php
$key = 'secretkey';
$string = $_GET['str'];
if ($_GET['method'] == "decrypt")
{
$output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
}
if ($_GET['method'] == "encrypt")
{
$output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
}
echo $output;
?>
用于加密字符串的 URL 示例如下所示:
Encrypt.php?method=加密&str=快狐
这会将其作为加密字符串返回:
LCuT/ieVa6cl3/4VtzE+jd9QPT3kvHYYJFqG6tY3P0Q=
现在要解密字符串,您所要做的就是将“method”查询更改为“decrypt”,如下所示:
Encrypt.php?method=decrypt&str=LCuT/ieVa6cl3/4VtzE+jd9QPT3kvHYYJFqG6tY3P0Q=
唯一的问题是,当加密的字符串被解密时,它会返回:
Øf§rYV}̳5äš·nßì(ñïX8Þ;b
我已将问题范围缩小到加密字符串中的加号。 PHP 的 GET 方法似乎将加号转换为空格。我搜索了这个bug,发现它已经被提交了here http://bugs.php.net/39078。我尝试了该页面上列出的不同方法和其他方法,但没有成功。我得到的最接近的是使用这个:
$fixedstring = str_replace(" ", "+", $string);
然后在加密方法中使用 $fixedstring ,问题是,解密后,所有空格都转换为加号。有任何想法吗?
我知道使用 POST 更有意义,但我使用 GET 是出于特定原因。我会省去细节。