Asi he dejado el codigo:
Main.cpp:
Código PHP:
//--------------------------------------------------------------------------- #include <iostream> #include <fstream.h> #include "Vigenere.h" //---------------------------------------------------------------------------
using namespace std;
void InfoUso(); void Desencriptar(char *nameFileIn, char *semilla, char *nameFileOut); void Encriptar(char *nameFileIn, char *semilla, char *nameFileOut);
int main(int argc, char *argv[]) { if(argc == 5){ if(argv[1][0] == 'e' && argv[1][1] == '\0'){ Encriptar(argv[2],argv[3],argv[4]); cout << "Operacion finalizada." << endl; }else if(argv[1][0] == 'd' && argv[1][1] == '\0'){ Desencriptar(argv[2],argv[3],argv[4]); cout << "Operacion finalizada." << endl; }else{ cout << "Opcion no valida." << endl; InfoUso(); } }else if(argc<5){ cout << "Faltan argumentos." << endl; InfoUso(); }else{ cout << "Sobran argumentos." << endl; InfoUso(); } return 0; }
void InfoUso() { cout << "Vigenere.exe [operacion] [archivo] [semilla]" << endl; cout << "operacion: 'd' desencriptar. 'e' encriptar." << endl; cout << "archivo: ruta completa del archivo o solo el nombre si esta junto a este ejecutable." << endl; cout << "semilla: la cadena que va a ser usada como semilla para encriptar/desencriptar el archivo." << endl; }
//Funcion que encripta el archivo void Encriptar(char *nameFileIn, char *semilla, char *nameFileOut) { ifstream origen; ofstream salida; char *cadena;
origen.open(nameFileIn,ios::binary);
if(origen.good()){ origen.seekg(0,ios::end); int length = origen.tellg(); origen.seekg(0,ios::beg); cadena = new char[length+1]; Vigenere *vig = new Vigenere; salida.open(nameFileOut,ios::binary | ios::trunc);
if(salida.good()){ origen.read(cadena,length); cadena[length]='\0'; salida.write(vig->cifrar(cadena, semilla).c_str(),length); salida.close(); } delete vig; delete(cadena); origen.close(); } }
//Funcion que desencripta el archivo void Desencriptar(char *nameFileIn, char *semilla, char *nameFileOut) { ifstream origen; ofstream salida; char *cadena;
origen.open(nameFileIn,ios::binary);
if(origen.good()){ origen.seekg(0,ios::end); int length = origen.tellg(); origen.seekg(0,ios::beg); cadena = new char[length+1]; Vigenere *vig = new Vigenere; salida.open(nameFileOut,ios::binary | ios::trunc);
if(salida.good()){ origen.read(cadena,length); cadena[length]='\0'; salida.write(vig->descifrar(cadena, semilla).c_str(),length); salida.close(); } delete vig; delete(cadena); origen.close(); } }
Vigenere.h:
Código PHP:
//--------------------------------------------------------------------------- #ifndef VigenereH #define VigenereH //--------------------------------------------------------------------------- #include <cstring.h>
class Vigenere{ private: string texto,semilla,caracteresValidos; 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
Vigenere.h:
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 "Vigenere.h"
Vigenere::Vigenere(){ caracteresValidos = "abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZáéíóúÁÉÍÓÚüÜ1234567890¿?¡!,;.:-_ \"\t\n\r\\<>(){}[]^çÇ=+*/&%$#@"; }
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; unsigned int i, rotacion, total; int 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; i < texto.length(); i++){ rotacion = i%semilla.length(); pos = caracteresValidos.find(texto.at(i)); pos2 = caracteresValidos.find(semilla.at(rotacion)); total = (pos+pos2)%caracteresValidos.length(); //El total que marca la posicion de la letra y la //semilla sumadas
final.append(caracteresValidos, total, 1); } 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; unsigned int i, rotacion, total; int pos, pos2;
this->texto = limpiar(orig); this->semilla = limpiar(sem);
for(i=0; i<texto.length(); i++){ rotacion = i%semilla.length(); pos = caracteresValidos.find(texto.at(i)); pos2 = caracteresValidos.find(semilla.at(rotacion)); total = (caracteresValidos.length() + pos - pos2) % caracteresValidos.length();
final.append(caracteresValidos, total, 1); } 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){ unsigned int i; string final; for(i=0; i < cadena.length(); i++){ if(caracteresValidos.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; }
|