tutoriales.com

Criptoanálisis Clásico: Rompiendo Cifrados Históricos con Python y Frecuencia de Letras

Descubre cómo los criptoanalistas históricos descifraban mensajes secretos antes de la era digital. Este tutorial práctico te guiará a través del análisis de frecuencia y la programación en Python para romper cifrados clásicos.

Intermedio8 min de lectura33 views
Reportar error

Introducción al Criptoanálisis Clásico 🕵️‍♂️

La historia de la seguridad de la información es una constante batalla entre la creación de métodos para ocultar mensajes (cifrado) y el arte de descifrarlos sin conocer la clave secreta (criptoanálisis). Mientras que la criptografía se encarga de proteger la confidencialidad, el criptoanálisis busca las debilidades matemáticas y estructurales en los algoritmos para romperlos.

En este tutorial exploraremos cómo funcionaban los métodos de cifrado antiguos y cómo el análisis estadístico del lenguaje nos permite descifrarlos con relativa facilidad utilizando Python. Veremos que los secretos mejor guardados de la antigüedad a menudo dependían más de la oscuridad del método que de su verdadera solidez matemática.

💡 Consejo: Para aprovechar al máximo este tutorial, se recomienda tener conocimientos básicos de programación en Python y familiaridad con listas, diccionarios y bucles.

El Panorama del Criptoanálisis: Cifrado vs. Desafío 📊

Antes de sumergirnos en el código, es fundamental comprender la diferencia entre criptografía simétrica moderna (como AES) y los cifrados clásicos. Los cifrados clásicos operan directamente sobre las letras del alfabeto en lugar de bits, lo que los hace extremadamente vulnerables a las propiedades estadísticas de los idiomas naturales.

CRIPTOGRAFÍA Texto Plano Clave Cifrado Texto Cifrado CRIPTOANÁLISIS Texto Cifrado Análisis Estadístico / Fuerza Bruta Clave Estimada Texto Recuperado

En el español (y en cualquier otro idioma), no todas las letras se usan con la misma frecuencia. Por ejemplo, la letra E y la letra A aparecen con muchísima más frecuencia que la W o la Z. Esta propiedad natural es el talón de Aquiles de los cifrados de sustitución.


Rompiendo el Cifrado César mediante Fuerza Bruta 🔓

El Cifrado César es uno de los métodos de sustitución más antiguos y conocidos. Consiste en desplazar cada letra del alfabeto un número fijo de posiciones (llamado clave). Por ejemplo, con un desplazamiento de 3, la 'A' se convierte en 'D', la 'B' en 'E', y así sucesivamente.

Dado que el alfabeto en español tiene 27 caracteres (incluyendo la 'ñ'), solo existen 26 desplazamientos posibles (si probamos el 0 no cambia nada). Esto hace que el cifrado sea completamente vulnerable a un ataque de fuerza bruta.

Implementación en Python

Vamos a escribir un script en Python que pruebe automáticamente los 27 desplazamientos posibles para descifrar un mensaje.

def descifrar_cesar_fuerza_bruta(texto_cifrado):
    alfabeto = "abcdefghijklmnñopqrstuvwxyz"
    print("--- INICIO DE FUERZA BRUTA CESAR ---")
    
    for clave in range(1, len(alfabeto)):
        texto_descifrado = ""
        for caracter in texto_cifrado.lower():
            if caracter in alfabeto:
                indice = alfabeto.find(caracter)
                nuevo_indice = (indice - clave) % len(alfabeto)
                texto_descifrado += alfabeto[nuevo_indice]
            else:
                texto_descifrado += caracter
        print(f"Clave {clave}: {texto_descifrado}")

# Mensaje cifrado de prueba
mensaje_secreto = "khoorñvzruog"
descifrar_cesar_fuerza_bruta(mensaje_secreto)
⚠️ Advertencia: La fuerza bruta solo es viable cuando el espacio de claves es pequeño. A medida que el número de combinaciones crece, este enfoque se vuelve computacionalmente imposible sin técnicas analíticas avanzadas.

Análisis de Frecuencia: El Arma Definitiva para Sustituciones 📈

Cuando el espacio de claves es demasiado grande para la fuerza bruta (como en el cifrado de sustitución monoalfabética, que tiene $27!$ combinaciones posibles, es decir, más de $10^{28}$ opciones), debemos recurrir al análisis de frecuencia.

En este tipo de cifrado, cada letra del alfabeto es reemplazada por otra letra fija de manera aleatoria. Aunque parezca seguro, la frecuencia de las letras en el texto cifrado reflejará la frecuencia natural del idioma original.

Frecuencia de Letras en Español

A continuación se muestra una tabla con la frecuencia porcentual aproximada de las letras más comunes en textos en español:

LetraPorcentaje aproximado
------
E13.68%
A12.53%
------
O8.68%
S7.98%
------
R6.87%
N6.71%
------
D5.86%
L4.97%
E y A representan más del 25% del texto en español

Algoritmo de Análisis de Frecuencias en Python

Implementemos un script que cuente la frecuencia de cada letra en un texto cifrado y nos ayude a compararlas con las estadísticas del español.

from collections import Counter

def analizar_frecuencias(texto):
    alfabeto = "abcdefghijklmnñopqrstuvwxyz"
    # Filtrar solo letras del alfabeto
    letras_filtradas = [c for c in texto.lower() if c in alfabeto]
    total_letras = len(letras_filtradas)
    
    conteo = Counter(letras_filtradas)
    
    print(f"Total de letras analizadas: {total_letras}\n")
    print("Letra | Frecuencia Absoluta | Porcentaje")
    print("-------------------------------------")
    
    for letra, frecuencia in conteo.most_common():
        porcentaje = (frecuencia / total_letras) * 100
        print(f"  {letra}   |         {frecuencia:3d}           |  {porcentaje:5.2f}%")

# Ejemplo de uso con texto cifrado complejo
cifrado_ejemplo = "fdlv vighw djudefd vhfuhwd gh od dqwljthgdg"
analizar_frecuencias(cifrado_ejemplo)
📌 Nota: El análisis de frecuencia funciona mejor en textos largos. Los textos cortos no contienen suficientes muestras estadísticas para que las frecuencias coincidan de manera predecible con las tablas estándar del idioma.

Paso a Paso: Descifrando un Mensaje Monoalfabético 🛠️

Para consolidar los conceptos aprendidos, sigamos una línea de tiempo y un proceso estructurado para resolver un cifrado de sustitución paso a paso.

Paso 1: Recopilación y Limpieza. Contar la longitud del texto cifrado y eliminar caracteres especiales, espacios y puntuación para aislar el alfabeto.
Paso 2: Conteo de Frecuencias. Ejecutar el script de conteo para identificar qué símbolos aparecen más veces en el texto cifrado.
Paso 3: Mapeo de Suposiciones. Asignar la letra más frecuente del texto cifrado a la letra 'E' o 'A' del español y verificar palabras comunes de una sola letra (como 'y', 'o') o dos letras (como 'el', 'de').
Paso 4: Validación Iterativa. Reemplazar los símbolos en todo el texto y ajustar las hipótesis según el sentido contextual de las palabras resultantes.
TEXTO CIFRADO (INPUT) X L P R W Q Z V MÓDULO DE SUSTITUCIÓN ITERATIVA X → H L → O P → L R → A CORRECCIÓN Procesando probabilidad de caracteres... TEXTO PLANO DESCIFRADO H O L A M U N D O

Preguntas Frecuentes (FAQ) 🙋‍♂️

¿Por qué el cifrado César ya no se usa hoy en día?Porque es extremadamente vulnerable a la fuerza bruta. Con computadoras modernas, probar las 26 combinaciones toma menos de un milisegundo.
¿Se puede aplicar el análisis de frecuencia a los cifrados modernos?Los cifrados modernos como AES o RSA están diseñados específicamente para eliminar cualquier patrón estadístico en el texto cifrado, haciendo que el análisis de frecuencia sea totalmente inútil contra ellos.
¿Qué herramienta puedo usar si no quiero programar en Python?Existen herramientas gráficas y páginas web interactivas como *CrypTool* o *Quipqiup* que automatizan el análisis de frecuencia y el descifrado heurístico.

Conclusión y Próximos Pasos 🎯

El criptoanálisis clásico nos enseña una lección fundamental en ciberseguridad: la complejidad no es sinónimo de seguridad. Los cifrados basados en sustituciones simples o desplazamientos fijos ofrecen una ilusión de protección que se desploma fácilmente al aplicar estadística básica y capacidad computacional.

Para avanzar en tu camino dentro de la criptografía y la ciberseguridad, te sugiero explorar temas más complejos como el cifrado de Vigenère (que introduce claves repetidas para complicar el análisis de frecuencia) y los fundamentos de la criptografía moderna basada en teoría de números.

Intermedio Criptografía Python

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!