Yo estoy tratando de enviar datos cifrados a través de la dirección url a otro sitio (usando file_get_contents("anotherUrl.php?hash=$encryptedString"). El problema es que, a veces, el cifrado que contiene algunos caracteres especiales, como +, y esto hace que el descifrado a fallar.

Aquí están mis cifrado /descifrado métodos:

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))), "
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");
}
"
); }

He aquí un ejemplo de cadena cifrada que contiene un +, y supongo que esto hace que el descifrado a fallar.

oWCrVPaS+5GbxcQFc0fulUk/zRAkDD60av4zlPiWskE=

Alguna idea de cómo puedo solucionar esto? He tratado de hacer urlencode() y urldecode() en el hash, sin embargo, que también parece causar el cifrado de romper. Es allí una manera de cambiar el algoritmo de cifrado para obtener sólo a una dirección url de retorno seguro personajes?

Sólo un lado de la cuestión, ¿por qué estás realizando dos sucesivas md5 operaciones en la clave? ¿Qué espera lograr con eso?
De hecho, he copiado la función de la exactamente como es de otra respuesta aquí a ENTONCES, no he hecho ningún cambio en él.
Ehh… yo no veo ningún punto en que. Si la clave es débil (i.e no de un sistema de encriptación fuerte generador de números aleatorios) debe no a utilizar md5 como una clave de fortalecimiento de algoritmo (ver PBKDF#2, bcrypt o scrypt). Si la clave ya es fuerte, te estás perdiendo de ciclos de procesador.
¿De dónde sacaste la criptografía de código? no Es seguro.

OriginalEl autor Click Upvote | 2013-11-16

3 Comentarios

  1. 18

    Echa un vistazo a este hilo:

    Pasando codificado en base64 cadenas de caracteres en la URL

    Esencialmente, usted HACER quiere urlencode() antes de enviar la cadena, sin embargo lo hace NO quiere urldecode() en el otro extremo.

    Gracias, tienes razón. Funciona con una forma de codificación url. ( No debe haber ninguna url de la función decode si no se supone que para ser decodificado, pero que PHP para usted).
    Hay un montón de otros tiempos donde urldecode() es necesario, pero este no es uno de ellos. Encantados de ayudarle.
    El urlencode es necesario, ya que son la construcción de un query string aquí. En el otro lado de PHP asume que la cadena de consulta y urldecodes que para usted, escribiendo el resultado en $_GET. Esta es la razón por la asimetría. Si se va a analizar la query string usted mismo, usted también tendría que hacer el urldecode a ti mismo.

    OriginalEl autor jszobody

  2. 6

    Con el fin de resolver este problema que ahora tengo el siguiente (después de 3 horas de dolor), y funciona muy bien.

    Siéntase libre de copiar y pegar

    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;
    }
    Muchas gracias, str_replace idea fue genial !!

    OriginalEl autor Dan Green-Leipciger

  3. 2

    Lugar de utilizar Base64 para la codificación de los datos también puede utilizar Base32 (RFC 4648), que es la URL de seguro, ya que sólo utiliza las letras a–Z (mayúsculas y minúsculas) y los dígitos 2-7. Ya hay un Biblioteca de PHP para la codificación/decodificación. Tenga en cuenta que Base32 toma ~20% más de espacio que en Base64.

    También puede utilizar URLcrypt que es una práctica biblioteca ayudando con el cifrado y la Base32 de codificación.

    OriginalEl autor rkallensee

Dejar respuesta

Please enter your comment!
Please enter your name here