Por exigencias del guión, en el trabajo nos vemos obligados a almacenar los números de tarjeta de crédito de los clientes. Lógicamente, no queremos almacenarlos en claro, por lo que me he picado unas funciones para encriptar/desencriptar con algoritmo 3Des estos números.
El procedimiento es el siguiente:
teniendo la variable $texto, podemos hacer un encrypt($texto);, esto nos dará el resultado de aplicar el algoritmo 3Des a la cadena que hay en $texto. Esto produce una salida en binario, por lo que directamente esta función nos ofrece su resultado en hexadecimal para almacenarlo más cómodamente como texto en una base de datos.
para desencriptarlo, primero lo pasamos a binario con
<?php $_ = hex2bin($res); ?>y luego llamamos a la función de descifrado con los siguientes argumentos:
<?php decrypt(KEY_192, IV, 'tripledes', 'ecb', $_); ?>Esto nos produce el texto original en limpio :)
Pasteo aquí las funciones:
<?php
/*
CONFIG
*/
define('IV', '83575023'); // 8 dígitos, los que mas rabia te den
define('KEY_192', '1La4IuYtRe1sin5ReyCDEFGH'); // 24 caracteres, los que mas rabia te den
/*
CONFIG
*/
function hex2bin($hex) {
$rv = '';
foreach(str_split($hex, 2) as $b) {
$rv .= chr(hexdec($b));
}
return $rv;
}
function decrypt($key,$iv,$algorithm,$mode,$token) {
$td = mcrypt_module_open($algorithm, '', $mode, '') ;
$iv = substr($iv, 0, mcrypt_enc_get_iv_size($td));
$expected_key_size = mcrypt_enc_get_key_size($td);
$key = substr($key, 0, $expected_key_size);
mcrypt_generic_init($td, $key, $iv);
$response = rtrim(mdecrypt_generic($td, $token), '');
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $response;
}
function encrypt($cleartext = ''){
if (!$cleartext) return NULL;
$cipher = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
if (mcrypt_generic_init($cipher, KEY_192, IV) != -1)
{
$cipherText = mcrypt_generic($cipher,$cleartext );
mcrypt_generic_deinit($cipher);
return bin2hex($cipherText);
}
}
?>Por cierto, los valores tanto de IV como de KEY_192 aquí están a la vista, obviamente, pero, si lo vais a usar en la web, yo los mantendría aislados en un directorio no-visible :)
3 comments (+add yours?)
Saludos,
Encontré tu código más que interesante, y estoy tratando de implementarlo, pero con un pequeño añadido.
Desde la página A, donde mando los datos a la B, trato de mandar 2 variables. La a, y la b. Ambas contienen el mismo valor, pero la variable b, la paso por md5 antes de encriptarla.
Si posteriormente en la pagina B, decodifico ambas variables, y a la a la paso por md5 para compararla con la b, que previamente había sido pasada por md5, el valor que me dan, es distinto.
Asimismo, he intentado comparar el valor de a una vez codificado y decodificado, con su valor original, y siguen dando valores distintos.
Sabes a que se debe? Al codificar o decodificar quizá se añade algún bit distinto que hace que al compararlas no sean iguales?
mmmm yo no lo he hecho nunca pasando los valores ni por $_GET ni por $_POST.... no se decirte seguro... yo probaría a hacer al valor un urlencode() antes de enviarlo y luego al recibirlo lo primero un urldecode() ... a ver que tal ...
Lo probaré, muchas gracias por la prontitud ;)
Post new comment