Como cifrar letra por letra en C++

Iniciado por Royca3, 10 Junio 2013, 06:31 AM

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

CCross

Cita de: Royca3 en 11 Junio 2013, 03:48 AM
rir3760 Muchas gracias el código es lo que buscaba pero obtengo el mismo error anterior el programa se me cierra antes de mostrar los resultados  :-( alguien sabe el porque

Prueba con poner un getchar(); antes de:

Código (cpp) [Seleccionar]
return EXIT_SUCCESS;

Buscate un buen libro de C te recomiendo el libro de kernighan y Ritchie que es muy bueno
para empezar

Saludos

Royca3

Cita de: CCross en 11 Junio 2013, 03:56 AM
Prueba con poner un getchar(); antes de:

Código (cpp) [Seleccionar]
return EXIT_SUCCESS;

Buscate un buen libro de C te recomiendo el libro de kernighan y Ritchie que es muy bueno
para empezar

Saludos


Igual se sale :'( Pues si de echo ya tengo unos manuales pero apenas comienzo :)
Pero porque se sigue saliendo del programa sin mostrar resultados?

Saludos.
Homo erectus

amchacon

Cita de: Royca3 en 11 Junio 2013, 04:57 AM
Igual se sale :'( Pues si de echo ya tengo unos manuales pero apenas comienzo :)
Pero porque se sigue saliendo del programa sin mostrar resultados?

Saludos.
Pon 2 getchar().

La razón por la que se sale esque el programa termina al finalizar el main, si que muestra los resultados pero va tan rápido que ni los ves.

Por cierto:
http://foro.elhacker.net/programacion_cc/iquestpor_que_no_deberias_usar_el_devcpp-t385150.0.html
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Royca3

Cita de: amchacon en 11 Junio 2013, 10:17 AM
Pon 2 getchar().

La razón por la que se sale esque el programa termina al finalizar el main, si que muestra los resultados pero va tan rápido que ni los ves.

Por cierto:
http://foro.elhacker.net/programacion_cc/iquestpor_que_no_deberias_usar_el_devcpp-t385150.0.html

Listo amigo Todo en orden, el programa cumple la función requerida  ;-) ;-) ;-) ;-) Les agradezco a CCross, rir3760, a leosansan aunque le doy gracias a todos por su buena voluntad próxima mente subiré un tutorial  :laugh:

Saludos.
Homo erectus

leosansan

#34
Cita de: CCross en 10 Junio 2013, 23:28 PM
Buenas amigos!!

Aquí otra versión del cifrado cesar donde tu puedes indicar el desplazamiento que quieras


No es el cifrado César, te muestro una salida al código que planteas:


CitarIntroduce una cadena: wikipedia la enciclopedia libre
Ingrese desplazamiento:
cifrado es: ┘╦═╦ÊÃã╦├

descifrado es: wikipedia

Como ves, en el cifrado se "va más allá" de la z/Z, cuando debería empezar a contar desde la a.

Una solución  "a pura fuerza bruta", es decir aplicando estrictamente lo que plantea el cifrado César :


Código (cpp) [Seleccionar]

/*En criptografía, el cifrado César, también conocido como cifrado
por desplazamiento, código de César o desplazamiento de César, es
una de las técnicas de codificación más simples y más usadas.
Es un tipo de cifrado por sustitución en el que una letra en el
texto original es reemplazada por otra letra que se encuentra un
número fijo de posiciones más adelante en el alfabeto. Por
ejemplo, con un desplazamiento de 6.*/
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int main (void)
{
   int i,n=0,aux;
   char frase [256];
   char cadena []="WIKIPEDIA, LA ENCICLOPEDIA LIBRE \n\
   Wikipedia la Enciclopedia Libre f F x X";
   puts("WIKIPEDIA, LA ENCICLOPEDIA LIBRE \n\
   Wikipedia la Enciclopedia Libre f F x X");
   for (i=0;cadena[i]!='\0';i++)
       {
           if ((cadena [i]>='u' && cadena [i]<='z') || (cadena [i]>='U' && cadena [i]<='Z' ))   cadena [i]-=20;
           else if (cadena [i]>='a' && cadena [i]<='t' || (cadena [i]>='A' && cadena [i]<='T' ))   cadena [i]+=6;
       }
   puts("\nY ahora codificada con desplazamiento 6:");
   printf ("%s\n",cadena);
   puts("\nY ahora descodificada: ");
   for (i=0;cadena[i]!='\0';i++)
       {
           if ((cadena [i]<='f' && cadena [i]>='c') || (cadena [i]<='F' && cadena [i]>='C' ))   cadena [i]+=20;
           else if (cadena [i]>'f' && cadena [i]<='z' || (cadena [i]>'F' && cadena [i]<='Z' ))   cadena [i]-=6;
       }
   printf ("%s\n",cadena);

/******* AHORA CON ENTRADA DESDE TECLADO *******/

   while (1)
   {
   n=0;
   puts ("\n\nIntroduce una frase: ");
   fgets (frase,255,stdin);
   do
   {
       printf ("\nIndica el desplazamiento (1-25): ");
       scanf ("%d",&n);
       while (getchar()!='\n');
   }while (n<1 || n>25);
   for (i=0;frase[i]!='\0';i++)
   {
       if ((frase [i]>('z'-n) && frase [i]<='z') || (frase [i]>('Z'-n) && frase [i]<='Z' ))
           frase [i]=frase [i]-26+n;
       else if (frase [i]>='a' && frase [i]<=('z'-n) || (frase [i]>='A' && frase [i]<=('Z'-n) ))
           frase [i]+=n;
   }
   printf("\nCodificada con desplazamiento %d \n",n);
   printf ("%s\n",frase);
   puts("\nY ahora descodificada: ");
   for (i=0;frase[i]!='\0';i++)
       {
           if ((frase [i]<('a'+n) && frase [i]>=('a')) || (frase [i]<('A'+n) && frase [i]>=('A') ))
           frase [i] =frase [i]+26-n;
           else if ((frase [i]>=('a'+n) && frase [i]<=('z') )|| (frase [i]>=('A'+n) && frase [i]<=('Z') ))
               frase [i]-=n;
       }
   printf ("%s\n",frase);
   }

   /***************  :-)   OTRA FORMA  :-)   **********/
   return 0;
}


Con una salida como esta:

Código (cpp) [Seleccionar]

WIKIPEDIA, LA ENCICLOPEDIA LIBRE
   Wikipedia la Enciclopedia Libre f F x X

Y ahora codificada con desplazamiento 6:
COQOVKJOG, RG KTIOIRUVKJOG ROHXK
   Coqovkjog rg Ktioiruvkjog Rohxk l L d D

Y ahora descodificada:
WIKIPEDIA, LA ENCICLOPEDIA LIBRE
   Wikipedia la Enciclopedia Libre f F x X


Introduce una frase:
leosansan Abc Xyz

Indica el desplazamiento (1-25): 6

Codificada con desplazamiento 6
rkuygtygt Ghi Def


Y ahora descodificada:
leosansan Abc Xyz


¡Vamos!, a ver si se animan a plantear códigos diferentes, que sean más ingeniosos y/o eficaces. Ya hay una media propuesta de cypascal usando la operación módulo -ver post anteriores-, aunque está incompleto, ya que le falto el descifrado. ;) ;-) ;)

Saluditos!.
   

cpu2

Y que sucede si en mi cadena tengo algun caracter estilo " @#$*{}", la tabla ascii no es solo el abecedario.

Un saludo.

Royca3

leosansan, Excelente código, Gracias
(LA PROGRAMACIÓN ES MÁGICA  ;D ;D )

pd. Ya inicie a leer unas guías para aprender C

Saludos.
Homo erectus

CCross

#37
Cita de: leosansan en 12 Junio 2013, 16:58 PM
No es el cifrado César, te muestro una salida al código que planteas:
Como ves, en el cifrado se "va más allá" de la z/Z, cuando debería empezar a contar desde la a.

Aqui va una versión mas eficiente

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <ctype.h>

int main()
{
    int i, j, des, a, z;
    char cadena[30] = "";

    printf("Ingrese una cadena: ");
    scanf("%s", cadena);

    printf("Ingrese desplazamiento: ");
    scanf(" %d", &des);

    for(i = 0; cadena[i]!='\0'; i++)
    {
       a = 97;
       if(isupper(cadena[i])) a = 65;
       cadena[i] =((cadena[i]-a+des)%26)+a;
     }
     printf("\nCifrado es: %s \n", cadena);
     
    for(j = 0; cadena[j]!='\0'; j++)
    {
       z = 122;
       if(isupper(cadena[j])) z = 90;
       cadena[j]= ((cadena[j]-z-des)%26)+z;
     }

     printf("\nDecifrado es: %s \n", cadena);

    return 0;
}


Saludos  ::)

Royca3

Son unos programadores grosos!

Sucedía lo mismo de siempre, no mostraba el resultado si no que se cerraba le agregue esto y listo...

     getchar();

getchar();
}

:D eliminando el return 0;

Saludos.
Homo erectus

amchacon

Cita de: Royca3 en 12 Junio 2013, 19:49 PM
Son unos programadores grosos!

Sucedía lo mismo de siempre, no mostraba el resultado si no que se cerraba le agregue esto y listo...

     getchar();

getchar();
}

:D eliminando el return 0;

Saludos.
No elimines el return 0, vas en contra del estándar.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar