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" }
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.
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.
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.
El servicio debe proponer dos endpoints, uno para cifrar y otro para cifrar. Ambos deberan procesar POST
s 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>
}
⛔ 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.
Podrás utilizar cualquier herramienta de búsqueda que necesites (amamos buscar en Google y leer Stack Overflow <3).
Tendrás 1 hora para resolver el desafío.
Hacé un fork de este repo:
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.
Cuando finalices la resolución del desafío, envianos un archivo ZIP con todo tu trabajo a través de WeTransfer.
- ¡Gracias a Gonzalo Pozzo y Magalí Domínguez por ser nuestros jurados!
- ¡Un agradecimiento especial a Juani Gallo, el jurado invitado de esta edición!
¡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!
DevOff Argentina es un proyecto ideado por Aldana Denise, con el apoyo de CoDeAr.