Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

Ayuda programadores!! Vigenere!

pikazo

Becerro
Desde
21 May 2008
Mensajes
9
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"
space.gif
;
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 "
space.gif
;
gets(texto);//con gets, guardamos la cadena de caracteres
getch();
printf("\n\tEl cifrado es: "
space.gif
;

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"
space.gif
);

printf("\nAhora te presentamos la tabla de Vigenere: \n")
space.gif
;
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")
space.gif
;
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"
space.gif
);
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"
space.gif
);
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"
space.gif
);
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"
space.gif
);
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")
space.gif
;
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")
space.gif
;
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")
space.gif
;
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")
space.gif
;
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")
space.gif
;
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")
space.gif
;
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")
space.gif
;
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")
space.gif
;

printf("\n\n\tQuieres salir N/S?: ")
space.gif
;//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!
 
Aqui en esta parte lo encripta:

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++;
}
Para desencriptar es lo contrario osea algo asi:
#include <iostream>
#include <string.h>

using namespace std;

class Vigenere
{
public:
Vigenere() : i(0) {}
void Decifrar(string llave, string palabra);
private:
int cif, i, l, p;
string resultado;
};

void Vigenere::Decifrar(string llave, string palabra)
{
l = llave.length();
p = palabra.length();

while(l < p)
{
llave = llave + llave;
l = llave.length();
}

for( i = 0; i <= (p-1); i++)
{
llave -= 'a' - 1;

if((palabra - llave) < 'a')
{
cif = 'z' - (llave-palabra + 'a') + 1;
}
else if(palabra == 32)
cif = palabra;
else
cif = palabra - llave;

resultado += cif;
}
}


Aqui te dejo un ejercicio que hace la encriptacion y desencriptacion:

#include <iostream>
using namespace std;
#include <fstream>
#include <string>

unsigned int cripVigenere(bool, unsigned int, char, string *,
unsigned char, unsigned char);

int main(void) {
string file_orig, file_dest;
string pass;
char TipFile; // Tipo de fichero de salida.
fstream desc_r, desc_w;

unsigned int chCript, t;

cout < < "Nombre fichero de origen: ";
cin >> file_orig;

cout < < "Nombre fichero de destino: ";
cin >> file_dest;

cout < < "Password de cifrado: ";
cin >> pass;

do {
cout < < "Tipo de fichero de salida (B)inario o (T)exto: ";
cin >> TipFile;
if(TipFile=='b') TipFile='B';
else if(TipFile=='t') TipFile='T';
} while( (TipFile!='T') && (TipFile!='B') );

desc_r.open( file_orig.c_str(), ios::binary );
if(!desc_r) {
cout < < "Error en la apertura del fichero... (origen)" << endl;
system("pause");
exit(-1);
}

desc_w.open( file_dest.c_str(), ios::binary );
if(!desc_w) {
cout << "Error en la apertura del fichero... (destino)" << endl;
system("pause");
exit(-1);
}

if(TipFile=='T') { // Vegenere Texto
t=0;
do {
chCript = desc_r.get();
if(chCript!=-1) {
if(!((chCript&lt;65)||(chCript>90))) {
chCript = cripVigenere(false, t, chCript, &pass, 25, 65);
desc_w.put(chCript);
}
t++;
}
} while( desc_r.good() );
} else { // Vegenere Binario
for(unsigned int t=0; desc_r.good(); t++) {
chCript = desc_r.get();
chCript = cripVigenere(false, t, chCript, &pass, 0, 0);
desc_w.put(chCript);
}
}

desc_w.close();
desc_r.close();

system("pause");
return 0;
}

/*
La password se pasa como puntero a string

acc==true ---> Encripta
acc==false --> Desencripta
*/
unsigned int cripVigenere(bool acc, unsigned int t, char ch, string *pass,
unsigned char ndic=25, unsigned char desp=65) {
int chCript;

ndic++;
if(acc==true) {
chCript = (ch-desp)+(pass->at(t%pass->length())-desp);
if( chCript >= ndic ) chCript -= ndic;
} else {
chCript = (ch-desp)-(pass->at(t%pass->length())-desp);
if( chCript < 0 ) chCript += ndic;
}
return (chCript+desp);
}
 
Volver
Arriba