Cifrado Cesar o Cifrado por desplazamiento

Iniciado por rush, Noviembre 28, 2017, 04:57:29 PM

Tema anterior - Siguiente tema

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

Noviembre 28, 2017, 04:57:29 PM Ultima modificación: Noviembre 28, 2017, 05:02:51 PM por rush
Bueno hace poco en un No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, 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.

@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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#

//@author rush
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CifradoCesar
{
    public partial class Form1 : Form
    {
        public char[] letras = new char[] { 'a', 'b', 'c', 'd', 'e',
                                          'f', 'g', 'h', 'i', 'j',
                                          'k', 'l', 'm', 'n', 'ñ',
                                          'o', 'p', 'q', 'r', 's',
                                          't', 'u', 'v', 'w', 'x',
                                          'y', 'z'};
        public int value;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox3.Text))
            {
                MessageBox.Show("Desplazamiento obligatorio");
            }
            else if(int.Parse(textBox3.Text) > 10)
            {
                MessageBox.Show("El desplazamiento es entre 1 y 10");
            }
            else
            {
                textBox1.Text = "";
                string text = textBox2.Text;
                textBox1.Text = Cifrar(text);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox3.Text))
            {
                MessageBox.Show("Desplazamiento obligatorio");
            }
            else if (int.Parse(textBox3.Text) > 25)
            {
                MessageBox.Show("El desplazamiento es entre 1 y 10");
            }
            else
            {
                textBox1.Text = "";
                string text = textBox2.Text;
                textBox1.Text = Descifrar(text);
            }
        }

        public string Cifrar(string text)
        {
            value = int.Parse(textBox3.Text);
            char[] text1 = text.ToCharArray();
            string[] cifrado = new string[text.Length];
            for (int i = 0; i < text1.Length; i++)
            {
                for (int j = 0; j < letras.Length; j++)
                {
                    if (string.Equals(text1[i], letras[j]))
                    {
                        if (j == 26)
                        {
                            cifrado[i] = letras[-1 + value].ToString();
                        }
                        else
                        {
                            if ((j + value) > 26)
                            {
                                int aux = j + value - 27;
                                cifrado[i] = letras[aux].ToString();
                            }
                            else
                            {
                                cifrado[i] = letras[j + value].ToString();
                            }
                        }
                    }
                    else if (string.Equals(' ', text1[i]))
                    {
                        cifrado[i] = text1[i].ToString();
                    }
                }
            }
            return String.Join("", cifrado);
        }

        public string Descifrar(string text)
        {
            value = int.Parse(textBox3.Text);
            char[] text1 = text.ToCharArray();
            string[] cifrado = new string[text.Length];
            for (int i = 0; i < text1.Length; i++)
            {
                for (int j = 0; j < letras.Length; j++)
                {
                    if (string.Equals(text1[i], letras[j]))
                    {
                        if (j == 0)
                        {
                            cifrado[i] = letras[27 - value].ToString();
                        }
                        else
                        {
                            if ((j - value) < 0)
                            {
                                int aux = j - value + 27;
                                cifrado[i] = letras[aux].ToString();
                            }
                            else
                            {
                                cifrado[i] = letras[j - value].ToString();
                            }
                        }
                    }
                    else if (string.Equals(' ', text1[i]))
                    {
                        cifrado[i] = text1[i].ToString();
                    }
                }
            }
            return String.Join("", cifrado);
        }
    }
}



@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!!!
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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!

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.
RollthBuen hacker mejor No tienes permitido ver los links. Registrarse o Entrar a mi cuenta/No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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!

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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.
RollthBuen hacker mejor No tienes permitido ver los links. Registrarse o Entrar a mi cuenta/No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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!