- Tema Autor
- #1
Que tal amigos! pues verán, me han dejado en la escuela hacer un código que cifre una palabra y la descifre por medio de la tabla de Vigenere. Logré hacer que la cifre, pero no logro hacer que la descifre. Se supone que es con la operación contraria, pero no veo que operación tengo que hacer contraria. Necesito su ayuda! Necesito que me ayudan a modificar el programa para que descifre la palabra! Les pongo el código y por favor díganme como le hago! gracias!
#include <stdio.h>
#include <string.h>
#include <conio.h>
int main(){
char abecedario[] = "abcdefghijklmnopqrstuvwxyz"; //arreglo a-z
char clave[]="pacopacopacopaco"; //palabra clave, se repite varias veces para que se acople al texto original
char texto[30]; //palabras a encriptar, el usuario la proporcionará.
int valor; //variable auxiliar
char Salida; //variable para salida
printf("\nBienvenido a Cripteame. Este es un programa que cifra una palabra que tu\nproporciones con una clave que ya esta en el sitema\nPor favor, presiona Enter para continuar\n"
;
getch();//Damos la bienvenida al programa
do{//iniciamos in ciclo do-while que permite seguir encriptando palabras
printf("\n\n\tDame el mensaje en claro, en minusculas y sin espacios,\n\tdespués, presiona Enter para continuar "
;
gets(texto);//con gets, guardamos la cadena de caracteres
getch();
printf("\n\tEl cifrado es: "
;
for(int ix = 0, iy = 0; ix < strlen(texto); ix++) //se inicia el ciclo de encriptación, con strlen se calcula el numero de caracteres
{
for(int ix2 = 0 ; ix2 < 26; ix2++)
{
if( abecedario[ix2] == clave[iy] ) // aqui encontramos la posicion de la fila respecto a la letra de la clave "paco"
{
for(int px = 0; px < 26; px++)
{
if(abecedario[px] == texto[iy])
{
valor = (int) abecedario[ix2]; //transformamos el valor de letra a entero con la variable extra
for(int px2 = 0; px2 <= px; px2++)
{
if(valor > 122) //segun el código ascii, a=97, z=122 por lo tanto, si el valor es menor de 122, se empieza de nuevo en la linea de abajo
valor = 97; //empezamos de nuevo con a=97
valor++;
}
printf("%c",(char) valor-1); //transformamos el entero a caracter y le restamos 1, si lo dejamos sin restar, el se considerara una fila despues, por eso se le resta uno, si queremos criptar b, y no restamos, se considerara la c, no la b
}
}
++iy;
}
}
}
printf("\n"
);
printf("\nAhora te presentamos la tabla de Vigenere: \n")
;
printf("\nA B C D E F G H I J K L M N O P Q R S T U V W X Y Z\nB C D E F G H I J K L M N O P Q R S T U V W X Y Z A")
;
printf("\nC D E F G H I J K L M N O P Q R S T U V W X Y Z A B\nD E F G H I J K L M N O P Q R S T U V W X Y Z A B C"
);
printf("\nF G H I J K L M N O P Q R S T U V W X Y Z A B C D E\nG H I J K L M N O P Q R S T U V W X Y Z A B C D E F"
);
printf("\nH I J K L M N O P Q R S T U V W X Y Z A B C D E F G\nI J K L M N O P Q R S T U V W X Y Z A B C D E F G H"
);
printf("\nJ K L M N O P Q R S T U V W X Y Z A B C D E F G H I\nK L M N O P Q R S T U V W X Y Z A B C D E F G H I J"
);
printf("\nL M N O P Q R S T U V W X Y Z A B C D E F G H I J K\nM N O P Q R S T U V W X Y Z A B C D E F G H I J K L")
;
printf("\nN O P Q R S T U V W X Y Z A B C D E F G H I J K L M\nO P Q R S T U V W X Y Z A B C D E F G H I J K L M N")
;
printf("\nP Q R S T U V W X Y Z A B C D E F G H I J K L M N O\nQ R S T U V W X Y Z A B C D E F G H I J K L M N O P")
;
printf("\nR S T U V W X Y Z A B C D E F G H I J K L M N O P Q\nS T U V W X Y Z A B C D E F G H I J K L M N O P Q R")
;
printf("\nT U V W X Y Z A B C D E F G H I J K L M N O P Q R S\nU V W X Y Z A B C D E F G H I J K L M N O P Q R S T")
;
printf("\nV W X Y Z A B C D E F G H I J K L M N O P Q R S T U\nW X Y Z A B C D E F G H I J K L M N O P Q R S T U V")
;
printf("\nX Y Z A B C D E F G H I J K L M N O P Q R S T U V W\nY Z A B C D E F G H I J K L M N O P Q R S T U V W X")
;
printf("\nZ A B C D E F G H I J K L M N O P Q R S T U V W X Y\n")
;
printf("\n\n\tQuieres salir N/S?: ")
;//aqui el usuario puede decidir si quiere salir o no
Salida=_getche();
}while(Salida=='n'||Salida=='N');
}
Cópienlo en su compilador tal cual y córranlo, verán que puede cifrar perfectamente. Está compilado en dev c++. Tal vez no es el código más efecitvo, pero pues después de mucho buscar, logré hacer eso. El código tiene algunos comentarios de lo que se supone va haciendo el programa. Les agradeceré muchísimo su ayuda!
LES DEJO MI CORREO POR SI ME PUEDEN ENVIAR EL CÓDIGO PARA QUE DESCIFRE:
[email protected]
Gracias de nuevo!
#include <stdio.h>
#include <string.h>
#include <conio.h>
int main(){
char abecedario[] = "abcdefghijklmnopqrstuvwxyz"; //arreglo a-z
char clave[]="pacopacopacopaco"; //palabra clave, se repite varias veces para que se acople al texto original
char texto[30]; //palabras a encriptar, el usuario la proporcionará.
int valor; //variable auxiliar
char Salida; //variable para salida
printf("\nBienvenido a Cripteame. Este es un programa que cifra una palabra que tu\nproporciones con una clave que ya esta en el sitema\nPor favor, presiona Enter para continuar\n"

getch();//Damos la bienvenida al programa
do{//iniciamos in ciclo do-while que permite seguir encriptando palabras
printf("\n\n\tDame el mensaje en claro, en minusculas y sin espacios,\n\tdespués, presiona Enter para continuar "

gets(texto);//con gets, guardamos la cadena de caracteres
getch();
printf("\n\tEl cifrado es: "

for(int ix = 0, iy = 0; ix < strlen(texto); ix++) //se inicia el ciclo de encriptación, con strlen se calcula el numero de caracteres
{
for(int ix2 = 0 ; ix2 < 26; ix2++)
{
if( abecedario[ix2] == clave[iy] ) // aqui encontramos la posicion de la fila respecto a la letra de la clave "paco"
{
for(int px = 0; px < 26; px++)
{
if(abecedario[px] == texto[iy])
{
valor = (int) abecedario[ix2]; //transformamos el valor de letra a entero con la variable extra
for(int px2 = 0; px2 <= px; px2++)
{
if(valor > 122) //segun el código ascii, a=97, z=122 por lo tanto, si el valor es menor de 122, se empieza de nuevo en la linea de abajo
valor = 97; //empezamos de nuevo con a=97
valor++;
}
printf("%c",(char) valor-1); //transformamos el entero a caracter y le restamos 1, si lo dejamos sin restar, el se considerara una fila despues, por eso se le resta uno, si queremos criptar b, y no restamos, se considerara la c, no la b
}
}
++iy;
}
}
}
printf("\n"

printf("\nAhora te presentamos la tabla de Vigenere: \n")

printf("\nA B C D E F G H I J K L M N O P Q R S T U V W X Y Z\nB C D E F G H I J K L M N O P Q R S T U V W X Y Z A")

printf("\nC D E F G H I J K L M N O P Q R S T U V W X Y Z A B\nD E F G H I J K L M N O P Q R S T U V W X Y Z A B C"

printf("\nF G H I J K L M N O P Q R S T U V W X Y Z A B C D E\nG H I J K L M N O P Q R S T U V W X Y Z A B C D E F"

printf("\nH I J K L M N O P Q R S T U V W X Y Z A B C D E F G\nI J K L M N O P Q R S T U V W X Y Z A B C D E F G H"

printf("\nJ K L M N O P Q R S T U V W X Y Z A B C D E F G H I\nK L M N O P Q R S T U V W X Y Z A B C D E F G H I J"

printf("\nL M N O P Q R S T U V W X Y Z A B C D E F G H I J K\nM N O P Q R S T U V W X Y Z A B C D E F G H I J K L")

printf("\nN O P Q R S T U V W X Y Z A B C D E F G H I J K L M\nO P Q R S T U V W X Y Z A B C D E F G H I J K L M N")

printf("\nP Q R S T U V W X Y Z A B C D E F G H I J K L M N O\nQ R S T U V W X Y Z A B C D E F G H I J K L M N O P")

printf("\nR S T U V W X Y Z A B C D E F G H I J K L M N O P Q\nS T U V W X Y Z A B C D E F G H I J K L M N O P Q R")

printf("\nT U V W X Y Z A B C D E F G H I J K L M N O P Q R S\nU V W X Y Z A B C D E F G H I J K L M N O P Q R S T")

printf("\nV W X Y Z A B C D E F G H I J K L M N O P Q R S T U\nW X Y Z A B C D E F G H I J K L M N O P Q R S T U V")

printf("\nX Y Z A B C D E F G H I J K L M N O P Q R S T U V W\nY Z A B C D E F G H I J K L M N O P Q R S T U V W X")

printf("\nZ A B C D E F G H I J K L M N O P Q R S T U V W X Y\n")

printf("\n\n\tQuieres salir N/S?: ")

Salida=_getche();
}while(Salida=='n'||Salida=='N');
}
Cópienlo en su compilador tal cual y córranlo, verán que puede cifrar perfectamente. Está compilado en dev c++. Tal vez no es el código más efecitvo, pero pues después de mucho buscar, logré hacer eso. El código tiene algunos comentarios de lo que se supone va haciendo el programa. Les agradeceré muchísimo su ayuda!
LES DEJO MI CORREO POR SI ME PUEDEN ENVIAR EL CÓDIGO PARA QUE DESCIFRE:
[email protected]
Gracias de nuevo!