Cifrado Cesar o Cifrado por desplazamiento

  • 5 Respuestas
  • 6962 Vistas

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado rush

  • *
  • Underc0der
  • Mensajes: 383
  • Actividad:
    0%
  • Reputación 7
  • Skype: iruxh1773
    • Ver Perfil

Cifrado Cesar o Cifrado por desplazamiento

  • en: Noviembre 28, 2017, 04:57:29 pm
Bueno hace poco en un You are not allowed to view links. Register or Login, 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.

@You are not allowed to view links. Register or Login 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 »
You are not allowed to view links. Register or Login


Desconectado K A I L

  • *
  • Ex-Staff
  • *****
  • Mensajes: 163
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil

Re:Cifrado Cesar o Cifrado por desplazamiento

  • 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 You are not allowed to view links. Register or Login 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!

Marked as best answer by rush en Noviembre 29, 2017, 09:35:12 pm

Desconectado rollth

  • *
  • Ex-Staff
  • *****
  • Mensajes: 876
  • Actividad:
    0%
  • Reputación 16
  • El conocimiento es libre.
  • Twitter: @RoloMijan
    • Ver Perfil
    • Whateversec
    • Email

Re:Cifrado Cesar o Cifrado por desplazamiento

  • 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.

Rollth
Buen hacker mejor persona.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Desconectado K A I L

  • *
  • Ex-Staff
  • *****
  • Mensajes: 163
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil

Re:Cifrado Cesar o Cifrado por desplazamiento

  • en: Noviembre 29, 2017, 05:16:44 pm
You are not allowed to view links. Register or Login
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

  • *
  • Ex-Staff
  • *****
  • Mensajes: 876
  • Actividad:
    0%
  • Reputación 16
  • El conocimiento es libre.
  • Twitter: @RoloMijan
    • Ver Perfil
    • Whateversec
    • Email

Re:Cifrado Cesar o Cifrado por desplazamiento

  • en: Noviembre 29, 2017, 08:19:17 pm
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
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.

Rollth
Buen hacker mejor persona.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Desconectado K A I L

  • *
  • Ex-Staff
  • *****
  • Mensajes: 163
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil

Re:Cifrado Cesar o Cifrado por desplazamiento

  • en: Noviembre 29, 2017, 09:02:55 pm
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
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!