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 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>
}
Condiciones del desafío
📚 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:
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
Cuando finalices la resolución del desafío, envianos un archivo ZIP con todo tu trabajo a través de WeTransfer.
💜 Agradecimientos
Jurados
- ¡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!
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.