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