/* Ejercicio práctico 2-6 extraido de Obligatorio 1 */ #include #include /* las partes a y b, son parte de obligatorio 1 */ /* GR: c) Encriptado sencillo Escriba un programa que tome dos cadenas de texto: una larga, especificando un texto a encriptar, y una corta, a usar como clave de encriptación. La encriptación se realiza ha- ciendo xor de cada letra en el texto a encriptar con los primeros 6 bits de una letra correspondiente de la clave. Al principio se alinean las dos cadenas de texto y cuando el ´ındice en el texto original supera al de la clave, se retoma desde su comienzo. A modo de ejemplo, si el texto es “hasta la vista baby” y la clave es “terminator”, la correspondencia es la siguiente: HASTA LA VISTA, BABY! TERMINATORTERMINATORT y el resultado encriptado: \DAYH.MU/D]VFL%.CUMK5 */ /* LR: se asume que los primeros 6 bits son de b0 a b5 */ void main(int argc, char* argv[]) { /* comenzamos por el c) */ /* al no poder resolver en char array [] sin saber el largo, eliminamos argc y argv y probamos con los strings directamente */ /* tamtexto = sizeof(argv[1]) - 1; tamclave = sizeof(argv[2]) - 1; */ int tamtexto, tamclave, i, j; int mascara; char texto [] = "HASTA LA VISTA, BABY!"; char clave [] = "TERMINATOR"; char resultado [] = "HASTA LA VISTA, BABY!"; tamtexto = sizeof(texto) -1; /* elimina el '\0' que cuenta dentro del tamaño */ tamclave = sizeof(clave) -1; /* elimina el '\0' que cuenta dentro del tamaño */ printf("tamaño texto: %d\n", tamtexto); printf("tamaño clave: %d\n", tamclave); printf("texto: %s, clave: %s\n", texto, clave); mascara = 0X3F; for (j= 0; j < tamclave; j++) clave[j] = clave [j] & mascara; /* mascara = 0X3F, deja el alor 0011 1111 , el char clave[j] queda con sus 2 dígitos b7 y b6 en 0 */ printf(" texto %s\n", texto); printf(" clave sin digitos significativos %s\n", clave); /* eliminados los dos bits más significativos, pueden ser no imprimibles */ i = tamtexto; j = tamclave; /* forma compacta tengo dudas si es clave[i%tamclave] o clave[tamclave - i%tamclave] */ while (i >= 0) { printf(" valor de i %d, valor de imodtamclave: %d, texto de i: %c\n", i, i%tamclave, texto[i]); resultado[i] = (texto[i] ^ clave[i%tamclave]); printf(" resultado de i %c\n",resultado[i]); i--; } /* forma alternativa es hacer dos loops uno para texto y otro para clave */ /* while (i >= 0) { if (j < 0) j = tamclave - 1; printf(" alternativa valor de i %d, valor de j: %d, texto de i: %c\n", i, j, texto[i]); resultado [i] = texto[i] ^ clave[j]; printf(" resultado de i %c\n",resultado[i]); i--; j--; } */ printf(" texto %s\n", texto); printf(" clave %s\n", clave); printf("resultado %s\n", resultado); } /* ----------------------------------------------------------- */ /* resultado : luisrepetto@fedora:~/UdelarFing/PIE$ gedit ejerprac2-6solo.c luisrepetto@fedora:~/UdelarFing/PIE$ cc ejerprac2-6solo.c luisrepetto@fedora:~/UdelarFing/PIE$ ./a.out tamaño texto: 21 tamaño clave: 10 texto: HASTA LA VISTA, BABY!, clave: TERMINATOR texto HASTA LA VISTA, BABY! clave sin digitos significativos valor de i 21, valor de imodtamclave: 1, texto de i: resultado de i valor de i 20, valor de imodtamclave: 0, texto de i: ! resultado de i 5 valor de i 19, valor de imodtamclave: 9, texto de i: Y resultado de i K valor de i 18, valor de imodtamclave: 8, texto de i: B resultado de i M valor de i 17, valor de imodtamclave: 7, texto de i: A resultado de i U valor de i 16, valor de imodtamclave: 6, texto de i: B resultado de i C valor de i 15, valor de imodtamclave: 5, texto de i: resultado de i . valor de i 14, valor de imodtamclave: 4, texto de i: , resultado de i % valor de i 13, valor de imodtamclave: 3, texto de i: A resultado de i L valor de i 12, valor de imodtamclave: 2, texto de i: T resultado de i F valor de i 11, valor de imodtamclave: 1, texto de i: S resultado de i V valor de i 10, valor de imodtamclave: 0, texto de i: I resultado de i ] valor de i 9, valor de imodtamclave: 9, texto de i: V resultado de i D valor de i 8, valor de imodtamclave: 8, texto de i: resultado de i / valor de i 7, valor de imodtamclave: 7, texto de i: A resultado de i U valor de i 6, valor de imodtamclave: 6, texto de i: L resultado de i M valor de i 5, valor de imodtamclave: 5, texto de i: resultado de i . valor de i 4, valor de imodtamclave: 4, texto de i: A resultado de i H valor de i 3, valor de imodtamclave: 3, texto de i: T resultado de i Y valor de i 2, valor de imodtamclave: 2, texto de i: S resultado de i A valor de i 1, valor de imodtamclave: 1, texto de i: A resultado de i D valor de i 0, valor de imodtamclave: 0, texto de i: H resultado de i \ texto HASTA LA VISTA, BABY! clave resultado \DAYH.MU/D]VFL%.CUMK5 */