Posts Tagged ‘encriptar’

16 03
02
2013

Encriptar y desencriptar en PHP

Domingo, febrero 3rd, 2013

Hoy vamos a implementar una manera sencilla de encriptar y desencriptar cadenas de texto en PHP.

Seguramente ya conocerás que existen diferentes tipos de encriptación, que podríamos englobar en 2 grandes grupos.

  • Encriptación en 2 sentidos o reversible o simétrica: es decir, permite encriptar y desencriptar un texto. Ejemplos de este tipo de encriptación para PHP son base64 (base64_encode y base64_decode) o mcrypt.
  • Encriptación en 1 único sentido o irreversibles o asimétrica: esto es, no se permite la desencriptación del texto encriptado previamente. Dado que recuperar la cadena original se hace imposible, esto hace que la encriptación asimétrica sea más segura que la encriptación simétrica o en 1 único sentido. Ejemplos de funciones PHP de este tipo de encriptación son md5, sha1, crypt, crc32.

A partir de estas herramientras que PHP nos proporciona para realizar labores de encriptación y desencriptación, vamos a construir nuestra clase Encrypter con 2 sencillos métodos:

  • encrypt: nos permitirá encriptar un texto
  • decrypt: permitirá desencriptar un texto previamente encriptado mediante la misma clase Encrypter.

Esta clase Encrypter, con el objetivo de fortalecer la seguridad de la encriptación, se apoyará además en una clave secreta definida de forma interna en el atributo $key.

Por lo tanto, sobra decir que, toda desencriptación que queramos realizar de un texto, deberá realizarse bajo la misma clave secreta que haya sido utilizada en el proceso de encriptación.


/**
* Description of Encrypter
*
* @author jose
*/
class Encrypter {

	private static $Key = "dublin";

	public static function encrypt ($input) {
		$output = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5(Encrypter::$Key), $input, MCRYPT_MODE_CBC, md5(md5(Encrypter::$Key))));
		return $output;
	}

	public static function decrypt ($input) {
		$output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5(Encrypter::$Key), base64_decode($input), MCRYPT_MODE_CBC, md5(md5(Encrypter::$Key))), "\0");
		return $output;
	}

}

El uso de la clase Encrypter es más que sencillo, en la primera línea del siguiente código encriptaremos la variable $texto que contiene el string “son unos corruptos”. En la siguiente línea, desencriptamos la variable $texto_encriptado previamente encriptado.

El resultado de la desencriptación guardado en la variable $texto_original, deberá ser igual que el de la variable inicial $texto.


$texto = "Son unos corruptos";

// Encriptamos el texto
$texto_encriptado = Encrypter::encrypt($texto);

// Desencriptamos el texto
$texto_original = Encrypter::decrypt($texto_encriptado);

if ($texto == $texto_original) echo 'Encriptación / Desencriptación realizada correctamente.';