Cifrar variables o textos de forma sencilla.

Iniciado por Meta, 29 Marzo 2018, 08:47 AM

0 Miembros y 1 Visitante están viendo este tema.

Serapis

#10
Algunas cosas...



1 - Usando el sistema de cifrar usando XOR con un único valor (10 en ese caso), es relativamente sencillo descubrir el sistema. Si en cambio cada carácter en origen se cifra con un valor distinto, no sirve de nada un análisis de frecuencia...
Considera cifrar esta palabra: matematicas
tiene 3 'a', y dos veces se repite 'mat': 'mat' 'e' 'mat' 'i' 'cas'.
matematicas (con XOR 10) = gk~ogk~ciky   'gk~' 'o' 'gk~' 'c' 'iky'
matematicas (con XOR ??) = "PTIzNjs3Jy4wYXM="  siendo ?? resultado de la clave "QWERTYUIOP"
matematicas (con XOR ??) = "DgAZDAMAGh0GQR0="  siendo ?? resultado de la clave "caminante no hay camino"

Como puedes ver en los 2 últimos ejemplos que no usan XOR 10, no hay correspondencia entre caracteres en  la salida con respecto de la entrada... que haya dos veces 'mat', o 3 veces una 'a'... no guarda relación con el resultado en la salida.

Más aún imaginemos que el texto a cifrar es algo más extenso: "las matematicas son muy utiles"

"las matematicas con muy utiles" (con XOR 10) = "fky*gk~ogk~ciky*yed*gs*~cfoy"
Como se ve, la subcadena 'matematicas' se localiza dentro de este nuevo resultado, : "gk~ogk~ciky"  y s elocaliza porque cada carácter a la entrada arroja siempre el mismo resultado a la salida, hay una correspondecia bidireccional muy tangible...

"las matematicas son muy utiles" (con XOR ??) = "RFRaDVxQWUxYYXRcSkxCEV5GWyFtPjJ0Li89Jy5z"  siendo ?? resultado de la clave "QWERTYUIOP", como se aprecia, no se puede localizar correspondencia con la subcadena de 'matematicas' anteriormente cifrada a "PTIzNjs3Jy4wYXM=" no aparece como subcadena dentro de un texto mayor que subcontenga al previo...
Nota que también existe una correspondecia bidireccional (si no no se podría decodificar), pero es intangible. En cuanto cambia el tamaño de la entrada o cambia la clave, el resultaod es totalmente distinto.



2 - Con tu método, al operar con: 'n XOR 10', puede dejarte algunos caracteres no imprimibles... Recuerda que XOR, se comporta como una suma o una resta, dependiendo de los operandos... deja el bit a 1, cuando el número de bits a 1 (en la misma posición) de los operandos es impar, y en otro caso lo deja a 0.
Para ver claramente lo que te digo prueba esto:

   escribir en consola "Desde: 0 hasta: 15"
   Bucle para k desde 0 a 255
       escribir en consola en misma linea (k xor 10)  + ", "
       Si (((k+1) and 15) = 0)
              escribir en consola nueva linea
              escribir en consola "Desde: " + k + " hasta: " + (k+15)
       Fin si
   Fin bucle

Si sólo usas caracteres en el contenido de esas variables, desde el espacio hasta el 127 (el siguiente a ~)
Tendrás estas conversiones válidas con 'n XOR 10':
desde: 31 hasta: 47
42, 43, 40, 41, 46, 47, 44, 45, 34, 35, 32, 33, 38, 39, 36, 37,
desde: 47 hasta: 63
58, 59, 56, 57, 62, 63, 60, 61, 50, 51, 48, 49, 54, 55, 52, 53,
desde: 63 hasta: 79
74, 75, 72, 73, 78, 79, 76, 77, 66, 67, 64, 65, 70, 71, 68, 69,
desde: 79 hasta: 95
90, 91, 88, 89, 94, 95, 92, 93, 82, 83, 80, 81, 86, 87, 84, 85,
desde: 95 hasta: 111
106, 107, 104, 105, 110, 111, 108, 109, 98, 99, 96, 97, 102, 103, 100, 101,
desde: 111 hasta: 127
122, 123, 120, 121, 126, 127, 124, 125, 114, 115, 112, 113, 118, 119, 116, 117,



3 - Al margen de eso, cifrar como quieres se trata simplemente de obtener un array de bytes (o chars), con los que poder operar partiendo de la matriz, y luego tras el resultado volver a convertir a string de nuevo.

Código (C#) [Seleccionar]


           string s = "En un lugar de 'La Mancha', de cuyo nombre no quiero acordarme.";
           string r, t;

           s = "las matematicas son muy utiles";
           int k;
           int j = s.Length;

           //1- Convertir un string a un array de bytes:
           byte[] Cifrado = Encoding.Default.GetBytes(s);   //o también  ASCIIEncoding.ASCII.GetBytes(s)
             
           // 2- Cifrar el byte[k] con Xor 10:
           for (k = 0; k < j; k++){
               Cifrado[k] = (byte) ( Cifrado[k] ^ 10);
           }

           // 3 - Convertir el array de bytes en un string, de nuevo.
           r = Encoding.Default.GetString(Cifrado);  




4 - Aunque uses esto de XOR 10, te sugiero que lo metas en una función, y lo pongas como una extensión de método para la clase String, como te indicaba más arriba, así tu antes conviertes los textos deseados, los guardas en un fichero, luego los pegas a tu programa, y luego ya modificas de forma definitiva el programa y en 'main', ´simplemente llamarías al método 'decode', por cada variable, que tengas cifrada:

por ejemplo:
Código (c#) [Seleccionar]

Console.Title = Console.Title.Decode

El contenido de esa función es básicamente las líneas recién adjuntas... 's', sería el parámetro de entrada y 'r' sería un return.

Meta

Buenas compañero:

Pedazo de explicación con ejemplso incluido.  ;-) Digno de ser admirado.

Voy a intentar pasarlo a C# lo que haz contado, un ejemplo sencillo para que nos entendamos y se entienda.

Buen trabajo.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/