Encriptador en C++

Iniciado por mastersuv, 22 Agosto 2010, 09:26 AM

0 Miembros y 1 Visitante están viendo este tema.

mastersuv

Después de un largo rato de pensarle y buscar conceptos T_T
he logrado crear un sencillo sistema de cifrado.

Bueno... la cifrado es algo loca, pero la pueden modificar a su gusto.

Me gustaría que me dieran consejos de como podría mejor este código.
Que cosas hize de más, o que le falta.
¿Estoy usando mucho código innecesario?

PD: Solo cifra palabras en minusculas, y solo acepta espacios como separador.

Aquí les dejo el codigo:

Código (cpp) [Seleccionar]
#include <iostream>
#include <windows.h>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

vector<string> AddNumbers(vector<string> vector){
vector.push_back("cml29");
vector.push_back("mpdo1");
vector.push_back("cp3p");
vector.push_back("maT4");
vector.push_back("88gk");
vector.push_back("29f");
vector.push_back("9fff");
vector.push_back("fj239");
vector.push_back("fj33f");
vector.push_back("f888");
vector.push_back("45fc");
vector.push_back("d892");
vector.push_back("cronq");
vector.push_back("you");
vector.push_back("llnever");
vector.push_back("know");
vector.push_back("this");
vector.push_back("encr");
vector.push_back("ipta");
vector.push_back("tion");
vector.push_back("lol");
vector.push_back("rf8");
vector.push_back("l28");
vector.push_back("66");
vector.push_back("d6");
vector.push_back("e79d");
vector.push_back("49jf");
return vector;
}
vector<string> AddLetters(vector<string> vector){
vector.push_back("a");
vector.push_back("b");
vector.push_back("c");
vector.push_back("d");
vector.push_back("e");
vector.push_back("f");
vector.push_back("g");
vector.push_back("h");
vector.push_back("i");
vector.push_back("j");
vector.push_back("k");
vector.push_back("l");
vector.push_back("m");
vector.push_back("n");
vector.push_back("o");
vector.push_back("p");
vector.push_back("q");
vector.push_back("r");
vector.push_back("s");
vector.push_back("t");
vector.push_back("u");
vector.push_back("v");
vector.push_back("w");
vector.push_back("x");
vector.push_back("y");
vector.push_back("z");
vector.push_back(" ");

return vector;
}

class CODSYS{
public:
vector<string> abc;
vector<string> nums;

CODSYS(){
abc = AddLetters(abc);
nums = AddNumbers(nums);
}
};

vector<string> PartirString(string a){
vector<string> vector;
    string word;
    stringstream stream(a);
    while( getline(stream, word, 'x'))
vector.push_back(word);

return vector;
}

string descifrar(string a){
CODSYS *dat = new CODSYS;
vector<string> numeros;
// vector<string>::iterator it;
string numeroactual;
string descifrado;

numeros = PartirString(a); // Se eliminan las "x" y se guarda cada número como un elemento del vector.

for(unsigned int i = 0; i < numeros.size(); i++){
numeroactual = numeros[i];
for(unsigned int z = 0; z < dat->nums.size(); z++){
if(numeroactual == dat->nums[z]){
descifrado += dat->abc[z];
break;
}
}
}
delete dat;

return descifrado;
}

string cifrar(string a){
CODSYS *dat = new CODSYS;
string letraactual;
string cifrado;

for(unsigned int i = 0; i < a.length(); i++){
letraactual = a[i];
for(unsigned int z = 0; z < dat->abc.size(); z++){
if(letraactual == dat->abc[z]){
cifrado += dat->nums[z];
cifrado += "x";
}
}
}
delete dat;

return cifrado;
}

void EncMain(){
system("cls");
string cadena;

cout << "Ingresa una Cadena para encriptarla:\n";
getline(cin, cadena);

cout << "\n\n= " << cifrar(cadena) << "\n\n" ;

system("PAUSE");
system("CLS");
}

void DesencMain(){
system("cls");
string cadena;

cout << "Ingresa una Cadena para desencriptarla:\n";
getline(cin, cadena);

cout << "\n\n= " << descifrar(cadena) << "\n\n";

system("PAUSE");
system("CLS");
}

int main(int argc, char *argv[]){
while(true){
string dec;
r:
cout << "==> Encriptador por mastersuv v0.1 <==\n\n";
cout << "---- Selecciona una opcion: ----\n";
cout << "||                            ||\n";
cout << "|| 1. cifrar una Cadena    ||\n";
cout << "|| 2. descifrar una Cadena ||\n";
cout << "||                            ||\n";
cout << "--------------------------------\n\n> ";

getline(cin, dec);

for(unsigned int i = 0; i < dec.length(); i++){
if(!isdigit(dec[i])){
MessageBoxA(NULL, "Ingrese solo numeros!", "Error!", MB_OK);
system("CLS");
goto r;
break;
}
else if((dec > "2" || dec < "1")){
MessageBoxA(NULL, "Opción inválida", "Error!", MB_OK);
system("CLS");
goto r;
break;
}
else{ continue; }
}

if(dec == "1"){
EncMain();
}
else if(dec == "2"){
DesencMain();
}
}
return 0;
}


[L]ord [R]NA

el codigo se puede mejorar bastante... los if,else if, else no necesitan break al terminar. los goto son una mala practica en programacion, no importa el lenguaje... la encriptacion se puede mejorar bastante, se ve demasiado poco estetica. en mi S.O. no se ejecutara correctamente debido a los llamados a system(), que tambien son una mala practica. Todos los miembros de la clase son publicos, tambien es una mala practica.

consejos:

1) Busca remplazos a los system.
2) Declara el string dec fuera del while, asi evitas tener que usar el goto.
3) Decide si utilizaras Apis o no, eso le quita portabilidad al ejecutable.
4) Es bueno que las funciones tengan un valor de retorno, asi sabes si ocurrio algun error.
5) Quita "int argc" y "char *argv[]" si no los vas a utilizar.

leogtz

#2
Lord R.N.A, los break' s los está usando porque están en el ámbito de un ciclo FOR, los usa para parar el ciclo.

No es que esté mal usar solo miembros públicos, pero se pierde la abstracción.

Lo que se ve feo es el agregado de las palabras al vector.

No sé si estás liberando bien la memoria con delete.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

[L]ord [R]NA

Cita de: Leo Gutiérrez. en 22 Agosto 2010, 17:28 PM
Lord R.N.A, los break' s los está usando porque están en el ámbito de un ciclo FOR, los usa para parar el ciclo.

No es que esté mal usar solo miembros públicos, pero se pierde la abstracción.

Lo que se ve feo es el agregado de las palabras al vector.

No sé si estás liberando bien la memoria con delete.

Saludos.

yo veo un problema con los break; nunca pueden ser tomados, debido a que siempre salta a "r" antes de llegar.

mastersuv

Exactamente, eso es por lo cual use break;

Y con lo del agregado de palabras, te refieres a las que van a sustituir cierto?

Yo también se que eso esta feo pero quize dramatizarlo jaja para ver como se veía.

[L]ord [R]NA

Cita de: mastersuv en 22 Agosto 2010, 18:38 PM
Exactamente, eso es por lo cual use break;

Y con lo del agregado de palabras, te refieres a las que van a sustituir cierto?

Yo también se que eso esta feo pero quize dramatizarlo jaja para ver como se veía.

Hiciste un codigo tan feo porque lo querias hacer asi :huh: no se pero no me parece

mastersuv

Es mi primer programa usando vectores de esta forma.
Nunca había usado tantos for y todavía soy nuevo en C++...

Este es uno de mis primeros programas pero ya veo que son basura.
:(

[L]ord [R]NA

:¬¬ No se dijo que fuera basura... se dijo que se pueden mejorar bastante.

do-while

¡Buenas!

Creo que te vendria bien algo de infromacion de las chinchetas del subforo de criptografia, en el foro de seguridad informatica. Como bien te han indicado, los metodos criptograficos son independientes del lenguaje de programacion que utilices, y conocerlos te ayudara a ordenar las ideas.

Y sobre todo, sigue asi y sigue intentandolo, que todos hemos hemos empezado por codigos mas o menos "guarros", y con el tiempo y la practica, vas consiquiendo un codigo mas claro y conciso.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!