Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Cifrado Cesar o Cifrado por desplazamiento

  • 5 Respuestas
  • 5001 Vistas

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

Desconectado rush

  • *
  • Underc0der
  • Mensajes: 383
  • Actividad:
    0%
  • Reputación 7
    • Ver Perfil
  • Skype: iruxh1773
« en: Noviembre 28, 2017, 04:57:29 pm »
Bueno hace poco en un viernes negro, pusieron un reto de cifrado por desplazamiento, este ejercicio creo que no es tan complicado, así que tuve un tiempo libre en el trabajo y me puse a realizar el ejercicio, puede que no sea el código mas optimo o el deber ser de la programación, pero creo que es funcional.

@Lechugo fue quien explico este reto, para saber mas sobre el tema pueden ir a dicho post y verificar el reto1.

El código es el siguiente:

Código: C
  1. //@author rush
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11.  
  12. namespace CifradoCesar
  13. {
  14.     public partial class Form1 : Form
  15.     {
  16.         public char[] letras = new char[] { 'a', 'b', 'c', 'd', 'e',
  17.                                           'f', 'g', 'h', 'i', 'j',
  18.                                           'k', 'l', 'm', 'n', 'ñ',
  19.                                           'o', 'p', 'q', 'r', 's',
  20.                                           't', 'u', 'v', 'w', 'x',
  21.                                           'y', 'z'};
  22.         public int value;
  23.         public Form1()
  24.         {
  25.             InitializeComponent();
  26.         }
  27.  
  28.         private void button1_Click(object sender, EventArgs e)
  29.         {
  30.             if (string.IsNullOrEmpty(textBox3.Text))
  31.             {
  32.                 MessageBox.Show("Desplazamiento obligatorio");
  33.             }
  34.             else if(int.Parse(textBox3.Text) > 10)
  35.             {
  36.                 MessageBox.Show("El desplazamiento es entre 1 y 10");
  37.             }
  38.             else
  39.             {
  40.                 textBox1.Text = "";
  41.                 string text = textBox2.Text;
  42.                 textBox1.Text = Cifrar(text);
  43.             }
  44.         }
  45.  
  46.         private void button2_Click(object sender, EventArgs e)
  47.         {
  48.             if (string.IsNullOrEmpty(textBox3.Text))
  49.             {
  50.                 MessageBox.Show("Desplazamiento obligatorio");
  51.             }
  52.             else if (int.Parse(textBox3.Text) > 25)
  53.             {
  54.                 MessageBox.Show("El desplazamiento es entre 1 y 10");
  55.             }
  56.             else
  57.             {
  58.                 textBox1.Text = "";
  59.                 string text = textBox2.Text;
  60.                 textBox1.Text = Descifrar(text);
  61.             }
  62.         }
  63.  
  64.         public string Cifrar(string text)
  65.         {
  66.             value = int.Parse(textBox3.Text);
  67.             char[] text1 = text.ToCharArray();
  68.             string[] cifrado = new string[text.Length];
  69.             for (int i = 0; i < text1.Length; i++)
  70.             {
  71.                 for (int j = 0; j < letras.Length; j++)
  72.                 {
  73.                     if (string.Equals(text1[i], letras[j]))
  74.                     {
  75.                         if (j == 26)
  76.                         {
  77.                             cifrado[i] = letras[-1 + value].ToString();
  78.                         }
  79.                         else
  80.                         {
  81.                             if ((j + value) > 26)
  82.                             {
  83.                                 int aux = j + value - 27;
  84.                                 cifrado[i] = letras[aux].ToString();
  85.                             }
  86.                             else
  87.                             {
  88.                                 cifrado[i] = letras[j + value].ToString();
  89.                             }
  90.                         }
  91.                     }
  92.                     else if (string.Equals(' ', text1[i]))
  93.                     {
  94.                         cifrado[i] = text1[i].ToString();
  95.                     }
  96.                 }
  97.             }
  98.             return String.Join("", cifrado);
  99.         }
  100.  
  101.         public string Descifrar(string text)
  102.         {
  103.             value = int.Parse(textBox3.Text);
  104.             char[] text1 = text.ToCharArray();
  105.             string[] cifrado = new string[text.Length];
  106.             for (int i = 0; i < text1.Length; i++)
  107.             {
  108.                 for (int j = 0; j < letras.Length; j++)
  109.                 {
  110.                     if (string.Equals(text1[i], letras[j]))
  111.                     {
  112.                         if (j == 0)
  113.                         {
  114.                             cifrado[i] = letras[27 - value].ToString();
  115.                         }
  116.                         else
  117.                         {
  118.                             if ((j - value) < 0)
  119.                             {
  120.                                 int aux = j - value + 27;
  121.                                 cifrado[i] = letras[aux].ToString();
  122.                             }
  123.                             else
  124.                             {
  125.                                 cifrado[i] = letras[j - value].ToString();
  126.                             }
  127.                         }
  128.                     }
  129.                     else if (string.Equals(' ', text1[i]))
  130.                     {
  131.                         cifrado[i] = text1[i].ToString();
  132.                     }
  133.                 }
  134.             }
  135.             return String.Join("", cifrado);
  136.         }
  137.     }
  138. }
  139.  
  140.  

@Lechugo, dice que la rotación que utilizo fue 22, pero yo encontré que con una rotación de 5 se logra descifrar, ya que para descifrar se hace de manera contraria o inversa.

Acá el diseño:



Espero les sirva.

Si encuentran algún error, se los agradecería  ;D

Saludos!!!
« Última modificación: Noviembre 28, 2017, 05:02:51 pm por rush »

Desconectado K A I L

  • *
  • Moderador
  • Mensajes: 143
  • Actividad:
    0%
  • Reputación 3
    • Ver Perfil
« Respuesta #1 en: Noviembre 29, 2017, 07:53:09 am »
Buenas colega!

Quizas sea un problema de concepto mio o tuyo, pero tengo entendido que para cifrar siempre sumas lugares hacia la derecha y para descifrar restas lugares.

No logro ver por ningun lado, que se pueda hacer de la forma inversa como tu dices, si consultamos la Wiki https://es.wikipedia.org/wiki/Cifrado_C%C3%A9sar nos dice que "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".

Si puedes aclarar la fuente de lo que dices me seria muy util para quitarme la duda.

Gracias y saludos!

Marcado como mejor respuesta por: rush en Noviembre 29, 2017, 09:35:12 pm

Desconectado rollth

  • *
  • Underc0der
  • Mensajes: 876
  • Actividad:
    0%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #2 en: Noviembre 29, 2017, 01:53:57 pm »
El problema de concepto es tuyo, si tu tienes la primera letra, que sin cifrar es una 'l', y le aplicas una clave 5 el resultado es una 'p', como decía el reto.

l -> m -> n -> ñ -> o -> p
  1      2      3     4      5 

Si lo haces de la forma inversa, que es como se debería hacer para descifrar, la clave que se utilizaría será la 5 y llegaríamos al mismo resultado.

p -> o -> ñ -> n -> m -> l
   1     2      3     4       5

La cuestión es que tu al usar la clave 22, das la vuelta al diccionario y vuelves al texto descifrad. (22+5 = 27).

Espero que se haya entendido.

Saludos.

Desconectado K A I L

  • *
  • Moderador
  • Mensajes: 143
  • Actividad:
    0%
  • Reputación 3
    • Ver Perfil
« Respuesta #3 en: Noviembre 29, 2017, 05:16:44 pm »
El problema de concepto es tuyo, si tu tienes la primera letra, que sin cifrar es una 'l', y le aplicas una clave 5 el resultado es una 'p', como decía el reto.

l -> m -> n -> ñ -> o -> p
  1      2      3     4      5 

Si lo haces de la forma inversa, que es como se debería hacer para descifrar, la clave que se utilizaría será la 5 y llegaríamos al mismo resultado.

p -> o -> ñ -> n -> m -> l
   1     2      3     4       5

La cuestión es que tu al usar la clave 22, das la vuelta al diccionario y vuelves al texto descifrad. (22+5 = 27).

Espero que se haya entendido.

Saludos.

Perdón pero sigo sin entender, a ver en tu ejemplo entonces esta bien estás CIFRANDO con ROT5, pero no se puede DESCIFRAR con ROT (-5), lo dice claramente en la wiki que siempre vas hacia adelante en el alfabeto, por lo que utilizas el 22.

Y en el reto se pedía descifrar por lo que 22 sería el numero acertado, (-5) no está en las posibilidades, y hablar que se descifro con ROT5 no sería correcto.

Saludos y espero se entienda mi punto de vista! Y no ofenda a nadie obvio, todos tratamos de quitarnos la duda!

Desconectado rollth

  • *
  • Underc0der
  • Mensajes: 876
  • Actividad:
    0%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #4 en: Noviembre 29, 2017, 08:19:17 pm »
El problema de concepto es tuyo, si tu tienes la primera letra, que sin cifrar es una 'l', y le aplicas una clave 5 el resultado es una 'p', como decía el reto.

l -> m -> n -> ñ -> o -> p
  1      2      3     4      5 

Si lo haces de la forma inversa, que es como se debería hacer para descifrar, la clave que se utilizaría será la 5 y llegaríamos al mismo resultado.

p -> o -> ñ -> n -> m -> l
   1     2      3     4       5

La cuestión es que tu al usar la clave 22, das la vuelta al diccionario y vuelves al texto descifrad. (22+5 = 27).

Espero que se haya entendido.

Saludos.

Perdón pero sigo sin entender, a ver en tu ejemplo entonces esta bien estás CIFRANDO con ROT5, pero no se puede DESCIFRAR con ROT (-5), lo dice claramente en la wiki que siempre vas hacia adelante en el alfabeto, por lo que utilizas el 22.

Y en el reto se pedía descifrar por lo que 22 sería el numero acertado, (-5) no está en las posibilidades, y hablar que se descifro con ROT5 no sería correcto.

Saludos y espero se entienda mi punto de vista! Y no ofenda a nadie obvio, todos tratamos de quitarnos la duda!

La cuestión es que tu punto de vista no está bien, en cifrado cesar se cifra y se descifra con la misma clave, solo que al descifrar se hace de la manera inversa.

Saludos.

Desconectado K A I L

  • *
  • Moderador
  • Mensajes: 143
  • Actividad:
    0%
  • Reputación 3
    • Ver Perfil
« Respuesta #5 en: Noviembre 29, 2017, 09:02:55 pm »
El problema de concepto es tuyo, si tu tienes la primera letra, que sin cifrar es una 'l', y le aplicas una clave 5 el resultado es una 'p', como decía el reto.

l -> m -> n -> ñ -> o -> p
  1      2      3     4      5 

Si lo haces de la forma inversa, que es como se debería hacer para descifrar, la clave que se utilizaría será la 5 y llegaríamos al mismo resultado.

p -> o -> ñ -> n -> m -> l
   1     2      3     4       5

La cuestión es que tu al usar la clave 22, das la vuelta al diccionario y vuelves al texto descifrad. (22+5 = 27).

Espero que se haya entendido.

Saludos.

Perdón pero sigo sin entender, a ver en tu ejemplo entonces esta bien estás CIFRANDO con ROT5, pero no se puede DESCIFRAR con ROT (-5), lo dice claramente en la wiki que siempre vas hacia adelante en el alfabeto, por lo que utilizas el 22.

Y en el reto se pedía descifrar por lo que 22 sería el numero acertado, (-5) no está en las posibilidades, y hablar que se descifro con ROT5 no sería correcto.

Saludos y espero se entienda mi punto de vista! Y no ofenda a nadie obvio, todos tratamos de quitarnos la duda!

La cuestión es que tu punto de vista no está bien, en cifrado cesar se cifra y se descifra con la misma clave, solo que al descifrar se hace de la manera inversa.

Saludos.

Bien perfecto ahora si me quedo claro, entonces la respuesta correcta si es ROT5.

Saludos rollth gracias por aclararme la duda!

 

¿Te gustó el post? COMPARTILO!