[ Foro de C ]

Operacion XOR sobre datos float??

13-Jul-2006 22:07
Jose P. Jávega
4 Respuestas

Pues la pregunta es obvia.... ¿Se puede utilizar una operacion XOR para encriptar unos datos de tipo float? ¿Cómo se guardan los decimales en sistema binario? ¿Que otras opciones hay a parte del XOR? Pensé en pasar los datos a caracter y despues hacer el xor sobre caracter en lugar de sobre numeros reales, pero me parece muy engorroso.


13-Jul-2006 22:12
Diego Teruel

Ombre la voz de la experiencia a hablado. Pues digo yo que si que e podra, si se puedn hacer con datos tipo int con float sera exactamente igual. Los datos los guardas en un array y arreglao.Vamos digo yo...
18-Jul-2006 13:56
Nacho Cabanes (+83)

Vamos a ver...

-------- Duda 1 -------------------------------------------

La operación XOR se suele hacer byte a byte.

Si la haces sobre un fichero, contenga datos del tipo que sea, tú lo abres como fichero binario, lees un byte, lo alteras y lo guardas en el fichero de destino, y así sucesivamente.

Por tanto, no te importa el hecho de que un "float" ocupe 6 bytes, porque tú vas a tratar esos bytes uno por uno a la hora de enmascararlos, y desenmascararlos también uno por uno, antes de volver a manipular los datos originales.

Si no lo haces en fichero, sino en memoria, la idea es similar, sólo que normalmente se hace con la ayuda de punteros (el operador & te dice en qué posición de memoria empieza tu dato, y "sizeof" te indica cuanto espacio ocupa). Aun así, no es frecuente tenerlo encriptado en memoria, sino sólo en fichero, que es lo fácilmente accesible por otras personas.

-------- Duda 2 -------------------------------------------

Los decimales en formato binario se pueden guardar de muchas formas, algunas de las cuales están normalizadas (pero no todas). Aun así, hay dos formas básicas de plantearlo:

- Coma fija: se usan X bits para la parte entera, Y bits para la parte fraccionaria (esta se almacena como potencias negativas de 2: el primer bit es 1/2, el segundo es 1/4, el tercero es 1/8 y así sucesivamente).

- Coma flotante (lo más habitual, porque permite valores más variados): se guarda el número en formato exponencial (X bits para la base, Y bits para el exponente, ambos con signo).

Aun así, son cosas que no necesitas conocer si sólo pretendes enmascarar datos: los fragmentas (típicamente byte a byte), sin preocuparte de lo que significan.

-------- Duda 3 -------------------------------------------

¿Alternativas a XOR? Depende del uso que le quieras dar.

Si se trata de encriptar datos, debe ser una operación reversible, de modo que lo más sencillo puede ser sumar y restar (por ejemplo, sumar 7.5 para encriptar y restar 7.5 para desencriptar).

En la práctica, se usan operaciones bastante más complejas, cosas del estilo de [(a elevado a b) modulo c]  donde b y c (y los usados para desencriptar, d y e) no se pueden elegir al azar, deben ser números que permitan una operación reversible, y además que "se comporten bien" (razonablemente grandes, etc).

---

¿Mejor?  ;-)

N.



18-Jul-2006 23:08
Jose P. Jávega

Ok, entendido. La idea era que como todos los datos estan guardados en un struct, encriptarlos en memoria para despues volcarlos todos de golpe a fichero. Y al revés, meterlos en bloque en el struct y desencriptarlos en memoria, pero vamos, creo que es menos engorroso usar un fichero de apoyo.

Gracias.


19-Jul-2006 12:03
Nacho Cabanes (+83)

Sí que los puedes encriptar antes de guardar. Sería algo como

struct miTipoDeDatos { ... };
struct miTipoDeDatos *miDato;
char claveCifrado = 21;

... (reservar espacio, manipular, etc)

tamanyo = sizeof(struct miTipoDeDatos);
for (i=0; i<tamanyo; i++)
  *(miDato+i)  ^=  claveCifrado;
fwrite(...);

y usarías otro "for" idéntico, después de leer con el fread, para regenerar los datos originales:

fread(...);
for (i=0; i<tamanyo; i++)
  *(miDato+i)  ^=  claveCifrado;

Eso sí, recuerda que después de hacer el fwrite tus datos originales están modificados, luego

a) No podrás seguir manejandolos directamente si no repites el "for" para que la copia que conservas en memoria vuelva a ser "texto claro".

b) La alternativa es copiar a una variable auxiliar, que es la que encriptas y vuelcas a fichero.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)