PHP отправляет зашифрованные данные по URL-адресу

Я пытаюсь отправить зашифрованные данные по 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"); } 

Вот пример зашифрованной строки, которая содержит + , и я предполагаю, что это приводит к сбою дешифрования.

oWCrVPaS+5GbxcQFc0fulUk/zRAkDD60av4zlPiWskE=

Любые идеи, как я должен это решить? Я попытался сделать urlencode() и urldecode() на хеше, однако это также приводит к разрыву шифрования. Есть ли способ изменить алгоритм шифрования, чтобы заставить его возвращать только безопасные символы?

    Related of "PHP отправляет зашифрованные данные по URL-адресу"

    Взгляните на эту тему:

    Передача закодированных строк base64 в URL

    По сути вы хотите, чтобы urlencode() перед отправкой строки, однако вы не хотите urldecode() на другом конце.

    Чтобы решить эту проблему, я теперь использую следующую (после 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; } 

    Вместо использования Base64 для кодирования ваших данных вы также можете использовать Base32 (RFC 4648), который является безопасным URL-адресом, поскольку он использует буквы A-Z (без учета регистра) и цифры 2-7. Для кодирования / декодирования уже существует библиотека PHP . Обратите внимание, что Base32 занимает ~ 20% больше места, чем Base64.

    Вы также можете использовать URLcrypt, которая является удобной библиотекой, которая поможет вам с шифрованием и кодировкой Base32.