Foros del Web » Programando para Internet » PHP »

Pasar variable GET encriptado con algoritmo de semilla

Estas en el tema de Pasar variable GET encriptado con algoritmo de semilla en el foro de PHP en Foros del Web. Hola a todos, estoy programando una aplicación en php. Necesito pasar algunos argumentos por la URL y quería que estos argumentos se enviasen encriptados. He ...
  #1 (permalink)  
Antiguo 29/08/2010, 21:01
 
Fecha de Ingreso: septiembre-2008
Mensajes: 26
Antigüedad: 15 años, 6 meses
Puntos: 0
Pasar variable GET encriptado con algoritmo de semilla

Hola a todos,

estoy programando una aplicación en php. Necesito pasar algunos argumentos por la URL y quería que estos argumentos se enviasen encriptados.

He usado el par base64_encode-decode pero no me sirve ya que sólo oculta pero no asegura que alguien inserte un valor generado por él.

He intentado usar algún algoritmo de los de mCrypt pero al pasar por la URL al recuperar los datos estos son ilegibles (le hago un base64_encode y decode para evitar problemas de caracteres invalidos).

Código PHP:
<?php
function encode_this($string) {
    
$cifrado MCRYPT_RIJNDAEL_256;
    
$modo MCRYPT_MODE_ECB;
    return 
base64_encode(mcrypt_encrypt($cifradoLLAVE$string$modo,
                
mcrypt_create_iv(mcrypt_get_iv_size($cifrado$modo), MCRYPT_RAND)
                ));


function 
decode_this($string) {
    
//$string = base64_decode($string);
    
$string base64_decode($string);
    
$cifrado MCRYPT_RIJNDAEL_256;
    
$modo MCRYPT_MODE_ECB;
    return 
mcrypt_decrypt($cifradoLLAVE$string$modo,
            
mcrypt_create_iv(mcrypt_get_iv_size($cifrado$modo), MCRYPT_RAND)                );
}  
?>
Para encriptar el valor del parametro uso encode en la pagina origen e intento recuperar con decode this en el destino pero no me funciona.

Alguien tiene alguna clase que me pueda ayudar?

Gracias.

Saludos
  #2 (permalink)  
Antiguo 29/08/2010, 22:50
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Pasar variable GET encriptado con algoritmo de semilla

El problema es que estás generando otro vector al tratar de desencriptar al usar dos veces mcrypt_create_iv. Mira este ejemplo, lo tomé del manual y lo modifiqué para que tengas una idea de lo que puedes hacer.
Código PHP:
Ver original
  1. <?php
  2. function cryptMessage($message, $key){
  3.     /* Open the cipher */
  4.     $td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
  5.  
  6.     /* Create the IV and determine the keysize length, use MCRYPT_RAND
  7.      * on Windows instead */
  8.     $ks = mcrypt_enc_get_key_size($td);
  9.     $iv = mcrypt_create_iv($ks, MCRYPT_RAND);
  10.  
  11.     /* Create key */
  12.     $key = substr(md5($key), 0, $ks);
  13.  
  14.     /* Intialize encryption */
  15.     mcrypt_generic_init($td, $key, $iv);
  16.  
  17.     /* Encrypt data */
  18.     $encrypted = mcrypt_generic($td, $message);
  19.  
  20.     /* Terminate encryption handler */
  21.  
  22.     return array('crypt' => $encrypted,
  23.         'key' => $key,
  24.         'iv' => $iv);
  25. }
  26.  
  27. function decryptMessage($encrypted, $key, $iv){
  28.     /* Open the cipher */
  29.     $td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
  30.  
  31.     /* Initialize encryption module for decryption */
  32.     mcrypt_generic_init($td, $key, $iv);
  33.  
  34.     /* Decrypt encrypted string */
  35.     $decrypted = mdecrypt_generic($td, $encrypted);
  36.  
  37.     /* Terminate decryption handle and close module */
  38.  
  39.     /* Show string */
  40.     return trim($decrypted);
  41. }
  42.  
  43. $crypt = cryptMessage('mensaje bien importante a ver si sale', 'llave importante');
  44. echo decryptMessage($crypt['crypt'], $crypt['key'], $crypt['iv']);
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 30/08/2010, 04:41
 
Fecha de Ingreso: septiembre-2008
Mensajes: 26
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Pasar variable GET encriptado con algoritmo de semilla

Hola,

gracias por la respuesta. El método que has posteado está muy bien y me ha ayudado a entender mi error pero en mi caso no es válido ya que lo que pretendo es pasar la cadena encriptada por url y al devolver un array en el momento de desencriptar me dá que IV es igual a 1.

Existe alguna otra manera para poder pasar los datos por URL?

Gracias

Saludos
  #4 (permalink)  
Antiguo 30/08/2010, 05:02
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Pasar variable GET encriptado con algoritmo de semilla

Solo es cuestión de convertir los datos en base64. Al menos tienes que convertir el encriptado y el iv.

Edito:
De esta forma logré que siempre me dé correctamente el mensaje encriptado.
Código PHP:
Ver original
  1. <?php
  2. function cryptMessage($message, $key){
  3.     /* Open the cipher */
  4.     $td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
  5.  
  6.     /* Create the IV and determine the keysize length, use MCRYPT_RAND
  7.      * on Windows instead */
  8.     $ks = mcrypt_enc_get_key_size($td);
  9.     $iv = mcrypt_create_iv($ks, MCRYPT_RAND);
  10.  
  11.     /* Create key */
  12.     $key = substr(md5($key), 0, $ks);
  13.  
  14.     /* Intialize encryption */
  15.     mcrypt_generic_init($td, $key, $iv);
  16.  
  17.     /* Encrypt data */
  18.     $encrypted = mcrypt_generic($td, $message);
  19.  
  20.     /* Terminate encryption handler */
  21.  
  22.     return array('crypt' => base64_encode(urlencode($encrypted)),
  23.         'key' => base64_encode(urlencode($key)),
  24.         'iv' => base64_encode(urlencode($iv)));
  25. }
  26.  
  27. function decryptMessage($encrypted, $key, $iv){
  28.     /* Open the cipher */
  29.     $td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
  30.  
  31.     /* Initialize encryption module for decryption */
  32.     mcrypt_generic_init($td, $key, $iv);
  33.  
  34.     /* Decrypt encrypted string */
  35.     $decrypted = mdecrypt_generic($td, $encrypted);
  36.  
  37.     /* Terminate decryption handle and close module */
  38.  
  39.     /* Show string */
  40.     return trim($decrypted);
  41. }
  42.  
  43. $crypt = cryptMessage('mensaje bien importante a ver si sale', 'llave importante');
  44.  
  45. if(isset($_GET['crypt']) && isset($_GET['key']) && isset($_GET['iv'])){
  46.     echo decryptMessage(urldecode(base64_decode($_GET['crypt'])), urldecode(base64_decode($_GET['key'])), urldecode(base64_decode($_GET['iv']))) . '<br />';
  47. }
  48. ?>
  49.  
  50. <a href="<?php echo $_SERVER["PHP_SELF"]; ?>?crypt=<?php echo $crypt['crypt']; ?>&key=<?php echo $crypt['key']; ?>&iv=<?php echo $crypt['iv']; ?>">Mensaje</a>
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 30/08/2010 a las 05:45
  #5 (permalink)  
Antiguo 30/08/2010, 06:08
 
Fecha de Ingreso: septiembre-2008
Mensajes: 26
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Pasar variable GET encriptado con algoritmo de semilla

He usado un paso intermedio, el IV y la key las guardo como variable de sesión sólo calculandolas una vez. Luego modifico las cadenas para evitar las cadenas con + y simbolos no permitidos y posteriormente recojo y hago la inversaa.

Código PHP:
<?php
function encode_this($message$key=LLAVE) {
    if(!empty(
$message)){
        
#
        
$td mcrypt_module_open('rijndael-256''''ofb''');
    
#
     
    #
        /* Create the IV and determine the keysize length, use MCRYPT_RAND
    #
         * on Windows instead */
    #
        
$ks mcrypt_enc_get_key_size($td);
        
        if(!isset(
$_SESSION[IV])){
    
#
            
$iv mcrypt_create_iv($ksMCRYPT_RAND);
            
$_SESSION[IV] = $iv;
        }
        else{
            
$iv $_SESSION[IV];
        }
    
#
     
    #
        /* Create key */
        
        
if(!isset($_SESSION[CLAVE])){
    
#
            
$key substr(md5($key), 0$ks);
            
$_SESSION[CLAVE] = $key;
        
        }
        else{
            
$key $_SESSION[CLAVE];
        }
    
#
     
    #
        /* Intialize encryption */
    #
        
mcrypt_generic_init($td$key$iv);
    
#
     
    #
        /* Encrypt data */
    #
        
$encrypted mcrypt_generic($td$message);
    
#
     
    #
        /* Terminate encryption handler */
    #
        
mcrypt_generic_deinit($td);
    
#
        
mcrypt_module_close($td);
    
#
     
    #
        
return strtr(base64_encode($encrypted), '+/=''-_,');
     }


function 
decode_this($encrypted) {
    if(!empty(
$encrypted)){
        
#
        
$encrypted base64_decode(strtr($encrypted'-_,''+/='));
        
$td mcrypt_module_open('rijndael-256''''ofb''');
    
#
     
    #
        /* Initialize encryption module for decryption */
    #
        
mcrypt_generic_init($td$_SESSION[CLAVE], $_SESSION[IV]);
    
#
     
    #
        /* Decrypt encrypted string */
    #
        
$decrypted mdecrypt_generic($td$encrypted);
    
#
     
    #
        /* Terminate decryption handle and close module */
    #
        
mcrypt_generic_deinit($td);
    
#
        
mcrypt_module_close($td);
    
#
     
    #
        /* Show string */
    #
        
return trim($decrypted);
     }
}  
?>
Gracias por tu ayuda.

Saludos
  #6 (permalink)  
Antiguo 30/08/2010, 07:34
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Pasar variable GET encriptado con algoritmo de semilla

Tienes errores en el código. A menos que tengas declarado constantes y no las menciones en el código. Pero en la función tienes declarado LLAVE y si no es una constante, entonces es un error. También declaraste llaves como constantes y no las mencionas anteriormente en la función.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 30/08/2010, 07:51
 
Fecha de Ingreso: septiembre-2008
Mensajes: 26
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Pasar variable GET encriptado con algoritmo de semilla

Tienes razón, las constantes están definidas lo que pasa es que tengo un fichero aparte para definir las constantes de aplicación.

Gracias por tu ayuda, ahora me funciona correctamente.

Saludos

Etiquetas: encriptado, pasar, algoritmos, variables
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 17:16.