Título: Programando un sistema cifrado/descifrado básico en C
Publicado por: Superplay en 21 Abril 2014, 20:49 pm
Buenas, resulta que tengo que programar un sistema de cifrado/descifrado. Digamos que los menús y algunas cosas ya están hechas. Os pongo el código: #include <stdio.h> #include <stdlib.h> #include <string.h>
int main(){ int opcion=0, hecho=0; //Variables para control char clave[13]; //Array de carácteres para la palabra clave
int palcla[13]; //Vector para asignar un número por letra a la palabra clave char cifrado[13][13]; int contlet[27]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //Contamos las letras y si alguna se repite, subimos uno al número int i, j, numle;
char texto[145]; char nombrearchivo, cargatxt; FILE *fichero, *fichero2;
do{ printf("\n\n1. Establecer palabra clave.\n"); printf("2. Cifrar un mensaje.\n"); printf("3. Descifrar un mensaje.\n"); printf("4. Salir\n"); printf("Introduzca una opcion:");
scanf("%d", &opcion); if(opcion>4){ printf("Ha elegido una opcion que no existe (%d) por favor, escoja una opcion que si exista.\n", &opcion); getchar(); getchar(); }else{ if(hecho==0 && opcion>1){ printf("No tiene ninguna palabra clave establecida.\n"); opcion=10; getchar(); getchar(); } } system("cls"); switch(opcion){ //Establecer palabra clave case 1: do{
printf("Palabra clave (12 letras): "); scanf("%s", clave); if(strlen(clave)<12 || strlen(clave)>12){ printf("Lo siento, esta palabra no tiene 12 letras, es de %i letras.\n\n", strlen(clave)); } }while(strlen(clave)<12 || strlen(clave)>12);
printf("Palabra clave establecida.\n"); hecho=1;
//Esto puede hacerse en una función aparte: for(i=0;i<13;i++){ printf("%c ", clave[i]); } printf("\n"); for(i=0;i<13;i++){
if(clave[i]=='A' || clave[i]=='a'){ contlet[0]++; palcla[i]=1+contlet[0]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='B'||clave[i]=='b'){ contlet[1]++; palcla[i]=2+contlet[1]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='C'||clave[i]=='c'){ contlet[2]++; palcla[i]=3+contlet[2]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='D'||clave[i]=='d'){ contlet[3]++; palcla[i]=4+contlet[3]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='E'||clave[i]=='e'){ contlet[4]++; palcla[i]=5+contlet[4]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='F'||clave[i]=='f'){ contlet[5]++; palcla[i]=6+contlet[5]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='G'||clave[i]=='g'){ contlet[6]++; palcla[i]=7+contlet[6]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='H'||clave[i]=='h'){ contlet[7]++; palcla[i]=8+contlet[7]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='I'||clave[i]=='i'){ contlet[8]++; palcla[i]=9+contlet[8]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='J'||clave[i]=='j'){ contlet[9]++; palcla[i]=10+contlet[9]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='K'||clave[i]=='k'){ contlet[10]++; palcla[i]=11+contlet[10]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='L'||clave[i]=='l'){ contlet[11]++; palcla[i]=12+contlet[11]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='M'||clave[i]=='m'){ contlet[12]++; palcla[i]=13+contlet[12]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='N'||clave[i]=='n'){ contlet[13]++; palcla[i]=14+contlet[13]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='Ñ'||clave[i]=='ñ'){ contlet[14]++; palcla[i]=15+contlet[14]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='O'||clave[i]=='o'){ contlet[15]++; palcla[i]=16+contlet[15]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='P'||clave[i]=='p'){ contlet[16]++; palcla[i]=17+contlet[16]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='Q'||clave[i]=='q'){ contlet[17]++; palcla[i]=18+contlet[17]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='R'||clave[i]=='r'){ contlet[18]++; palcla[i]=19+contlet[18]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='S'||clave[i]=='s'){ contlet[19]++; palcla[i]=20+contlet[19]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='T'||clave[i]=='t'){ contlet[20]++; palcla[i]=21+contlet[20]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='U'||clave[i]=='u'){ contlet[21]++; palcla[i]=22+contlet[21]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='V'||clave[i]=='v'){ contlet[22]++; palcla[i]=23+contlet[22]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='W'||clave[i]=='w'){ contlet[23]++; palcla[i]=24+contlet[23]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='X'||clave[i]=='x'){ contlet[24]++; palcla[i]=25+contlet[24]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='Y'||clave[i]=='y'){ contlet[25]++; palcla[i]=26+contlet[25]-1; printf("%d ", palcla[i]); }else{ if(clave[i]=='Z'||clave[i]=='z'){ contlet[26]++; palcla[i]=27+contlet[26]-1; printf("%d ", palcla[i]);
} }}}}}}}}}}}}}}}}}}}}}}}}}} }
break;
//-------------------------------------------------------------------------------------------------------------------------------------------
//Cifrar un mensaje case 2: printf( "Introduzca el texto (144 carácteres sin espacios máximo): " ); scanf( "%s", texto );
//Mostramos todo: for(i=0;i<13;i++){ printf("%c ", clave[i]); } printf("\n"); for(i=0;i<13;i++){ printf("%d ", palcla[i]); } printf("\n");
int letras=0; //Ponemos cada letra en una posición de la matriz for(j=0;j<13;j++){ for(i=0;i<13;i++){ if(letras<=strlen(texto)){ cifrado[i][j]=texto[letras]; printf("%c ", cifrado[i][j]); letras++; }else{ cifrado[i][j]=' '; }
} printf("\n"); }
printf( "\nEl mensaje %s que ha escrito se ha codificado adecuadamente:\n", texto );
//Vamos a guardar la matriz cifrado en un archivo de texto
printf("Por favor, introduzca el nombre del fichero con .txt: "); scanf("%s", &nombrearchivo);
if((fichero=fopen(&nombrearchivo,"w"))!=NULL){ for(i=0;i<13;i++){ for(j=0;j<13;j++){ fprintf(fichero,"%c",cifrado[i][j]); } fprintf(fichero,"\n"); } fclose(fichero); }else{ printf("Error al guardar el archivo\n"); }
/* getchar(); getchar();
//Ordenamos matriz general int palclabuena[13]; char cifradobuena[13][13];
for(numle=1;numle<40;numle++){
for(i=0;i<=13;i++){ if(palcla[i]==numle){ palclabuena[numle]=palcla[i]; for(j=0;j<=13;j++){ cifradobuena[i][j]=cifrado[i][j]; } } } }
//La repintamos for(i=0;i<13;i++){ printf("%c ", clave[i]); } printf("\n"); for(i=0;i<13;i++){ printf("%d ", palclabuena[i]); } printf("\n");
for(j=0;j<13;j++){ for(i=0;i<13;i++){ printf("%c ", cifradobuena[i][j]); } printf("\n"); }*/ break;
//Descifrar un mensaje case 3: //Leemos matriz del fichero
printf("Por favor, introduzca el nombre del fichero con .txt: "); scanf("%s", &nombrearchivo); if((fichero2=fopen(&nombrearchivo,"r"))!=NULL){ for(i=0;i<13;i++) { for(j=0;j<13;j++){ while (feof(fichero2)==0){ fscanf(fichero2, " %c" ,&cifrado[i][j]); } } } fclose (fichero2 ); }else{ printf("Error al leer el archivo\n"); }
//Mostramos matriz //Mostramos todo: for(i=0;i<13;i++){ printf("%c ", clave[i]); } printf("\n"); for(i=0;i<13;i++){ printf("%d ", palcla[i]); } printf("\n");
for(j=0;j<13;j++){ for(i=0;i<13;i++){ printf("%c ", cifrado[i][j]); } printf("\n"); }
break;
//Salir case 4: return 0; break; } }while(opcion!=4);
return 0; } Si vamos a la opción 1, vemos que el usuario debe introducir una palabra de 12 letras para usar en el cifrado y descifrado (en destino), y con ello le asigno un número que debe ser diferente y en función de la posición en el abecedario (casi lo logro, digamos que si hay letras repetidas asigna distintos pero otra letra debe tener un número distinto también en caso de que al incrementar el valor de las otras coincidan, algo que no he logrado). En la segunda opción, podéis ver un fragmento de código comentado, el reto ahí es reordenar según los números que he explicado antes, las columnas de menor a mayor ( no conseguido). Y que se guarden (como hace) en un archivo de texto. En la tercera opción digamos que debe hacer lo mismo pero al contrario (con la palabra, debe ordenar las columnas para que se queden como al principio (si no las hubieramos ordenado de menor a mayor), esas columnas y tal deben ser leídas de un archivo txt ( no conseguido). Bueno pues ahí mis problemas, muchas gracias gente... a ver si algún día contribuyo a código y no doy por saco con mis problemas
Título: Re: Programando un sistema cifrado/descifrado básico en C
Publicado por: Blaster en 22 Abril 2014, 04:06 am
Ahora mismo no tengo tiempo para revisar a fondo tu codigo, pero puedo darte una sugerencia para acortar mas el codigo ya que en el primer case tienes un bloque de codigos repetidos mi propuesta es la siguiente: char abc[] = "abcdefghijklmnñopqrstuvwxyz"; char *q = NULL; for (i = 0; clave[i] != '\0'; i++){ q = strchr(abc, clave[i]); if(q){ contlet[q-abc]++; palcla[i] = (q-abc)+1 + contlet[q-abc]-1; printf("%d ", palcla[i]); } }
Deberias implementar una función para asi validar tambien las letras mayusculas Saludos..
|