Aptitud Intuitiva

martes, 26 de febrero de 2013

Codificar/Decodificar Base64 en PHP usando una clave personalizada


Saludos, la presente es para mostrar una forma de Codificar y Decodificar usando Base64 en PHP utilizando una clave personalizada.

Base64 es un método para representar una arbitraria secuencia de octetos, de tal forma que no sea fácil su lectura para un ser humano. El algoritmo para codificar y decodificar es relativamente simple, pero los datos codificados comúnmente ocupan 33% más de espacio que la información original. La manera de trabajar de este sistema de codificación es que cada 3 bloques de 8 bits son guardados en 4 caracteres de 6 bits, donde los caracteres se encuentran en el rango [A-Z][a-z][0-9][+/]. Sus principales aplicaciones son: Autenticación básica HTTP, en algunos métodos de codificar correo electrónico y en PGP firmas y claves.

En PHP se puede codificar información usando la función base64_encode (a partir de PHP4) y para decodificar se usa base64_decode. La desventaja de usar estos métodos es que es muy sencillo decodificar cualquier información, si se captura completa.

Una forma de aumentar el nivel de seguridad de este tipo de codificación es añadiendo una "clave", la cual puede ser un texto cualquiera que se intercala en la información original, de tal forma que si la información es capturada y decodificada el texto sea inteligible.

Para codificar en PHP uso una clase que llamé Enigma3, la cual es una clase en cuyo constructor se define una clave (en mis programas siempre uso frases de los libros y autores que admiro) y posee dos métodos: cifrar y descrifrar.

cifrar($texto), se encarga de ofuscar la información suministrada en la variable $texto.
descifrar($texto), se encarga de mostrar correctamente la información contenida en $texto.

Para usarlo solo se debe instanciar Enigma3 dentro del script de PHP que se requiera, suministrar la clave en el constructor y llamar al método requerido, por ejemplo:

<?php

//Cargar el archivo PHP en donde está la clase Enigma3
require("Enigma3.php");
//Definimos la clave a usar
$clave="Bueno, estoy de vuelta.";
//Instanciamos la clase Enigma3
$codificador=new Enigma3($clave);
//Texto de prueba
$texto="Texto de prueba";
//Llamamos al método cifrar
$texto_codificado=$codificador->cifrar($texto);
//Llamamos al método descifrar
$texto_decodificado=$codificador->descifrar($texto_codificado);
//$texto_decodificado y $texto deben ser exactamente iguales

?>


El código fuente de la clase Enigma3 lo muestro a continuación:

<?php
/*
* Este script PHP es Software Libre y se distribuye gratuitamente bajo
* licencia GPL, por lo que está permitida su copia o distribución bajo los
* criterios de la misma.
* Ante cualquier problema, consulta, sugerencia, etc, puede escribir a
* darkpriestrelative@gmail.com, o dejar un mensaje en el sitio
* http://jingmap.blogspot.com
* Para descargar actualizaciones u obtener mayor documentación consulte la
* ayuda en línea del programa o visite la página oficial del proyecto
* (http://jingmap.blogspot.com).
*
* Copyleft 2010-2013 Darkest Priest - (Manuel Pérez P. darkpriestrelative@gmail.com)

*/
class Enigma3{

private $clave;
function __construct($clave){

$this->clave=$clave;

}

function cifrar($texto){

$resultado='';
for($i=0;$i<strlen($texto);$i++){

$caracter=substr($texto, $i,1);
$caracterClave=substr($this->clave, ($i%strlen($this->clave))-1,1);
$caracter=chr(ord($caracter)+ord($caracterClave));
$resultado.=$caracter;

}

return base64_encode($resultado);

}
function descifrar($texto){

$resultado='';
$texto=base64_decode($texto);
for($i=0;$i<strlen($texto);$i++){

$caracter=substr($texto, $i,1);
$caracterClave=substr($this->clave, ($i%strlen($this->clave))-1,1);
$caracter=chr(ord($caracter)-ord($caracterClave));
$resultado.=$caracter;

}

return $resultado;

}

}


?>


Cualquier duda o comentario son bienvenidos por este medio, atentamente:
Manuel Pérez P.

Fuentes:
http://www.faqs.org/rfcs/rfc2045.html
http://www.elhacker.net/base64.html
http://www.php.net/manual/es/function.base64-encode.php
http://tech.chitgoks.com/2008/03/24/php-encrypt-decrypt-using-base64/

2 comentarios:

  1. Dos cosas Manuel, el constructor en php se define

    public function __construct();

    Con visibilidad tal cual como java pero la palabra reservada pare el mismo es __construct, además los atributos se declaran con la visibilidad y luego el nombre del atributo, tal cual como publicas la clase es php4 lo cual esta obsoleto, saludos

    ResponderEliminar
    Respuestas
    1. Gracias por la corrección, aunque este era sólo un ejemplo, las clases yo las defino con _construct en la práctica. Ya lo voy a corregir en la entrada.

      Eliminar

Información muy importante

INFORMACIÓN IMPORTANTE