PHP通过URL发送加密数据

Cli*_*ote 9 php encryption base64 mcrypt url-encoding

我正在尝试通过url将加密数据发送到另一个站点(使用file_get_contents("anotherUrl.php?hash=$encryptedString").问题是,有时,加密包含一些特殊字符,如+,这会导致解密失败.

这是我的加密/解密方法:

public function encrypt($string, $key)
{
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
}

public function decrypt($encrypted, $key)
{
    return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
}
Run Code Online (Sandbox Code Playgroud)

这是一个包含a的加密字符串示例+,我猜这会导致解密失败.

oWCrVPaS+5GbxcQFc0fulUk/zRAkDD60av4zlPiWskE=

任何想法我应该如何解决这个问题?我试图做urlencode()urldecode()哈希,但这似乎也导致加密打破.有没有办法更改加密算法,使其只返回url安全字符?

jsz*_*ody 18

看一下这个帖子:

在URL中传递base64编码的字符串

从本质上讲,你不要urlencode()发送字符串之前,然而,你希望urldecode()在另一端.

  • `urlencode`是必要的,因为你在这里构建一个*查询字符串*.另一方面,PHP将查询字符串和`urldecode'用于您,将结果写入`$ _GET`.这就是不对称的原因.如果您要自己解析*查询字符串*,您还必须自己执行`urldecode`. (2认同)

Dan*_*ger 7

为了解决这个问题,我现在使用以下(经过3个小时的疼痛),效果很好.

随意复制和粘贴

function encrypt($pure_string) {
    $dirty = array("+", "/", "=");
    $clean = array("_PLUS_", "_SLASH_", "_EQUALS_");
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $_SESSION['iv'] = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $_SESSION['encryption-key'], utf8_encode($pure_string), MCRYPT_MODE_ECB, $_SESSION['iv']);
    $encrypted_string = base64_encode($encrypted_string);
    return str_replace($dirty, $clean, $encrypted_string);
}

function decrypt($encrypted_string) { 
    $dirty = array("+", "/", "=");
    $clean = array("_PLUS_", "_SLASH_", "_EQUALS_");

    $string = base64_decode(str_replace($clean, $dirty, $encrypted_string));

    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $_SESSION['encryption-key'],$string, MCRYPT_MODE_ECB, $_SESSION['iv']);
    return $decrypted_string;
}
Run Code Online (Sandbox Code Playgroud)