04 Enero 2019
Como desencriptar un texto usando análisis de frecuencia
Recientemente encontre una oferta laboral en la que como proceso de preselección pedía desencriptar el siguiente texto y explicar el procedimiento realizado.
ΣΦΨΞΔλΨΔΛΣΦΔλΨξΔϗΞΔΦΨΞϑλΨΛΣΘϑΞϗΦϑλΨΣΞΨλϑΞΨζβΣφΔΨΣΦΨΣΞΨξΛϗ ΞΞϑΨϖΣΞΨΠΣϖΛΣφΔΞΨΩΨΠΛΣΦϖϗϖϑΨΔΨΞΔΨΘΔφϗΔΨϖΣΨΞϑλΨΓΔΘϗΦϑλΨΣΞΨ ΔΛΛϗΣΛϑΨαΔΨΣΞΨΔΛΛϗΣΛϑΨαΔΨΣλΨξΔΦϖΣΛΔΨϖΣΨΦϗΣξΞΔΨλβΨΠϑΦΓΡϑΨΔ ΞΨαϗΣΦμϑΨΞϑΨλΔΞβϖΔΦΨΞΔλΨεΞΔβμΔλΨϖΣΞΨΠΔζϑΦΔΞΨΩΨΔΦϗΘΔΦϖϑΨΞΔ ΨμΛϑΠΔΨΠΔΛΨΣλϑλΨΓΣΛΛϑλΨΣΞΨΔΛΛϗΣΛϑΨαΔΨΣΞΨΔΛΛϗΣΛϑΨαΔΨΞΔλΨΠΣ ΦΔλΨΩΨΞΔλΨαΔηβϗμΔλΨλΣΨαΔΦΨΠΔΛΨΞΔΨΘϗλΘΔΨλΣΦϖΔΨΞΔλΨΠΣΦΔλΨλϑ ΦΨϖΣΨΦϑλϑμΛϑλΨΞΔλΨαΔηβϗμΔλΨλϑΦΨΔζΣΦΔλ
Hace poco también leí el libro ‘Los códigos secretos’ de Simon Singh, donde cuenta toda la historia de la criptografía y sus usos, muy bueno y lo súper recomiendo.
Así que pensé que sería algo interesante para hacer, me arremangue la camisa y comencé.
Tabla de contenidos
En este punto sabemos muy poco asi que vamos a suponer lo siguiente y ver hacia donde nos lleva
Que se utilizó una de las encriptaciones más simple e históricas, llamada cifrado clásico más específicamente un subconjunto de éste, llamado cifrado por sustitución.
En un cifrado por sustitución, las letras (o grupos de letras) son sistemáticamente reemplazadas en el mensaje por otras letras (o grupos de letras).
Para poder romper la encriptación vamos a utilizar el método análisis de frecuencia.
El análisis de frecuencias está basado en el hecho que, dado un texto, ciertas letras o combinaciones de letras aparecen más a menudo que otras, existiendo distintas frecuencias para ellas. Por ejemplo, en español la letra A y E son muy comunes, mientras que la K y W son muy raras.
Mediante un pequeño programa escrito en python vemos los diferentes signos utilizados, y la cantidad de uso de cada uno de ellos
from collections import Counter
text = "ΣΦΨΞΔλΨΔΛΣΦΔλΨξΔϗΞΔΦΨΞϑλΨΛΣΘϑΞϗΦϑλΨΣΞΨλϑΞΨζβΣφΔΨΣΦΨΣΞΨξΛϗΞΞϑΨϖΣΞΨΠΣϖΛΣφΔΞΨΩΨΠΛΣΦϖϗϖϑΨΔΨΞΔΨΘΔφϗΔΨϖΣΨΞϑλΨΓΔΘϗΦϑλΨΣΞΨΔΛΛϗΣΛϑΨαΔΨΣΞΨΔΛΛϗΣΛϑΨαΔΨΣλΨξΔΦϖΣΛΔΨϖΣΨΦϗΣξΞΔΨλβΨΠϑΦΓΡϑΨΔΞΨαϗΣΦμϑΨΞϑΨλΔΞβϖΔΦΨΞΔλΨεΞΔβμΔλΨϖΣΞΨΠΔζϑΦΔΞΨΩΨΔΦϗΘΔΦϖϑΨΞΔΨμΛϑΠΔΨΠΔΛΨΣλϑλΨΓΣΛΛϑλΨΣΞΨΔΛΛϗΣΛϑΨαΔΨΣΞΨΔΛΛϗΣΛϑΨαΔΨΞΔλΨΠΣΦΔλΨΩΨΞΔλΨαΔηβϗμΔλΨλΣΨαΔΦΨΠΔΛΨΞΔΨΘϗλΘΔΨλΣΦϖΔΨΞΔλΨΠΣΦΔλΨλϑΦΨϖΣΨΦϑλϑμΛϑλΨΞΔλΨαΔηβϗμΔλΨλϑΦΨΔζΣΦΔλ"
letters = Counter(text)
print("cantidad de letras = ", len(letters))
print(letters)
Obteniendo el resultado:
Dandonos cierta confirmación de que vamos bien ya que se utilizan 23 signos distintos, un valor cercano a la cantidad de letras en el alfabeto.
Además vemos que de mayor a menor en cantidad de usos de un signo es: 74 - 53 - 34 - 31 - 31…
Según el siguiente artículo (frecuencia de aparición de letras) en el idioma español la letra ‘a’ es la más frecuente, seguida de cerca por la letra ‘e’, pero superandolas esta el ‘espacio’ casi duplicando a la letra más frecuente.
Por lo tanto reemplazamos el signo Ψ por un espacio, Δ por una ‘a’ y Σ por una ‘e’.
Nota: Tener en cuenta por supuesto que esto no es una ciencia exacta, estamos haciendo uso de la probabilidad. “Puede fallar” dijo Tusam. Si éste fuera el caso se puede volver atrás e intercambiar la ‘a’ por la ‘e’ y continuar el proceso.
Agregamos las siguientes líneas de código a nuestro programa:
text = text.replace('Ψ', ' ')
text = text.replace('Δ', 'a')
text = text.replace('Σ', 'e')
print(text)
Obteniendo:
Analizando el resultado es muy posible que el signo ‘Ξ’ sea una ‘l’, por que en una palabra se repite 2 veces seguidas, y por que se usaría para las palabras ‘las’ ‘los’, ‘el, ‘la’.
Hacemos el reemplazo…
text = text.replace('Ξ', 'l')
Obteniendo:
Continuando de la misma forma es muy posible que:
text = text.replace('Ω', 'y')
text = text.replace('ϑ', 'o')
text = text.replace('λ', 's')
Obteniendo:
Esto es un proceso iterativo, donde en cada iteración nos vamos acercando cada vez más al objetivo.
A partir de acá ya es mucho más fácil deducir el resto, ¿Te animas a completarlo?
Buena suerte y nos vemos!