- Cifrado de Vigenere
- Objetivo
- Instrucciones
- Entregables
- Indicadores de cumplimiento
- Flujo de trabajo
- Tecnologías
- Requerimientos funcionales
- Requerimientos no funcionales
- Recursos
- Organización. Individual
- Modo. Síncrono
- Estrategia. Programación individual
- Duración. 5 días
- Dedicación. 1.5 horas diarias (7.5 horas total)
Esta actividad tiene como objetivos:
- Practicar la semántica y sintaxis de Ruby: Desarrollar habilidades sólidas en el uso correcto de la sintaxis y las convenciones de nomenclatura de Ruby, así como comprender y aplicar adecuadamente los conceptos semánticos del lenguaje.
- Utilizar RuboCop para mejorar la calidad del código Ruby: Familiarizarse con la herramienta RuboCop y utilizarla como guía para garantizar la consistencia y legibilidad del código, siguiendo las mejores prácticas y convenciones de estilo de Ruby.
- Aplicar principios de programación orientada a objetos en Ruby: Comprender y aplicar los conceptos fundamentales de la programación orientada a objetos (POO) en Ruby, como encapsulación, herencia, polimorfismo y abstracción, para crear código modular, reutilizable y fácil de mantener.
- Emplear el polimorfismo como una solución mejor a las banderas booleanas: Practicar el uso del polimorfismo en situaciones donde se utilizan banderas booleanas, aprovechando la capacidad de los objetos de comportarse de diferentes formas según su tipo, lo que promueve un diseño más limpio, extensible y fácil de entender.
- Practicar el desarrollo basado en pruebas con Ruby, RSpec y/o MiniTest: Adquirir experiencia en el desarrollo de pruebas unitarias y funcionales utilizando frameworks populares como RSpec y/o MiniTest, para garantizar la calidad y robustez del código, así como facilitar la detección temprana de errores y el mantenimiento a largo plazo.
- Introducir los principios SOLID: Familiarizarse con los principios SOLID (Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation, Dependency Inversion) y aplicarlos en el diseño y desarrollo de software, buscando lograr un código más modular, flexible y fácil de mantener.
- Utilizando Ruby, se desarrollará una solución completa para el algoritmo que se explica en la sección de requerimientos funcionales.
- Se utilizará RuboCop para garantizar la consistencia y legibilidad del código, siguiendo las mejores prácticas y convenciones de estilo de Ruby.
- La solución deberá seguir el enfoque orientado a objetos.
- Se pondrá en práctica el concepto de desarrollo basado en pruebas utilizando RSpec o MiniTest.
- Se aplicará el concepto de commits significativos.
- Código Ruby funcional y completo en la rama principal de este repositorio.
- Implementación orientada a objetos que refleje los principios de la programación orientada a objetos en Ruby.
- Reemplazo de banderas booleanas por polimorfismo en situaciones pertinentes, mejorando el diseño del código.
- Archivo de configuración de RuboCop aplicado al proyecto para garantizar la calidad del código.
- Conjunto completo de pruebas unitarias y funcionales desarrolladas con RSpec y/o MiniTest para verificar el correcto funcionamiento del código.
- Archivo README.md actualizado con las instrucciones de ejecución y cualquier otra información relevante.
-
Sintaxis y semántica de Ruby:
- El código debe estar escrito utilizando la sintaxis correcta de Ruby.
- Se deben utilizar las convenciones de nomenclatura adecuadas de Ruby.
-
Uso de RuboCop:
- Se debe utilizar RuboCop como herramienta de análisis estático para mejorar la calidad del código Ruby.
-
Programación orientada a objetos:
- Deben aplicarse los conceptos fundamentales de la programación orientada a objetos, como encapsulación, herencia, polimorfismo y abstracción.
- El código debe ser modular, reutilizable y fácil de mantener.
-
Uso de polimorfismo en lugar de banderas booleanas:
- Deben identificarse situaciones en las que se utilizan banderas booleanas y reemplazarlas por polimorfismo.
-
Desarrollo basado en pruebas:
- Se deben desarrollar pruebas unitarias y funcionales utilizando RSpec y/o MiniTest.
- Las pruebas deben garantizar la calidad y robustez del código.
-
Aplicación de los principios SOLID:
- Deben aplicarse los principios SOLID (Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation, Dependency Inversion) en el diseño y desarrollo del software.
- El código debe ser modular, flexible y fácil de mantener.
A continuación se presenta un flujo de trabajo sugerido para el desarrollo del algoritmo. Si se decide seguir otro enfoque, es válido siempre y cuando se logre el mismo resultado:
- Comienza a codificar la solución del algoritmo centrándote en establecer una base sólida. Utiliza el enfoque orientado a objetos y recuerda que este ejercicio es principalmente para aprender y familiarizarte con Ruby.
- Continúa desarrollando la solución, esta vez reemplazando las banderas booleanas por polimorfismo en situaciones relevantes. Esto mejorará el diseño del código y te permitirá explorar las capacidades flexibles de Ruby.
- Sigue avanzando en el desarrollo de la solución y asegúrate de incorporar el uso de RuboCop. Utiliza esta herramienta para mantener la consistencia y la legibilidad del código, siguiendo las mejores prácticas y convenciones de estilo de Ruby.
- Continúa aprendiendo y experimentando con Ruby. Recuerda que no es necesario completar la solución en este momento, ya que el objetivo principal es el aprendizaje.
- Llegó el momento de finalizar la solución. Asegúrate de incorporar pruebas unitarias y funcionales utilizando frameworks populares como RSpec y/o MiniTest. Estas pruebas garantizarán la calidad y robustez del código, permitiendo la detección temprana de errores y facilitando el mantenimiento a largo plazo.
- Enfócate en escribir métodos pequeños y con un solo propósito. Esto mejorará la legibilidad y el mantenimiento del código.
- Además, aprovecha este tiempo para estudiar y aplicar los principios SOLID en tu código, buscando lograr un diseño modular y flexible.
Recuerda que el objetivo principal de este flujo de trabajo es aprender y mejorar tus habilidades en Ruby. Lo importante es el proceso de aprendizaje y la adquisición de nuevos conocimientos.
El cifrado de Vigenère es un tipo de cifrado polialfabético, lo que significa que utiliza diferentes alfabetos para cifrar un mensaje. El algoritmo se basa en una tabla conocida como la tabla de Vigenère o tabla de coincidencias, que es esencial para su implementación.
A continuación tienes la explicación paso a paso del cifrado de Vigenère con dos palabras diferentes como ejemplos:
-
Definir el mensaje original y la clave de cifrado:
- El mensaje original es el texto que se desea cifrar.
- La clave de cifrado es una palabra o frase que se utilizará para cifrar el mensaje.
Ejemplo 1:
- Mensaje original: “HOLA”
- Clave de cifrado: “SECRETO”
Ejemplo 2:
- Mensaje original: “RUBY”
- Clave de cifrado: “COD”
-
Convertir el mensaje original y la clave a valores numéricos:
- Asignar un número a cada letra del mensaje original y la clave según su posición en el alfabeto. Por ejemplo, A=0, B=1, C=2, etc.
Ejemplo 1:
- Mensaje original: H=7, O=15, L=11, A=0
- Clave de cifrado: S=19, E=4, C=2, R=18, E=4, T=20, O=15
Ejemplo 2:
- Mensaje original: R=18, U=21, B=1, Y=25
- Clave de cifrado: C=2, O=15, D=3
-
Repetir la clave para que tenga la misma longitud que el mensaje original:
- Repetir la clave hasta alcanzar o superar la longitud del mensaje original. Esto se hace para asegurar que haya suficientes caracteres de la clave para cifrar cada letra del mensaje original.
Ejemplo 1:
-
Mensaje original: HOLA
-
Clave repetida: SECRETO
-
En este primer ejemplo no se ocupa repetir la clave pues la longitud de la clave es mayor la del mensaje original
Ejemplo 2:
-
Mensaje original: RUBY
-
Clave repetida: CODC
-
En este ejemplo, si es necesario repetir la clave, por que las longitudes son iguales, por esto se agrega la letra C al final
-
Cifrar el mensaje original:
- Para cada letra del mensaje original, realizar los siguientes pasos:
- Obtener el valor numérico de la letra del mensaje original.
- Obtener el valor numérico correspondiente de la letra de la clave repetida.
- Sumar los valores numéricos utilizando aritmética modular para obtener el valor numérico cifrado.
- Convertir el valor numérico cifrado en una letra utilizando el alfabeto.
Ejemplo 1:
- Letra 1: H (valor numérico: 7) + S (valor numérico: 19) = Z (valor numérico cifrado: 26) -> Letra cifrada: Z
- Letra 2: O (valor numérico: 15) + E (valor numérico: 4) = S (valor numérico cifrado: 19) -> Letra cifrada: S
- Letra 3: L (valor numérico: 11) + C (valor numérico: 2) = N (valor numérico cifrado: 13) -> Letra cifrada: N
- Letra 4: A (valor numérico: 0) + R (valor numérico: 18) = R (valor numérico cifrado: 18) -> Letra cifrada: R
Ejemplo 2:
- Letra 1: R (valor numérico: 18) + C (valor numérico: 2) = T (valor numérico cifrado: 20) -> Letra cifrada: T
- Letra 2: U (valor numérico: 21) + O (valor numérico: 15) = J (valor numérico cifrado: 36-26) -> Letra cifrada: J
- Letra 3: B (valor numérico: 1) + D (valor numérico: 3) = E (valor numérico cifrado: 4) -> Letra cifrada: E
- Letra 4: Y (valor numérico: 25) + C (valor numérico: 2) = A (valor numérico cifrado: 27-26) -> Letra cifrada: A
- Para cada letra del mensaje original, realizar los siguientes pasos:
-
Obtener el mensaje cifrado:
- Concatenar las letras cifradas para formar el mensaje cifrado final.
Ejemplo 1:
- Mensaje cifrado: ZSNR
Ejemplo 2:
- Mensaje cifrado: TJEA
Este es el proceso básico del algoritmo de cifrado de Vigenère. Para implementarlo en un programa, necesitarías funciones para convertir letras en valores numéricos y viceversa, así como la tabla de Vigenère para encontrar las coincidencias. Puedes utilizar ciclos y operaciones matemáticas para realizar las sumas y cálculos necesarios.
Recuerda que el cifrado de Vigenère es un cifrado clásico y no se considera seguro en la actualidad. Sin embargo, es un buen ejercicio
Tabla de Vigenère
-
Calidad:
- Aplicar el estilo de código definido por la comunidad, utilizando RuboCop como herramienta de apoyo.
- Incluir pruebas unitarias para garantizar la calidad del código.
-
Desempeño y escalabilidad:
- Permitir la ejecución desde la línea de comandos y mostrar la salida en la consola de manera eficiente y rápida.
-
Código fuente:
- Desarrollar una solución orientada a objetos, siguiendo los principios de la programación orientada a objetos (POO).
- Escribir métodos pequeños y con un solo propósito para mejorar la legibilidad y el mantenimiento del código.
- Aplicar los principios SOLID para lograr un diseño modular, flexible y de fácil extensibilidad.