
21-10-2015
|
 |
Miembro
|
|
Registrado: may 2013
Posts: 885
Reputación: 14
|
|
Ahora he modificado el codigo un poco y sobre todo he añadido mas caracteres a la mascara de caracteres válidos y ya no funciona correctamente. Tengo esto:
Main.cpp:
Código PHP:
//--------------------------------------------------------------------------- #include <iostream> #include "Unit1.h" //---------------------------------------------------------------------------
int main() { string cadena = "Hola Mundo, como te va."; string semilla = "aguml";
Vigenere *vig = new Vigenere; string cifrada = vig->cifrar(cadena, semilla); std::cout << cifrada << std::endl;
string descifrada = vig->descifrar(cifrada, semilla); std::cout << descifrada << std::endl; delete vig; std::cin.get();
return 0; }
Unit1.cpp:
Código PHP:
/************************************************ * Nombre : Vigenere.cpp * * * * Cifrado de cesar de sustitución multiple * * por medio de sumas y restas del alfabeto * * * * Fulapol * * [email protected] * * my.opera.com/fulapol * * * ************************************************/
/************************************************ * * * El Constructor que debe recibir la cadena a * * tratar y la cadena semilla * * * ************************************************/ #include "Unit1.h"
Vigenere::Vigenere(){ letras = "abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZáéíóúÁÉÍÓÚüÜ1234567890¿?¡!,;.:-_ \"<>()=+*/&%$#@"; }
Vigenere::~Vigenere(){
} /************************************************ * * * El metodo cifrar, que regresa una cadena de * * texto que solo despues de ser cifrada * * * ************************************************/
string Vigenere::cifrar(string orig, string sem){ string final; int i, movimiento, rotacion, total; size_t pos, pos2; //Las variables serviran para registrar la posicion //de las letras y calcular la semilla
this->texto = limpiar(orig); this->semilla = limpiar(sem);
for(i=0, rotacion=0; i < texto.length(); i++, rotacion++){ pos = letras.find(texto.at(i)); pos2 = letras.find(semilla.at(rotacion)); total = ((int)(pos+pos2))%letras.length(); //El total que marca la posicion de la letra y la //semilla sumadas
if(total > letras.length()) movimiento = total - letras.length(); else movimiento = total; //Para asegurarnos que esta dentro del rango
final.append(letras, movimiento, 1); if(rotacion == semilla.length() - 1) rotacion = 0; //Si se acaba la semilla, regresar al principio } return final; }
/************************************************ * * * El metodo descifrar, que regresa una cadena * * de texto que solo despues de ser descifrada * * * ************************************************/
string Vigenere::descifrar(string orig, string sem){ //La funcion es exactamente la misma que en el metodo //cifrar, solo que aqui las posiciones se restan para //eliminar la semilla del texto
string final; int i, movimiento, rotacion, total; size_t pos, pos2;
this->texto = limpiar(orig); this->semilla = limpiar(sem); for(i=0, rotacion=0; i<texto.length(); i++, rotacion++){ pos = letras.find(texto.at(i)); pos2 = letras.find(semilla.at(rotacion)); total = ((int)(pos - pos2)) % letras.length(); if(total < 0) movimiento = total + letras.length(); else movimiento = total; final.append(letras, movimiento, 1); if(rotacion == semilla.length() - 1) rotacion = 0; } return final; }
/************************************************ * * * El metodo limpiar, que regresa una cadena de * * texto que solo contiene los caracteres * * soportados por la clase * * * ************************************************/
string Vigenere::limpiar(string cadena){ int i; string final; for(i=0; i < cadena.length(); i++){ if(letras.find(cadena.at(i)) != -1) final.append(&cadena.at(i),1); //Agregamos a la cadena final el caracter //si se encuentra en la variable letras } return final; }
Unit1.h:
Código PHP:
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <cstring.h>
class Vigenere{ private: string texto,semilla,letras; string limpiar(string cadena); //Las variables son privadas, el metodo limpiar //es privada ya que solo lo utilizan los otros //metodos para limpiar la entrada
public: Vigenere(); ~Vigenere(); string cifrar(string orig, string sem); string descifrar(string orig, string sem); //Esto es publico porque es la unica forma de //accesar a los datos de la clase }; //--------------------------------------------------------------------------- #endif
¿Como la pongo correctamente la máscara?
|