Mostrare paso a paso, como crear una función de encriptamiento segura por medio de una llave. Lo primero que necesitamos es crear la clase. Para hacerla mas dinámica, podemos pedir la llave a la hora de crear el objeto o bien, usar la que dejemos predefinida en una variable privada:
class kryptoniano { private $k; function __construct($m=NULL){ $args = func_get_args(); if(empty($args)) $this->k = 'llave_tipo_string'; else $this->k = $m; }}
Declaramos la variable privada $k para usarla en nuestra clase, como la llave. Si cuando se construya el objeto no se envía ningún parámetro, usara la llave tipo string que dejemos escrita por standar. Ahora continuamos con la función de encriptacion:
function encriptar($t){ srand((double)microtime()*1000000); $r = md5(rand(0,32000)); $c=0; $v = ""; for ($i=0;$i<strlen($t);$i++){ if ($c==strlen($r)) $c=0; $v.= substr($r,$c,1).(substr($t,$i,1) ^ substr($r,$c,1)); $c++; } return base64_encode($this->ed($v)); }private function ed($t){ $r = md5($this->k); $c=0; $v = ""; for ($i=0;$i<strlen($t);$i++) { if ($c==strlen($r)) $c=0; $v.= substr($t,$i,1) ^ substr($r,$c,1); $c++; } return $v; }
La función en si, enmascara una encriptacion en base64. Para esto necesitamos la función privada ed que enmascara en base a nuestra llave $k. Ahora, la función para desencriptar, debemos recordar que si no tenemos la misma llave $k, el proceso no podrá ser desencriptado:
function desencriptar($t){
$t = $this->ed(base64_decode($t));
$v = "";
for ($i=0;$i<strlen($t);$i++){
$md5 = substr($t,$i,1);
$i++;
$v.= (substr($t,$i,1) ^ $md5);
}
return $v;
}
Por ultimo, borramos la llave cuando la clase no este en uso y para volver mas eficiente la clase, esta tendrá una sola función que sera llamada y esta desencriptara o encriptara según sea el caso y para ello agregaremos unas parámetros que nos digan si se esta haciendo una cosa o la otra (para este caso usaremos ‘z#‘), ademas de volver privadas las demás funciones, quedando la clase de la siguiente forma:
class kryptoniano{ private $k;function __construct($m=NULL){ $args = func_get_args(); if(empty($args)) $this->k = 'llave_tipo_string'; else $this->k = $m; }function krypto($a){ if(substr($a,0,2)!='z#') return $this->encriptar($a); else return $this->desencriptar(substr($a,2)); }private function ed($t){ $r = md5($this->k); $c=0; $v = ""; for ($i=0;$i<strlen($t);$i++) { if ($c==strlen($r)) $c=0; $v.= substr($t,$i,1) ^ substr($r,$c,1); $c++; } return $v; }private function encriptar($t){ srand((double)microtime()*1000000); $r = md5(rand(0,32000)); $c=0; $v = ""; for ($i=0;$i<strlen($t);$i++){ if ($c==strlen($r)) $c=0; $v.= substr($r,$c,1).(substr($t,$i,1) ^ substr($r,$c,1)); $c++; } return 'z#'.base64_encode($this->ed($v)); }private function desencriptar($t){ $t = $this->ed(base64_decode($t)); $v = ""; for ($i=0;$i<strlen($t);$i++){ $md5 = substr($t,$i,1); $i++; $v.= (substr($t,$i,1) ^ $md5); } return $v; }function __destruct(){ $this->k = ''; } }
La manera de usar esta clase seria:
$encriptacion = new kryptoniano('llave_tipo_string');
// La llave tipo string seria opcional
$encriptacion->krypto('lo que se quiere encriptar');
$encriptacion->krypto('lo que se quiere desencriptar¡);
// La función determinara si encripta o desencripta
Espero que les ayude.
Tags: clase, encriptacion, funcion, objeto, PHP
Muy bueno y facil de usar