Foros del Web » Programando para Internet » PHP »

problemas con codificación de caracteres y mcrypt

Estas en el tema de problemas con codificación de caracteres y mcrypt en el foro de PHP en Foros del Web. Hola compañeros. Resulta que estoy encriptando datos con mcrypt pero no puedo almacenar estos datos en una base de datos mysql, la cual posee cotejamiento ...
  #1 (permalink)  
Antiguo 06/09/2011, 19:20
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 9 meses
Puntos: 269
problemas con codificación de caracteres y mcrypt

Hola compañeros.

Resulta que estoy encriptando datos con mcrypt pero no puedo almacenar estos datos en una base de datos mysql, la cual posee cotejamiento utf8_general_ci

Probé de todo ya, de poner los archivos .php en ansi, en utf8, en utf8-sin-bom, etc. Pero no hay caso, se almacenan algunos caracteres solamente, e incluso quedan campos vacíos.

Tengo montado esto en un desarrollo con mvc, pero este código de ejemplo puede ser útil para ilustrar el caso:
Código PHP:
<?php
$clave 
"clave";
$texto "Texto base para encriptar";

echo 
"<b>Texto Original:</b> " $texto "\n<p>";

function 
encripta($key$text){
    
$iv_size mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256MCRYPT_MODE_ECB);
    
$iv mcrypt_create_iv($iv_sizeMCRYPT_RAND);
    
    
$crypttext mcrypt_encrypt(MCRYPT_RIJNDAEL_256$key$text,MCRYPT_MODE_ECB$iv);
    return 
$crypttext;
}
function 
desencripta($key,$crypttext){
    
$iv_size mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256MCRYPT_MODE_ECB);
    
$iv mcrypt_create_iv($iv_sizeMCRYPT_RAND);

    
$decrypttext mcrypt_decrypt(MCRYPT_RIJNDAEL_256$key$crypttext,MCRYPT_MODE_ECB$iv);
    return 
$decrypttext;
}

$texto_encriptado encripta($clave$texto);
echo 
"<b>Encrypted Text: </b>" $texto_encriptado "<br />";

echo 
"<b>UnEncrypted Text: </b>" desencripta($clave$texto_encriptado);
?>
¿Como debo tratar la codificacion de caracteres para este caso, les ha pasado alguna vez?
Les agradezco de antemano su ayuda.
  #2 (permalink)  
Antiguo 06/09/2011, 20:00
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: problemas con codificación de caracteres y mcrypt

Seria posible que en el texo encriptado haya caracteres que no son de texto?... PHP puede manejar datos binarios en una cadena, pero creo que MySQL no lo permite en campos de texto. Por ejemplo, un NULL podria ser el causante de que se corten los datos.

Habria que revisar lo que obtienes en $texto_encriptado.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 06/09/2011, 23:57
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 9 meses
Puntos: 269
Respuesta: problemas con codificación de caracteres y mcrypt

Muchas gracias triby por la respuesta. La solución que encontré fue pasar la cadena encriptada a base64. De este modo se eliminan los caracteres raros y los campos varchar de la db utf8-general_ci la toman.

Comparto el código por si a alguien más le sirve:
Código PHP:
Ver original
  1. function encripta($key, $text){
  2.     $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
  3.     $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  4.    
  5.     $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text,MCRYPT_MODE_ECB, $iv);
  6.  
  7.     $crypttext = base64_encode($crypttext);
  8.  
  9.     return $crypttext;
  10. }
  11. function desencripta($key, $crypttext){
  12.    
  13.     $crypttext = base64_decode($crypttext);
  14.     $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
  15.     $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  16.  
  17.     $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $crypttext,MCRYPT_MODE_ECB, $iv);
  18.     return $decrypttext;
  19. }

Saludos.

Etiquetas: caracteres, mcrypt, mysql
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




La zona horaria es GMT -6. Ahora son las 21:29.