Foros del Web » Programando para Internet » PHP »

Encriptación

Estas en el tema de Encriptación en el foro de PHP en Foros del Web. Hola a todos. Tengo el siguiente código en php, el cual encripta y desencripta la clave de cada usuario. El código es el siguiente: Código ...
  #1 (permalink)  
Antiguo 27/01/2011, 01:35
Avatar de aalleexx81  
Fecha de Ingreso: noviembre-2009
Mensajes: 153
Antigüedad: 14 años, 5 meses
Puntos: 0
Pregunta Encriptación

Hola a todos. Tengo el siguiente código en php, el cual encripta y desencripta la clave de cada usuario. El código es el siguiente:

Código PHP:
<?php
function mysql_aes_decrypt($val,$ky)
{
    
$key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
    for(
$a=0;$a<strlen($ky);$a++)
      
$key[$a&#37;16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
    
$mode MCRYPT_MODE_ECB;
    
$enc MCRYPT_RIJNDAEL_128;
    echo 
"MODE: $mode ENC: $enc KEY: $key <br>";
    
$dec = @mcrypt_decrypt($enc$key$val$mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc$mode), MCRYPT_RAND) );
    return 
rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=and ord(substr($decstrlen($dec)-1,1))<=16)? chr(ordsubstr($dec,strlen($dec)-1,1))):null));
}

function 
mysql_aes_encrypt($val,$ky)
{
    
$key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
    for(
$a=0;$a<strlen($ky);$a++)
      
$key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
    
$mode=MCRYPT_MODE_ECB;
    
$enc=MCRYPT_RIJNDAEL_128;
    
$val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
    return 
mcrypt_encrypt($enc$key$val$modemcrypt_create_ivmcrypt_get_iv_size($enc$mode), MCRYPT_DEV_URANDOM));
}

$cadena "alex";
$semilla "epicsa2011";

$enc mysql_aes_encrypt($cadena,$semilla);

echo 
"Cadena encriptada: ".mysql_aes_encrypt($cadena,$semilla)."<br>";
echo 
"Cadena desencriptada: ".mysql_aes_decrypt($enc,$semilla)."<br>";

?>
El problema es que me lanza el siguiente warning 2 veces en la misma linea:

Warning: mcrypt_create_iv() [function.mcrypt-create-iv]: Cannot open source device in C:\PHP\...\encripta.php on line 23

Otra cosa que no entiendo es por qué las funciones @mcrypt_decrypt y @mcrypt_get_iv_size llevan una @ delante.

¿Alguien me puede decir que es lo que estoy haciendo mal?

Gracias a todos. Un saludo!!

Última edición por aalleexx81; 27/01/2011 a las 02:12
  #2 (permalink)  
Antiguo 27/01/2011, 02:19
Avatar de efedefernan  
Fecha de Ingreso: diciembre-2007
Ubicación: Cantabria
Mensajes: 91
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Encriptación

hola:
Sobre el warning que te devuelve la funcion, no te se comentar que puede ser, tal vez encuentres respuesta documentandote en
http://php.net/manual/es/function.mcrypt-create-iv.php

Sobre la @ delante de una función se utiliza para silenciar en pantalla los posibles errores que devuelva la funcion.

Un saludo.
  #3 (permalink)  
Antiguo 27/01/2011, 02:30
Avatar de aalleexx81  
Fecha de Ingreso: noviembre-2009
Mensajes: 153
Antigüedad: 14 años, 5 meses
Puntos: 0
Pregunta Respuesta: Encriptación

Gracias por tu ayuda. La cuestión es que antes de usar estas funciones leí el enlace que me has mandado. Es más el ejemplo que estoy usando está sacado de ese mismo enlace.

Agradezco tu interés.

Saludos
  #4 (permalink)  
Antiguo 27/01/2011, 05:19
Avatar de aalleexx81  
Fecha de Ingreso: noviembre-2009
Mensajes: 153
Antigüedad: 14 años, 5 meses
Puntos: 0
Pregunta Fallo al desencriptar

Hola a todos, hace algunas horas subí un tema relacionado con funciones de encriptación. El código no me funcionaba. He decido cambiar el código y ahora la encriptación funciona bien, pero no la desencriptación.

El código es el siguiente:

Código PHP:
<?php

$iv_size 
mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256MCRYPT_MODE_ECB);
$iv mcrypt_create_iv($iv_sizeMCRYPT_RAND);    
    
function 
encripta($text$iv){

    
$key "Clave que realiza el cifrado";
    echo 
"CONST: ".MCRYPT_RIJNDAEL_256."<br>";        
    echo 
"key: ".$key."<br>";
    echo 
"TEXTO E: ".$text."<br>";    
    echo 
"CONST2: ".MCRYPT_MODE_ECB."<br>";    
    echo 
"IV: ".$iv."<br>";
    
    
$crypttext mcrypt_encrypt(MCRYPT_RIJNDAEL_256$key$textMCRYPT_MODE_ECB$iv);
    
$descrypttext =  mcrypt_decrypt(MCRYPT_RIJNDAEL_256$key$crypttextMCRYPT_MODE_ECB$iv);
    echo 
"DESENCRIPTACION dentro de la funcion encriptacion: ".trim ($descrypttext)."<br>";

    return 
$crypttext;
}

function 
desencripta($text$iv){
    
    
$key "Clave que realiza el descifrado";
    echo 
"CONST: ".MCRYPT_RIJNDAEL_256."<br>";        
    echo 
"key: ".$key."<br>";
    echo 
"TEXTO D: ".$text."<br>";    
    echo 
"CONST2: ".MCRYPT_MODE_ECB."<br>";    
    echo 
"IV: ".$iv."<br>";
    
    
$descrypttext =  mcrypt_decrypt(MCRYPT_RIJNDAEL_256$key$textMCRYPT_MODE_ECB$iv);
     echo 
"DESENCRIPTACION dentro de la funcion desencriptacion: ".trim ($descrypttext)."<br>";
    
    return 
$descrypttext;
}


$cadenaenc encripta("a1174b"$iv);
echo 
"<br>ENCRIPTACION: ".$cadenaenc."<br>";

echo 
"<br><br>";

$cadenadesenc desencripta($cadenaenc$iv);
echo 
"<br>DESENCRIPTACION: ".$cadenadesenc."<br>";

?>
Los parámetros de ambas funciones son exactamente los mismos.

He probado a desencriptar en la primera funcion encripta() y me lo hace bien, el problema es cuando hago la desencriptación con la función desencripta(), ya que no me devuelve la cadena original, como debe ocurrir.

Llevo dándole vueltas alñ código un rato pero no me doy cuenta de lo que estoyhaciendo mal. Supongo que debe ser una tontería.

Alguna sugerencia.

Saludos a todos.
  #5 (permalink)  
Antiguo 27/01/2011, 08:12
 
Fecha de Ingreso: diciembre-2008
Mensajes: 69
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Encriptación

Por qué no funciona, no te lo sé decir.
Lo que te digo es que la arroba que llevan adelante las funciones, no es más que para ocultar los errores, más allá de que puedan no funcionar. Te sugiero que lo hagas únicamente al momento de publicar la página, sino te deja escondido todo lo que está mal.

Un saludo.
  #6 (permalink)  
Antiguo 27/01/2011, 08:14
 
Fecha de Ingreso: diciembre-2008
Mensajes: 69
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Fallo al desencriptar

Por ahí estoy diciendo cualquier cosa, pero ¿por qué usás dos veces $descrypttext?
Cambiale el nombre en la segunda función y fijate.

Un saludo.
  #7 (permalink)  
Antiguo 28/01/2011, 02:32
Avatar de aalleexx81  
Fecha de Ingreso: noviembre-2009
Mensajes: 153
Antigüedad: 14 años, 5 meses
Puntos: 0
Pregunta Respuesta: Encriptación

aagus muchas gracias por tu interés. No entiendo bien tu respuesta. En el segundo código que he modificado, fíjate que ya no hay @, es decir , supongo que no hay errores. El problema es que cuando encripto y desencripto dentro de la misma función, todo funciona ok. Utilizo dos funciones, la función encripta , que devuelve la cadena encriptada, y la función desencripta, que recibe la cadena encriptada por la función encripta y devuelve la cadena original.

El problema es que cuando uso estas dos funciones no me desencripta bien la cadena.

No sé si me estoy explicando bien.

Un saludo y muchas gracias de nuevo.
  #8 (permalink)  
Antiguo 28/01/2011, 09:38
 
Fecha de Ingreso: diciembre-2008
Mensajes: 69
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Encriptación

Código PHP:
Ver original
  1. function desencripta($text, $iv){
  2.  
  3. $descrypttext =  mcrypt_decrypt(MCR.......

Cambiá ese nombre de variable para la segunda función, ya que usás ese mismo nombre para la primera.

Un saludo.
  #9 (permalink)  
Antiguo 31/01/2011, 02:50
Avatar de aalleexx81  
Fecha de Ingreso: noviembre-2009
Mensajes: 153
Antigüedad: 14 años, 5 meses
Puntos: 0
De acuerdo Respuesta: Encriptación

Gracias por tu ayuda. He cambiado el código y ya me funciona. Es el siguiente:


function encryptData($encryption_algorithm, $encryption_mode, $random_source, $encryption_key, $raw_data, $iv=null)
{
global $client_iv;

/* Open the cipher */
$td = mcrypt_module_open($encryption_algorithm, '', $encryption_mode, '');

/* Create the IV and determine the keysize length */
$client_iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), $random_source);

if ($iv != null)
$client_iv = $iv;

$ks = mcrypt_enc_get_key_size($td);

/* Create key */
$key = substr(md5($encryption_key), 0, $ks);

/* Intialize encryption */
mcrypt_generic_init($td, $key, $client_iv);

/* Encrypt data */
$encrypted_data = mcrypt_generic($td, $raw_data);

/* Terminate encryption handler */
mcrypt_generic_deinit($td);

//return array($client_iv, $encrypted_data);
return $encrypted_data;
}

/////////////////////////////////////////////////////////////////////

function decryptData($encryption_algorithm, $encryption_mode, $encryption_key, $client_iv, $encrypted_data)
{
/* Open the cipher */
$td = mcrypt_module_open($encryption_algorithm, '', $encryption_mode, '');

$ks = mcrypt_enc_get_key_size($td);

/* Create key */
$key = substr(md5($encryption_key), 0, $ks);

/* Initialize encryption module for decryption */
mcrypt_generic_init($td, $key, $client_iv);

/* Decrypt encrypted string */
$decrypted_data = mdecrypt_generic($td, $encrypted_data);

/* Terminate decryption handle and close module */
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

/* Return string */
return trim($decrypted_data);
}

De nuevo muchas gracias aagus por tu ayuda. Saludos
  #10 (permalink)  
Antiguo 31/01/2011, 02:51
Avatar de aalleexx81  
Fecha de Ingreso: noviembre-2009
Mensajes: 153
Antigüedad: 14 años, 5 meses
Puntos: 0
De acuerdo Respuesta: Encriptación

Muchas gracias aagus. He cambiado el código y ya me funciona.

El código es el siguiente:

function encryptData($encryption_algorithm, $encryption_mode, $random_source, $encryption_key, $raw_data, $iv=null)
{
global $client_iv;

/* Open the cipher */
$td = mcrypt_module_open($encryption_algorithm, '', $encryption_mode, '');

/* Create the IV and determine the keysize length */
$client_iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), $random_source);

if ($iv != null)
$client_iv = $iv;

$ks = mcrypt_enc_get_key_size($td);

/* Create key */
$key = substr(md5($encryption_key), 0, $ks);

/* Intialize encryption */
mcrypt_generic_init($td, $key, $client_iv);

/* Encrypt data */
$encrypted_data = mcrypt_generic($td, $raw_data);

/* Terminate encryption handler */
mcrypt_generic_deinit($td);

//return array($client_iv, $encrypted_data);
return $encrypted_data;
}

/////////////////////////////////////////////////////////////////////

function decryptData($encryption_algorithm, $encryption_mode, $encryption_key, $client_iv, $encrypted_data)
{
/* Open the cipher */
$td = mcrypt_module_open($encryption_algorithm, '', $encryption_mode, '');

$ks = mcrypt_enc_get_key_size($td);

/* Create key */
$key = substr(md5($encryption_key), 0, $ks);

/* Initialize encryption module for decryption */
mcrypt_generic_init($td, $key, $client_iv);

/* Decrypt encrypted string */
$decrypted_data = mdecrypt_generic($td, $encrypted_data);

/* Terminate decryption handle and close module */
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

/* Return string */
return trim($decrypted_data);
}

Saludos

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 06:10.