Función PHP para Encriptar y Desencriptar

Hoy les traigo un par de funciones PHP para encriptar y desencriptar, por ejemplo, contraseñas, lo que es básico a la hora de guardar los datos en nuestra BD. Sin más dejo las funciones que también podrían combinarse en una sola:

1
2
3
4
5
6
7
8
9
10
11
12
function encriptar($cadena){
    $key='';  // Una clave de codificacion, debe usarse la misma para encriptar y desencriptar
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $cadena, MCRYPT_MODE_CBC, md5(md5($key))));
    return $encrypted; //Devuelve el string encriptado
 
}
 
function desencriptar($cadena){
     $key='';  // Una clave de codificacion, debe usarse la misma para encriptar y desencriptar
     $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($cadena), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
    return $decrypted;  //Devuelve el string desencriptado
}
function encriptar($cadena){
    $key='';  // Una clave de codificacion, debe usarse la misma para encriptar y desencriptar
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $cadena, MCRYPT_MODE_CBC, md5(md5($key))));
    return $encrypted; //Devuelve el string encriptado

}

function desencriptar($cadena){
     $key='';  // Una clave de codificacion, debe usarse la misma para encriptar y desencriptar
     $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($cadena), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
    return $decrypted;  //Devuelve el string desencriptado
}

Author: gp2

Desarrollador Web, Programador PHP y MySQL, conocedor de HTML5, CSS3 y Javascript. Del culto JQuery, gran coleccionador de funciones ajenas y especialista en hacer código redundante. Últimamente programador Java.

47 comentarios en “Función PHP para Encriptar y Desencriptar

  1. Funcionó, gracias por compartir el codigo…. pues busque y probé con muchos ejemplo de las diferentes web´s y ninguno funciona tan claro como este… Gracias !

  2. perdon soy nuevo en esto de PHP en la variable $KEY que se ingresaa??’ esta comentado que indicas que es una clave de codificacion pero no entiendo mucho, me podrias especificar, gracias.

    1. Hola Fernando, en el key ingresas un string (puede tener números, letras, etc) qué funciona como base (semilla) para la encriptacion, por lo que el resultado de la encriptacion va a depender de ese string y hace que sea único el resultado, es decir que yo no voy a poder desencriptar lo que tu encriptes a no ser que tenga esa clave, al m nos teoricamente

  3. Hola gp2, de antemano agradezco el gran aporte ya que me funciona de maravilla tanto la encriptacion y el proceso inverso. Tengo una duda, sabes cuanto pesa en Bytes el String encriptado? es para alterar la columna en mi base de datos MySql [password VARCHAR(100.. 128 ¿?)] muchas gracias.

  4. Hola Gp2, sabes que estoy haciendo un sistema con PHP con tu método de encriptación y desencriptación, pero al momento de desencriptarlo, debería darme un valor pero, en vez de eso, me tira una cadena de caracteres extraños:
    �1��QF-�@�k��
    será un virus?, me han entrado en el PC y me han códificado algo?.
    Saludos y gracias

    1. Hola Mario, estas usando la misma key (clave), para desencriptar y para encriptar ? o sea en ambas funciones? Sino no sería raro que te muestre cualquier carácter.

      Saludos, Gabriel

      1. a mi también algo parecido y uso la misma key.

        Mi clase:

        class cMD5 {

        private $key=’1234′;
        public function encriptar($cadena){
        $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($this->key), $cadena, MCRYPT_MODE_CBC, md5(md5($this->key))));
        return $encrypted;

        }

        public function desencriptar($cadena){
        $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($this->key), base64_decode($cadena), MCRYPT_MODE_CBC, md5(md5($this->key))), “\0″);
        return $decrypted;
        }

        }
        ________________
        ________________

        mi implementación:

        include_once ‘MD5.php’;

        $cadena=”cadenaparaencriptar”;

        $md5=new cMD5();
        echo “IN: “. $md5->encriptar($cadena).””;
        echo “OUT: “. $md5->desencriptar($cadena);

        ________________
        ________________

        el resultado:

        IN: R0gKSmx+pAMUDED97dqDeuX9j1hEFlywNHOeUY4K8jU=
        OUT: }\�’�3�JV��`��1� �j.lp:���.�L

        1. Lo que encriptas lo tienes que guardar en una variable o una base de datos, lo que desencriptas tiene que ser lo que previamente encriptaste…

          Segun veo estas tratando de desencriptar el mismo valor que estas encriptando, no lo encriptado, por eso te devuelve caracteres extraños.

          si estas encriptando $cadena no puedes desencriptar $cadena, debes de desencriptar la variable o el campo donde almacenaste $cadena encriptada (no se si me explique bien)

    2. Codificando tu string en base64, se pierde el +, a mí me estaba pasando porque lo mando por ajax, pero codifique y luego decodifique y listo

    1. Hola Juan, en la variable cadena se pasa a la función el parámetro (string por ej: contraseña) que se quiere encriptar o desencriptar. Saludos, Gabriel

  5. Hola,
    Haciendo referencia a la pregunta de @jhon zt, conoces alguna función similar en javascript para poder transmitir información vía AJAX con este encriptado?

    Muchas gracias.

    Saludos

  6. Hola gp2, muchas gracias por tu función me ha servido de maravilla respecto a la pregunta de Mario Enrique también me pasaba lo mismo y descubri que como mínimo debes de pasarle 11 caracteres sino te devuelve esos signos raros , gracias y aprovechando ver si podrías echarme la mano con session_id que pudieras orientarme a como usarlo gracias.

  7. Buenas.. Sr. gp2 muchas gracias por el aporte me sirvió de mucho. Una consulta podría poner mi propia función de encriptado en php?

  8. Hola implemente el código pero al momento de encriptar dos claves iguales quedan registrados en la base de datos de igual manera pero de forma encriptada quisiera saber si es normal, Gracias por su aporte

  9. Hola aqui les dejo la solucion para los que tienen problemas con la direccion url, en otras palabras para cuando quieres decodificarlo no puedes por que el signo + esta remplazado por un ” ” espacio:

    Ejemplo

    $cifrando=str_replace(‘ ‘,’+’,base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5(‘hola2015’), $fila[‘id’], MCRYPT_MODE_CBC, md5(md5(‘hola2015’)))));

    $decifrando =rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5(‘hola2015’),base64_decode(str_replace(‘ ‘,’+’,$_GET[‘id’])), MCRYPT_MODE_CBC, md5(md5(‘hola2015’))), “\0”);

    donde esta el “hola2015” es el $key que vieron en el ejemplo del compañero gp2

  10. Excelente aportación, felicidades! y para Mario Enrique que comenta que le devuelve caracteres extraños podría ser que no estas utilizando correctamente los formatos de codificación UTF-8 revisa que tus documentos estén en formato UTF-8 sin BOM en la cabecera PHP definir también como documento UTF-8.

  11. Les dejo un ejemplo basico a los que estan batallando a la hora de desencriptar obteniendo caracteres extraños:

    $cadena=”Maria tenia un corderito”; // Esta es la cadena a encriptar
    $Nuevo=encriptar($cadena); // Encripto la cadena y la almaceno en una nueva variable
    desencriptar($Nuevo); // Desencripto la nueva variable que cree, con la cadena encriptada

    Tambien se puede guardar en la misma cadena lo encriptado de la siguiente manera:

    $cadena=”Maria tenia un corderito”; // Esta es la cadena a encriptar
    $cadena=encriptar($cadena); // Encripto y actualizo la variable $cadena con lo encriptado
    echo desencriptar($cadena); // Desencripto $cadena

  12. Desde la versión PHP 7.0 se considera obsoleto utilizar “salt” manuales para encriptar textos, claves, etc.
    PHP recomienda el uso de dos funciones que cubren esa necesidad agregando una :
    password_hash(): Es la función encargada de encriptar la clave.
    password_verify(): Es la función que recupera la clave encriptada.

    La función que encripta el dato, posee un parámetro opcional (coste -cost en inglés-) que permite añadir mayor complejidad pero se debe tener en cuenta que a mayor número, mayor sobrecarga de trabajo al servidor. Se recomienda un coste entre 8 y 12 dependiendo de las características del servidor.

    Ver:
    http://php.net/manual/es/function.password-hash.php
    http://php.net/manual/es/function.password-verify.php

  13. me aparecen estos simbolos al momento de desencritar apesar de usar la misma key que sucede no funciona su codigo
    6k�D v�:I���{��[� gw�#F�ϩ

  14. Aqui les dejo la solucion para los que les sale los signos raros.

    //FUNCION DE ENCRIPTACION
    function encriptar($cadena){
    $key = “siud-key”;
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $cadena, MCRYPT_MODE_CBC, md5(md5($key))));
    $encrypted=str_replace(‘ ‘,’+’,base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $cadena, MCRYPT_MODE_CBC, md5(md5($key)))));
    return $encrypted; //Devuelve el string encriptado
    }

    //FUNCION DE DESENCRIPTACION
    function desencriptar($cadena){
    $key = “siud-key”;
    $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode(str_replace(” “,”+”,$cadena)), MCRYPT_MODE_CBC, md5(md5($key))), “\0”);
    return $decrypted; //Devuelve el string desencriptado
    }

  15. function encriptar($cadena){
    $key=”; // Una clave de codificacion, debe usarse la misma para encriptar y desencriptar
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $cadena, MCRYPT_MODE_CBC, md5(md5($key))));
    return $encrypted; //Devuelve el string encriptado

    }

    function desencriptar($cadena){
    $key=”; // Una clave de codificacion, debe usarse la misma para encriptar y desencriptar
    $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($cadena), MCRYPT_MODE_CBC, md5(md5($key))), “\0”);
    return $decrypted; //Devuelve el string desencriptado
    }

  16. Después de muchas horas de búsquedas encontré tu blog, y luego de unas cuantas pruebas he conseguido que me funcione. Lo usaré para subir datos a la URL y recogerlos después. Pero tengo algo que no va bien. Solo me descifra 17 carácteres, más no.
    ¿Que puede ser?

    Muchas gracias

    PD Ahora echaré un vistazo al resto de tu blog.

Deja un comentario