/DevOff-Desafio-2

Punto de partida para el desafío de DevOff Argentina del 02/08/2020.

Primary LanguageJavaScript

Desafio resuelto por @lauritula

Requisitos previos:

  • Herramienta para envio de peticiones HTTP REST (Postman o similar)
  • Node.js, version 12 o superior
  • Express (ejecutar npm i al iniciar)

Ubicados en la carpeta raíz, abrimos la consola y ejecutamos: node app.js

Desde Postman o similar, ejecutamos:

POST /cifrar HTTP/1.1 Host: localhost:3000 Content-Type: application/json Cache-Control: no-cache Postman-Token: b3fcc8fd-9b69-4c3d-4fd9-1eecef24ed49 { "vueltas": 4, "mensaje": "Este es un mensaje de prueba" }

POST /descifrar HTTP/1.1 Host: localhost:3000 Content-Type: application/json Cache-Control: no-cache Postman-Token: 8472d738-68cd-dda6-121d-a15fa57baf06 { "vueltas": 4, "mensaje":"E uejeusenne ets s pbe madra" }

Desafío 2 - 02/08/2020

Vamos a implementar una versión moderna de un instrumento milenario que representa uno de los primeros sistemas de cifrado de la historia de la humanidad: una escítala. Construiremos una escítala en forma de REST API para cifrar y descifrar mensajes.

Un poco de historia

La escítala es un mecanismo de cifrado que surje en Esparta como forma sencilla para generar mensajes secretos, compartirlos y descifrarlos con la misma facilidad.

El método consistía en utilizar una vara de cierto espesor, alrededor de la cual una cinta de papiro u algún otro material para luego escribir en ella el mensaje de manera horizontal, siguiendo la dirección de la vara.

Al recibir el mensaje, el receptor poseía una vara con el mismo espesor que aquella utilizada para generar el mensaje, por lo que el proceso de descifrado consisitía en enrollar la cinta en la vara y leer el mensaje.

El algoritmo

A la hora de cifrar un mensaje con este mecanismo podemos pensar a la escitala como una matriz rectangular de la cual sabemos una de sus medidas, por ejemplo, su longitud dada la cantidad de vueltas que la cinta da sobre la vara. Para simplificar, llamaremos a este parámetro L.

En base a nuestro parámetro L, generamos una matriz de dimensión N x L, donde N se deriva a partir de L y la longitud del mensaje. Procedemos a rellenar la matriz de manera longitudinal, saltando a una nueva fila a medida que se completa la anterior, hasta haber agotado el mensaje. A continuación, procedemos a transponer la matriz y recuperar el texto de manera longitudinal, manteniendo espacios si los hubiera.

Por ejemplo, dado el texto Devoff se puso ATR y una longitud de 4, la matriz inicial nos quedaría de la siguiente manera:

| D | e | v | o |
| f | f |   | s |
| e |   | p | u |
| s | o |   | A |
| T | R |   |   |

Que una vez transpuesto quedaría:

| D | f | e | s | T |
| e | f |   | o | R |
| v |   | p |   |   |
| o | s | u | A |   |

Por lo que nuestro mensaje cifrado sería DfesTef oRv p osuA.

Para descifrar el mensaje, el proceso sería el mismo pero a la inversa: arrancamos con una matriz de dimensiones L x N, siguiendo la misma lógica en la que N se calcula en base al parámetro L y la longitud del mensaje.

Siguiendo la misma metodología se rellena la matríz, se transpone la misma y se recupera el texto de manera longitudinal respetando espacios.

La API

El servicio debe proponer dos endpoints, uno para cifrar y otro para cifrar. Ambos deberan procesar POSTs que contendrán un cuerpo formado en JSON con el mensaje y la cantidad de "vueltas" que se le debe dar al mensaje en la escítala:

{
  "vueltas": <number>,
  "mensaje": <string>
}

y deberán devolver un JSON con el mensaje cifrado/descifrado con el siguiente formato:

{
  "mensaje": <string>
}

Condiciones del desafío

⛔ El algoritmo de cifrado y descifrado no puede utilizar ninguna dependencia externa.

✅ El servidor de la API deberá soportar requests desde dominios que no sean localhost.

✅ Podrás incorporar dependencias para levantar el servidor (ej: si utilizas Node, podrás instalar Express).

✅ Podrás utilizar cualquier lenguaje de programación que tenga un módulo HTTP disponible y esté soportado en Repl.it.

📚 Herramientas de consulta

Podrás utilizar cualquier herramienta de búsqueda que necesites (amamos buscar en Google y leer Stack Overflow <3).

⏳ Tiempo

Tendrás 1 hora para resolver el desafío.

🤔 ¿Cómo presento mi código?

Si tenés una cuenta en GitHub

Hacé un fork de este repo:

Presionar el botón Fork, situado al comienzo de la página

Cloná tu fork, reemplazando [TU_ALIAS] con el nombre de tu cuenta de GitHub. Podés clonarlo utilizando la consola:

git clone https://github.com/[TU_ALIAS]/DevOff-Desafio-2

También podés utilizar GitHub Desktop, tu IDE favorito, lo que gustes.

Cuando finalices la resolución del desafío, no olvides subir todos tus cambios usando git push o el equivalente que ofrezca tu cliente de Git. Envianos por el chat de la transmisión o por DM a la cuenta de Twitter de DevOff Argentina el link a tu repositorio.

Si no tenés una cuenta en GitHub

Podés hacer clic aquí y mágicamente se descargará un archivo comprimido con todo lo que contiene este repositorio.

Cuando finalices la resolución del desafío, envianos un archivo ZIP con todo tu trabajo a través de WeTransfer.

💜 Agradecimientos

Jurados

Organizaciones aliadas

¡Gracias a Migue Moyano, Joel A. Villarreal Bertoldi y Agustín Carrasco del equipo de CoDeAr por dar una mano para que este proyecto sea posible!

Créditos

DevOff Argentina es un proyecto ideado por Aldana Denise, con el apoyo de CoDeAr.

¡Muchos éxitos y a codear!