La historia de la criptografía tiene un antes y un después de la máquina Enigma. Desarrollada originalmente por el ingeniero alemán Arthur Scherbius a finales de la Primera Guerra Mundial para uso comercial, fue adoptada y perfeccionada por el ejército alemán, convirtiéndose en el pilar de sus comunicaciones durante la Segunda Guerra Mundial. Lo que parecía un sistema inexpugnable terminó impulsando, gracias al ingenio de mentes como Alan Turing y Marian Rejewski, el nacimiento de la informática moderna.
La Ingeniería Detrás del Laberinto Mecánico
A diferencia de los cifrados clásicos de lápiz y papel, Enigma automatizó el cifrado utilizando una combinación de ingeniería eléctrica y mecánica de alta precisión. El núcleo de la máquina se componía de tres elementos principales:
1. El Teclado y el Clavijero (Steckerbrett)
El viaje de una letra comenzaba al presionar una tecla. La corriente pasaba primero por el clavijero frontal, una matriz que permitía conectar pares de letras mediante cables (por ejemplo, conectar la ‘A’ con la ‘Z’). Si la corriente entraba por ‘A’, salía por ‘Z’ antes de avanzar. Este componente, aparentemente simple, aumentaba exponencialmente las combinaciones posibles de la máquina.
2. Los Rotores (Walzen)
El corazón del cifrado. Eran discos con 26 contactos eléctricos en cada lado, conectados internamente de forma caótica.
- Cuando la corriente salía del clavijero, atravesaba tres (o cuatro) rotores colocados en serie.
- La verdadera genialidad —y complejidad— radicaba en que los rotores giraban. Cada vez que se presionaba una tecla, el rotor derecho avanzaba una posición.
- Cuando el primer rotor completaba una vuelta (26 letras), una muesca mecánica hacía avanzar una posición al segundo rotor, y así sucesivamente. Esto creaba un cifrado polialfabético dinámico: si presionabas la ‘A’ tres veces seguidas, el resultado cambiaba por completo en cada pulsación.
3. El Reflector (Umkehrwalze)
Al salir del último rotor, la corriente llegaba al reflector, un disco fijo que emparejaba las letras de dos en dos y enviaba la señal de vuelta a través de los rotores por un camino completamente diferente.
- La gran ventaja: Esto permitía que la máquina fuera recíproca. Si configurabas la máquina exactamente igual que el emisor, al introducir el texto cifrado obtenías el mensaje original. No hacía falta un modo «descifrar».
- El gran fallo: Debido a este diseño, una letra jamás podía cifrarse como sí misma. Esta regla fija fue la grieta matemática que Alan Turing y su equipo en Bletchley Park aprovecharon para diseñar las máquinas Bombe y romper el código.
El Cifrado Hoy: De Rotores a Bits y Cuántos
El descifrado de Enigma aceleró la transición de la criptografía mecánica a la matemática pura. Hoy en día, las computadoras procesan información a velocidades impensables, lo que obligó a diseñar algoritmos basados en la complejidad computacional.
La Criptografía Simétrica (AES)
El sucesor conceptual directo de sistemas como Enigma (donde emisor y receptor comparten la misma clave) es el AES (Advanced Encryption Standard). En lugar de rotores, utiliza operaciones matemáticas de sustitución, permutación y transformaciones lineales sobre bloques de datos en múltiples rondas. Un ataque de fuerza bruta contra una clave AES de 256 bits requeriría más energía que la existente en el universo ejecutable.
La Criptografía Asimétrica (RSA y Curvas Elípticas)
El gran salto cuántico de la era de Internet fue eliminar la necesidad de compartir una clave secreta previamente. Algoritmos como RSA se basan en la asimetría matemática: es muy fácil multiplicar dos números primos grandes, pero extremadamente difícil factorizar el resultado. Esto permite tener una clave pública para cifrar y una clave privada para descifrar.
El Futuro: Criptografía Post-Cuántica (PQC)
Con la llegada de la computación cuántica, algoritmos como RSA quedarán obsoletos debido al algoritmo de Shor, capaz de factorizar números en minutos. Hoy en día, la industria se encuentra en plena migración hacia la criptografía basada en retículos (Lattice-based cryptography), diseñando problemas matemáticos que ni siquiera las computadoras cuánticas más potentes del futuro puedan resolver.
Simulador de la Máquina Enigma en Python
Para entender cómo funcionaba mecánicamente, podemos recrear su lógica interna. El siguiente código en Python simula una Enigma con tres rotores y el reflector histórico tipo B.
class Rotor:
def __init__(self, cableado, muesca):
self.cableado = cableado
self.muesca = ord(muesca) - ord('A')
self.posicion = 0
def set_posicion(self, letra):
self.posicion = ord(letra.upper()) - ord('A')
def avanzar(self):
self.posicion = (self.posicion + 1) % 26
return self.posicion == self.muesca
def cifrar_ida(self, indice):
entrada = (indice + self.posicion) % 26
letra_salida = self.cableado[entrada]
salida = (ord(letra_salida) - ord('A') - self.posicion + 26) % 26
return salida
def cifrar_vuelta(self, indice):
entrada = (indice + self.posicion) % 26
letra_buscada = chr(ord('A') + entrada)
pos_cableado = self.cableado.index(letra_buscada)
salida = (pos_cableado - self.posicion + 26) % 26
return salida
class Reflector:
def __init__(self, cableado):
self.cableado = cableado
def reflejar(self, indice):
letra_salida = self.cableado[indice]
return ord(letra_salida) - ord('A')
class MaquinaEnigma:
def __init__(self):
# Configuraciones históricas de la Wehrmacht (Enigma I)
self.r_der = Rotor("BDFHJLCPRTXVZNYEIWGAKMUSQO", 'V') # Rotor III
self.r_med = Rotor("AJDKSIRUXBLHWTMCQGZNPYFVOE", 'E') # Rotor II
self.r_izq = Rotor("EKMFLGDQVZNTOWYHXUSPAIBRCJ", 'Q') # Rotor I
self.reflector = Reflector("YRUHQSLDPXNGOKMIEBFZCWVJAT") # Reflector B
def configurar(self, pos_izq, pos_med, pos_der):
self.r_izq.set_posicion(pos_izq)
self.r_med.set_posicion(pos_med)
self.r_der.set_posicion(pos_der)
def procesar_letra(self, letra):
if not letra.isalpha():
return letra
letra = letra.upper()
indice = ord(letra) - ord('A')
# 1. Rotación mecánica (simulación de doble paso)
avance_med = self.r_der.posicion == self.r_der.muesca or self.r_med.posicion == self.r_med.muesca
avance_izq = self.r_med.posicion == self.r_med.muesca
self.r_der.avanzar()
if avance_med:
self.r_med.avanzar()
if avance_izq:
self.r_izq.avanzar()
# 2. Camino de ida
indice = self.r_der.cifrar_ida(indice)
indice = self.r_med.cifrar_ida(indice)
indice = self.r_izq.cifrar_ida(indice)
# 3. Reflector
indice = self.reflector.reflejar(indice)
# 4. Camino de vuelta
indice = self.r_izq.cifrar_vuelta(indice)
indice = self.r_med.cifrar_vuelta(indice)
indice = self.r_der.cifrar_vuelta(indice)
return chr(ord('A') + indice)
def procesar_texto(self, texto):
resultado = []
for letra in texto:
if letra.isalpha():
resultado.append(self.procesar_letra(letra))
return "".join(resultado)
# --- Demostración de Uso ---
if __name__ == "__main__":
# Instanciamos dos máquinas (Emisor y Receptor)
enigma_emisor = MaquinaEnigma()
enigma_receptor = MaquinaEnigma()
# Clave secreta diaria: Posición inicial de los rotores (ej. 'T', 'U', 'R')
clave = ('T', 'U', 'R')
enigma_emisor.configurar(*clave)
enigma_receptor.configurar(*clave)
mensaje_original = "CRIPTOGRAFIAAVANZADA"
# Cifrado
texto_cifrado = enigma_emisor.procesar_texto(mensaje_original)
# Descifrado
texto_descifrado = enigma_receptor.procesar_texto(texto_cifrado)
print("--- SIMULADOR ENIGMA (PYTHON) ---")
print(f"Original: {mensaje_original}")
print(f"Cifrado: {texto_cifrado}")
print(f"Descifrado:{texto_descifrado}")
Instrucciones del script:
- El script simula el movimiento de los rotores físicos paso a paso.
- Al igual que la Enigma real, no existe una función para «descifrar»; la misma función
procesar_textorealiza ambas tareas siempre y cuando las máquinas compartan la misma configuración inicial (clave).
También en el foro se puede encontrar otro código que simula la maquina enigma pero en C++
