Autor Tema: Decryptador/Encryptador en C++  (Leído 2293 veces)

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

DusknoirMaster

  • Ayudante de Profesor
  • ****
  • Mensajes: 1043
  • Karma: +0/-0
  • DusknoirMaster Rules!
    • Ver Perfil

  • Total Badges: 27
    Badges: (View All)
    Nivel 5 Sexto aniversario Usuario de Windows
Decryptador/Encryptador en C++
« en: 10 de Noviembre de 2010, 04:29:13 am »
Bueno, esto es un programa que cree hace tiempo en C++, tiene un pequeño fallo y es que no Decripta/Encripta medio abecedario, pero aun asi se queda encriptado.
Bueno, aqui va e código:

Spoiler: mostrar


#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include <stdlib.h>


using namespace std;
string decrypt;
string encrypt;

int main()
{
    char choice;
    {
        //Elegir, encriptar o decriptar
        cout<<"\\**Bienvenido al programa de Decriptacion/Encriptacion de Enrique Silvela**// \n";
        cout<<"___________________________________________________________ ___________________ \n";
        cout<<"****************************************************************************** \n";
        cout<<"****************************************************************************** \n";
        cout<<"****************************************************************************** \n";
        cout<<"****************************************************************************** \n";
        cout<<endl;
        cout<<endl;
        inicio:
        cout<<"Elige que quieres hacer: Decriptar o Encriptar (D para Decriptar y E para encriptar): \n";
        cin>>choice;
        if (choice = 'D')
        {
           cout<<"Ahora selecciona la palabra que quieres decriptar(Usa _ para los espacios): \n";
        decrypt;
        }

        else if (choice = 'E')
        {
           cout<<"Ahora escribe la palabra que quieres encriptar (Usa _ para los espacios): \n";
        encrypt;
        }

        else
        {
           cout<<"Seleccion erronea, vuelve a intentarlo: \n";
        goto inicio;
        }


    }
    encrypt;
    {


        string wordu;
        cin>>wordu;
        string str (wordu);
  size_t found;

  found=str.find_first_of("a");
  while (found!=string::npos)
  {


            str[found] = 'z';
            found=str.find_first_of("a",found+1);

  }
    found=str.find_first_of("b");
  while (found!=string::npos)
  {


            str[found] = 'y';
            found=str.find_first_of("b",found+1);

  }
    found=str.find_first_of("c");
  while (found!=string::npos)
  {


            str[found] = 'x';
            found=str.find_first_of("c",found+1);

  }
    found=str.find_first_of("d");
  while (found!=string::npos)
  {


            str[found] = 'w';
            found=str.find_first_of("d",found+1);

  }
    found=str.find_first_of("e");
  while (found!=string::npos)
  {


            str[found] = 'v';
            found=str.find_first_of("e",found+1);

  }
    found=str.find_first_of("f");
  while (found!=string::npos)
  {


            str[found] = 'u';
            found=str.find_first_of("f",found+1);

  }
    found=str.find_first_of("g");
  while (found!=string::npos)
  {


            str[found] = 't';
            found=str.find_first_of("g",found+1);

  }
    found=str.find_first_of("h");
  while (found!=string::npos)
  {


            str[found] = 's';
            found=str.find_first_of("h",found+1);

  }
    found=str.find_first_of("i");
  while (found!=string::npos)
  {


            str[found] = 'r';
            found=str.find_first_of("i",found+1);

  }
    found=str.find_first_of("j");
  while (found!=string::npos)
  {


            str[found] = 'q';
            found=str.find_first_of("j",found+1);

  }
    found=str.find_first_of("k");
  while (found!=string::npos)
  {


            str[found] = 'p';
            found=str.find_first_of("k",found+1);

  }
    found=str.find_first_of("l");
  while (found!=string::npos)
  {


            str[found] = 'o';
            found=str.find_first_of("l",found+1);

  }
    found=str.find_first_of("m");
  while (found!=string::npos)
  {


            str[found] = 'n';
            found=str.find_first_of("m",found+1);

  }
    found=str.find_first_of("n");
  while (found!=string::npos)
  {


            str[found] = 'm';
            found=str.find_first_of("n",found+1);

  }
    found=str.find_first_of("o");
  while (found!=string::npos)
  {


            str[found] = 'l';
            found=str.find_first_of("o",found+1);

  }
    found=str.find_first_of("p");
  while (found!=string::npos)
  {


            str[found] = 'q';
            found=str.find_first_of("p",found+1);

  }
    found=str.find_first_of("q");
  while (found!=string::npos)
  {


            str[found] = 'j';
            found=str.find_first_of("q",found+1);

  }
    found=str.find_first_of("r");
  while (found!=string::npos)
  {


            str[found] = 'i';
            found=str.find_first_of("r",found+1);

  }
    found=str.find_first_of("s");
  while (found!=string::npos)
  {


            str[found] = 'h';
            found=str.find_first_of("s",found+1);

  }
    found=str.find_first_of("t");
  while (found!=string::npos)
  {


            str[found] = 'g';
            found=str.find_first_of("t",found+1);

  }
    found=str.find_first_of("u");
  while (found!=string::npos)
  {


            str[found] = 'f';
            found=str.find_first_of("u",found+1);

  }
    found=str.find_first_of("v");
  while (found!=string::npos)
  {


            str[found] = 'e';
            found=str.find_first_of("v",found+1);

  }
    found=str.find_first_of("w");
  while (found!=string::npos)
  {


            str[found] = 'd';
            found=str.find_first_of("w",found+1);

  }
    found=str.find_first_of("x");
  while (found!=string::npos)
  {


            str[found] = 'c';
            found=str.find_first_of("x",found+1);

  }
    found=str.find_first_of("y");
  while (found!=string::npos)
  {


            str[found] = 'b';
            found=str.find_first_of("y",found+1);

  }
    found=str.find_first_of("z");
  while (found!=string::npos)
  {


            str[found] = 'a';
            found=str.find_first_of("z",found+1);

  }  cout << str << endl;

  }
  char reintentar;
  {
      cout<<"Quieres volver a intentarlo? ('S' si y 'N' no): \n";
      reintentar:
      cin>>reintentar;

  }
  char select;
  {
      if (reintentar == 'S'||'s');
      choice;

  }

  decrypt;

{
    string worda;
        cin>>worda;
        string str (worda);
  size_t found;

  found=str.find_first_of("a");
  while (found!=string::npos)
      found=str.find_first_of("n");
  while (found!=string::npos)
  {


            str[found] = 'm';
            found=str.find_first_of("n",found+1);

  }
    found=str.find_first_of("o");
  while (found!=string::npos)
  {


            str[found] = 'l';
            found=str.find_first_of("o",found+1);

  }
    found=str.find_first_of("p");
  while (found!=string::npos)
  {


            str[found] = 'q';
            found=str.find_first_of("p",found+1);

  }
    found=str.find_first_of("q");
  while (found!=string::npos)
  {


            str[found] = 'j';
            found=str.find_first_of("q",found+1);

  }
    found=str.find_first_of("r");
  while (found!=string::npos)
  {


            str[found] = 'i';
            found=str.find_first_of("r",found+1);

  }
    found=str.find_first_of("s");
  while (found!=string::npos)
  {


            str[found] = 'h';
            found=str.find_first_of("s",found+1);

  }
    found=str.find_first_of("t");
  while (found!=string::npos)
  {


            str[found] = 'g';
            found=str.find_first_of("t",found+1);

  }
    found=str.find_first_of("u");
  while (found!=string::npos)
  {


            str[found] = 'f';
            found=str.find_first_of("u",found+1);

  }
    found=str.find_first_of("v");
  while (found!=string::npos)
  {


            str[found] = 'e';
            found=str.find_first_of("v",found+1);

  }
    found=str.find_first_of("w");
  while (found!=string::npos)
  {


            str[found] = 'd';
            found=str.find_first_of("w",found+1);

  }
    found=str.find_first_of("x");
  while (found!=string::npos)
  {


            str[found] = 'c';
            found=str.find_first_of("x",found+1);

  }
    found=str.find_first_of("y");
  while (found!=string::npos)
  {


            str[found] = 'b';
            found=str.find_first_of("y",found+1);

  }
    found=str.find_first_of("z");
  while (found!=string::npos)
  {


            str[found] = 'a';
            found=str.find_first_of("z",found+1);
  {


            str[found] = 'z';
            found=str.find_first_of("a",found+1);

  }
    found=str.find_first_of("b");
  while (found!=string::npos)
  {


            str[found] = 'y';
            found=str.find_first_of("b",found+1);

  }
    found=str.find_first_of("c");
  while (found!=string::npos)
  {


            str[found] = 'x';
            found=str.find_first_of("c",found+1);

  }
    found=str.find_first_of("d");
  while (found!=string::npos)
  {


            str[found] = 'w';
            found=str.find_first_of("d",found+1);

  }
    found=str.find_first_of("e");
  while (found!=string::npos)
  {


            str[found] = 'v';
            found=str.find_first_of("e",found+1);

  }
    found=str.find_first_of("f");
  while (found!=string::npos)
  {


            str[found] = 'u';
            found=str.find_first_of("f",found+1);

  }
    found=str.find_first_of("g");
  while (found!=string::npos)
  {


            str[found] = 't';
            found=str.find_first_of("g",found+1);

  }
    found=str.find_first_of("h");
  while (found!=string::npos)
  {


            str[found] = 's';
            found=str.find_first_of("h",found+1);

  }
    found=str.find_first_of("i");
  while (found!=string::npos)
  {


            str[found] = 'r';
            found=str.find_first_of("i",found+1);

  }
    found=str.find_first_of("j");
  while (found!=string::npos)
  {


            str[found] = 'q';
            found=str.find_first_of("j",found+1);

  }
    found=str.find_first_of("k");
  while (found!=string::npos)
  {


            str[found] = 'p';
            found=str.find_first_of("k",found+1);

  }
    found=str.find_first_of("l");
  while (found!=string::npos)
  {


            str[found] = 'o';
            found=str.find_first_of("l",found+1);

  }
    found=str.find_first_of("m");
  while (found!=string::npos)
  {


            str[found] = 'n';
            found=str.find_first_of("m",found+1);

  }


  }  cout << str << endl;

  }
  reintentar;










    return 0;

}

Es un poco largo el código, si alguien sabe como arreglarlo, que me lo diga, a ver si consigo hacer que funcione.


No creo que pase mucho por Pokexperto, no hasta vacaciones....


Alliare

  • Administrador
  • Pokéxperto Alpha
  • *
  • Mensajes: 7293
  • Karma: +4/-0
  • ...
    • Ver Perfil
    • Pokexperto
  • FC - 3DS: 2964-9235-9718

  • Total Badges: 47
    Badges: (View All)
    Noveno aniversario Octavo aniversario Séptimo aniversario
Re:Decryptador/Encryptador en C++
« Respuesta #1 en: 10 de Noviembre de 2010, 04:34:57 am »
Conozco a alguien que te puede ayudar. No está en el foro, pero voy a pasarle el enlace.

Muchas gracias a Pájaro por la fima y avatar *-*

sklsmly

  • Ayudante de Entrenador
  • **
  • Mensajes: 103
  • Karma: +0/-0
    • Ver Perfil

  • Total Badges: 16
    Badges: (View All)
    Súper combo Combo Democrático
Re:Decryptador/Encryptador en C++
« Respuesta #2 en: 10 de Noviembre de 2010, 05:24:44 am »
Buenas.

Me comentó Alliare que tenías un problemilla con el código. Le he echado un vistazo rápido y sin probarlo, pero creo que he visto el problema. Te comento:

Para encriptar y desencriptar recorres todo el texto, sustituyendo las letras según te las encuentras. Entonces, piensa que lo que han metido empieza por 'A'. Tu programa comprueba las A's, y cambia esa primera letra por una Z. Luego comprueba las B's, las C's.... Y finalmente, comprueba las Z's. Encuentra una Z en la primera posición (la que acabas de convertir) y la reconvierte en una A, dejándola igual que estaba. Por eso sólo convierte la mitad del abecedario. La segunda mitad, más concretamente. La primera la convierte y reconvierte en el mismo proceso, dejándola igual.

Necesitas un array auxiliar que marque las letras que has convertido, o que guarde el resultado, para que no haga esto. Sin embargo, estás haciendo 24 búsquedas, y conviertes sólo las minúsculas. Poco eficiente. Si usas el código Ascii, te resultará más fácil.

A - 65
Z - 90
a - 97
z - 122

Para convertir la A en Z (para invertir cualquier letra mayúscula, en realidad): Restas la letra a 90 (Para la A: 90-65 : 25) Y le sumas la letra A (25+65 = 90)

La B: Igual... (90-66=24;  24+65=89 (Y) )

Con lo que se nos queda : 90-Letra+65 -> 155-Letra

Para las minúsculas, lo mismo: 122-Letra+97  ->  219-Letra

Recorres el texto como un array, y miras cada posición. Si está entre 65 y 90 aplicas la formula de mayúsculas, y si está entre 97 y 122 la de minúsculas. Si es otra cosa, lo dejas igual.

Este es el código de prueba en C . Tendrás que adaptarlo un poco para tu programa, pero creo que se entiende.

Código: [Seleccionar]
//Prueba de encriptación por inversión de alfabeto
char Letra;

printf ("Letra mayuscula: ");
fflush (stdin);
scanf ("%c", &Letra);
printf ("Letra: %c", 155-Letra);

printf ("Letra minuscula: ");
fflush (stdin);
scanf ("%c", &Letra);
printf ("Letra: %c", 219-Letra);

Nota: Esa encriptación es una de las más débiles que hay, junto a la Cesar. Si lo quieres para algo un poco serio, te recomiendo usar alguna librería de encriptación mas fuerte, tipo la DES, por lo menos.
« Última modificación: 10 de Noviembre de 2010, 05:27:38 am por sklsmly »
by Alliare

DusknoirMaster

  • Ayudante de Profesor
  • ****
  • Mensajes: 1043
  • Karma: +0/-0
  • DusknoirMaster Rules!
    • Ver Perfil

  • Total Badges: 27
    Badges: (View All)
    Nivel 5 Sexto aniversario Usuario de Windows
Re:Decryptador/Encryptador en C++
« Respuesta #3 en: 11 de Noviembre de 2010, 05:08:48 am »
Gracias por la ayuda, si me fije en la encriptación de Cesar porque no me apetecia llegar tan lejos, una vez terminado este programa, ya lo "complicaré".
No creo que pase mucho por Pokexperto, no hasta vacaciones....