我有一个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=encrypt&str=the快狐
它将以加密字符串的形式返回这个字符串:
LCuT/ieVa6cl3/4 4VtzE+jd9QPT3kvHYYJFQG6tY3P0Q=
现在,要解密字符串,只需将“方法”查询更改为“解密”,如下所示:
Encrypt.php?method=decrypt&str=LCuT/ieVa6cl3/4VtzE+jd9QPT3kvHYYJFqG6tY3P0Q=
唯一的问题是,当加密的字符串被解密时,它会返回以下内容:
ƒ§rYV}_5š·n-μ(n_x_8;b)
我已经将问题缩小到加密字符串中的加号。PHP的GET方法似乎将一个加号转换成一个空格。我搜索了这个bug,发现它已经被这里归档了。我尝试过在那一页上列出的不同方法以及其他方法,但都没有成功。我得到的最接近的方法是:
$fixedstring = str_replace(" ", "+", $string);然后在加密方法中使用$fixedstring,问题是,在解密时,所有空格都转换为加号。有什么想法吗?
我知道使用POST会更有意义,但我使用GET是出于特定的原因。我将不谈细节。。
发布于 2010-04-20 00:51:47
如果您将阅读整个bug报告,您将看到对RFC 2396的引用。它声明+是保留的。PHP在将未编码+符号转换为空格时是正确的。
在将密码返回给用户时,可以使用urlencode()。因此,当用户提交用于解密的密文时,可以使用urldecode()。如果PHP也通过GET字符串进入,PHP将自动为您完成此操作。
底线:+必须作为编码值提交给:%2B
发布于 2011-08-17 14:20:48
我意识到这是一个老问题,但我正在寻找一个类似问题的解决方案,在GET字符串中使用+符号。我偶然发现了这一页,我想我会分享我想出的解决方案。
<?php
$key = 'secretkey';
$string = $_GET['str'];
if ($_GET['method'] == "decrypt")
{
$string = urlencode($string);
$string = str_replace("+", "%2B",$string);
$string = urldecode($string);
$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;
?>发布于 2018-05-24 22:36:10
以上答案对我都没有用,我用以下方法修正了"+“符号问题
rawurldecode() 和
rawurlencode() https://stackoverflow.com/questions/2671840
复制相似问题