Php 在URL中使用mcrypted值

Php 在URL中使用mcrypted值,php,urlencode,mcrypt,Php,Urlencode,Mcrypt,我写了一个小类来发送带有url的私有数据(不能使用cookies/sessions或其他任何东西)。我使用PHP的mcrypt对其进行加密/解密,并对其进行base64 en/解码,以便在url中使用 不幸的是,我仍然时不时地得到错误的结果。我注意到,当url中至少出现一个+时,总是会发生这种情况。我还玩了rawurlencode和urlencode/urldecode,但没有成功。我还尝试了strtr()加密数据,但不知何故,+仍然出现。有人有主意吗 这是我的班级: class crypto

我写了一个小类来发送带有url的私有数据(不能使用cookies/sessions或其他任何东西)。我使用PHP的mcrypt对其进行加密/解密,并对其进行base64 en/解码,以便在url中使用

不幸的是,我仍然时不时地得到错误的结果。我注意到,当url中至少出现一个
+
时,总是会发生这种情况。我还玩了
rawurlencode
urlencode
/
urldecode
,但没有成功。我还尝试了
strtr()
加密数据,但不知何故,
+
仍然出现。有人有主意吗

这是我的班级:

class crypto 
{
    public function __construct()
    {
        $this->iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
        $this->iv = mcrypt_create_iv($this->iv_size, MCRYPT_RAND);
        $this->llave = 'da332sdf9'; 
    }

    public function make_crypt($string)
    {   
        $crypt = mcrypt_encrypt(MCRYPT_BLOWFISH, $this->llave, $string, MCRYPT_MODE_ECB, $this->iv);
        $crypt = rawurlencode(base64_encode($crypt));
        $crypt = strtr($crypt, '+/', '-_');     
        return $crypt;
    }

    public function get_crypt($data)
    {   
        $crypt = strtr($crypt, '-_', '+/');     
        $data = base64_decode($data);
        $decrypted = mcrypt_decrypt (MCRYPT_BLOWFISH, $this->llave, $data, MCRYPT_MODE_ECB, $this->iv);
        return $decrypted;
    }
}

您尝试URL编码“未成功”是什么意思?URL编码值确实有效,否则函数将被破坏。我在我的框架中使用它,没有错误

您确定要对加密值进行编码吗?不要对整个URL进行编码。

$crypt=strtr($crypt,'-'','+/')??在哪里定义了
crypt

rawurlencode
解码在哪里

我总是喜欢
HEX
,这样我就不必担心
url
安全字符了

样本测试您当前的类将失败 溶液输出 用于生成数据的函数

函数生成密码($length=8){
$password=“”;
$mablue=“2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ”;
$maxlength=strlen($maxlength);
如果($length>$maxlength){
$length=$maxlength;
}
$i=0;
而($i<$length){
$char=substr($maxblue,mt_rand(0,$maxlength-1),1);
如果(!strstr($password,$char)){
$password.=$char;
$i++;
}
}
返回$password;
}

我只对加密值进行编码。不知何故,
+
不会消失:(你能展示构建URL的代码吗?因为一定有bug。rawurlencode()确实编码+sign.aaarrrrrgh!当我想发布构建URL的代码时,我发现我放了一个错误的
urldecode()
在我的修复狂怒中出现在它前面。后来我只坐在crypto类前面,忽略了这一点。现在它在逻辑上可以工作了。谢谢你的提示;)你应该先通过rawurlencode(而不是urlencode)运行IV和加密文本,然后再将其粘贴到链接中。也许看一点旁注,因为您使用的是ECB模式,所以您可以完全忽略IV。它不用于ECB模式。IV仅在CBC模式下使用。
$crypt = new Crypto ();
echo "<pre>";
for($i = 0; $i < 10; $i ++) {
    $pass = generatePassword ( mt_rand ( 5, 10 ) );
    $test = $crypt->make_crypt ( $pass );
    $output = $crypt->get_crypt ( $test );

    if ($pass == $output) {
        echo " $pass ($test) = $output \n";
    } else {
        var_dump ( $pass, $output );
        echo " $pass ($test) != $output \n";
    }
}
class Crypto {

    private $iv_size;
    private $iv;
    private $llave;

    public function __construct() {
        $this->iv_size = mcrypt_get_iv_size ( MCRYPT_BLOWFISH, MCRYPT_MODE_ECB );
        $this->iv = mcrypt_create_iv ( $this->iv_size, MCRYPT_RAND );
        $this->llave = 'da332sdf9';
    }

    public function make_crypt($string) {
        $crypt = mcrypt_encrypt ( MCRYPT_BLOWFISH, $this->llave, $string, MCRYPT_MODE_ECB, $this->iv );
        return bin2hex ( $crypt );
    }

    public function get_crypt($data) {
        $data = pack ( "H*", $data );
        $decrypted = mcrypt_decrypt ( MCRYPT_BLOWFISH, $this->llave, $data, MCRYPT_MODE_ECB, $this->iv );
        return trim ( $decrypted );
    }
}
 tXHhC8fk4 (b929695d39555523348051a72d15baaf) = tXHhC8fk4 
 drKH9 (909994926fe5cd30) = drKH9 
 mNwh6K (10af1bb381338943) = mNwh6K 
 CJZvqwGX (aa705c290759b18d) = CJZvqwGX 
 Jt4W7j (bc7ee842041b9860) = Jt4W7j 
 tgCHXyPvm (9f46b74ef59ee70da1dda30b3e52fe92) = tgCHXyPvm 
 LYxhVj (9e2079cff9d54007) = LYxhVj 
 kR8WLwh3T (3e4606d65defc74f3c82af5fb095f41d) = kR8WLwh3T 
 Z8NqWM6RHj (1d9eea2358674d78cc43e024cba5ba48) = Z8NqWM6RHj 
 TtqRf7M (09ef38114bb729c4) = TtqRf7M 
function generatePassword($length = 8) {
    $password = "";
    $possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";
    $maxlength = strlen ( $possible );
    if ($length > $maxlength) {
        $length = $maxlength;
    }
    $i = 0;
    while ( $i < $length ) {
        $char = substr ( $possible, mt_rand ( 0, $maxlength - 1 ), 1 );
        if (! strstr ( $password, $char )) {
            $password .= $char;
            $i ++;
        }

    }
    return $password;

}