Joven hacker sonriendo
Regla de substitución ROT13 en el abecedario, con ejemplo

Cifrando el Abecedario

Solución al reto 121 de CodeEval
El cifrado por sustitución simple, popularmente conocido como ROT13 o cifrado César es uno de los argoritmos más sencillos de cifrado de mensajes utilizado por el mismo Julio Cesár. A pesar de su simplicidad resulta educativo para comprender conceptos y bases de la criptografía.

Cifrado por sustitución

El cifrado por sustitución es uno de los más comunes y más inseguros que existen en criptografía, simplemente se sustituyen cada una de las letras de un texto por otras letras conservando un orden dado de manera que si cambiamos la letra a por la letra m de una palabra del texto, todas las letras a de todas las palabras del texto se transformarán por la letra m. Es un cifrado muy inseguro para textos largos, debido a que la persona que lo quiera descifrar puede inferir las letras originales por la repetición de estas en el texto.

Reto en CodeEval 121

Nos dan como entrada unas líneas de texto ilegibles, las cuales están cifradas por el cifrado por sustitución, nuestra tarea es descifrar estas líneas de texto encontrando las letras originales.

Entrada:

rbc vjnmkf kd yxyqci na rbc zjkfoscdd ew rbc ujllmcp

tc rbkso rbyr ejp mysljylc kd kxveddknmc re jsicpdrysi

de kr kd eoya kw aej icfkici re zjkr

Salida:

the public is amazed by the quickness of the juggler

we think that our language is impossible to understand

so it is okay if you decided to quit

Descifrando:

Se toma la primera palabra del primer texto de la entrada: rbc

Se compara con la primera palabra del primer texto de la salida: the

Se infiere que todas las letras r del texto deben ser sustituidas por t, todas las letras b del texto deben ser sustituidas por h y todas las letras c del texto deben ser sustituidas por e.

Se continúa con las demás palabras sucesivamente, hasta completar el abecedario.

Implementación del código

  • lenguaje bash

  • Creamos dos diccionarios, uno con el abecedario cifrado y otro con el abecedario descifrado

test.py
1
2
3
4
5
while read line || [[ -n "$line" ]]; do
   ENCRYPTED=('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' 'a' ' ');
   DECRYPTED=('h' 'e' 's' 'o' 'c' 'v' 'x' 'd' 'u' 'i'
  'g' 'l' 'b' 'k' 'r' 'z' 't' 'n' 'w' 'j' 'p' 'f' 'm' 'a' 'q' 'y' ' ');
  • Tomamos las letras del texto cifrado (entrada del programa)

1
2
3
4
  len=${#line};
  for ((i=0; i<=len; i++))
  do
    CH=${line:$i:${i+1}};
  • Buscamos la posición de cada una de estas letras en el diccionario del abecedario cifrado y guardamos esta posición

  • Imprimimos (Salida) la letra del diccionario del abecedario descifrado correspondiente a la posición previamente guardada

1
2
3
4
    for k in "${!ENCRYPTED[@]}"; do
      if [[ "${ENCRYPTED[$k]}" = "$CH" ]]; then
      echo -n "${DECRYPTED[$k]}";
           fi

Resolver este reto no ha sido muy díficil debido a que el reto mismo proporcionaba la salida del texto descifrado, convirtiendo el problema en un desafío trivial, pero en la mayoría de los casos la salida descifrada no es proporcionada. Descifrar un cifrado por sustitución sin la salida se convierte en un ensayo de prueba-error, hasta encontrar un texto descifrado lógico, por esto este tipo de cifrados es uno de las inseguros que hay en criptografía, ya que con un simple análisis y tomándose su tiempo se pueden revelar los textos encriptados de manera sencilla, es por esto que normalmente este tipo de encriptación sólo se usa con fines educativos o académicos.


Foto del autor

Alejandro Aguirre Soto

Ingeniero mecatrónico, Escuela de Ingeniería de Antioquia, Maestría en Simulación de sistemas fluidos, Arts et Métiers Paristech, Francia, Java programming specialization, Duke University , USA

Apasionado por el conocimiento, el arte y la ciencia.


Relacionado





Haz un comentario

Estado de los servicios - Términos de Uso