La máquina Enigma fue un dispositivo electromecánico usado principalmente durante la Segunda Guerra Mundial por Alemania para cifrar y descifrar mensajes. Diseñada inicialmente por Arthur Scherbius en los años 1920, se basaba en rotores giratorios que transformaban el texto plano en texto cifrado, ofreciendo una de las formas más avanzadas de cifrado mecánico de su tiempo.
Los fundamentos del cifrado de la Enigma se basan en permutaciones (sustituciones) controladas por rotores, un reflector y un teclado, proporcionando millones de combinaciones posibles para dificultar el descifrado sin conocer la configuración inicial.
Cómo funciona la máquina Enigma
Rotores: Discos que mapean una letra a otra en función de su posición. Los rotores giran tras cada pulsación.
Reflector: Permite que la señal vuelva a los rotores, garantizando que el cifrado sea reversible.
Tablero de conexiones: Un sistema adicional para intercambiar pares de letras antes y después de pasar por los rotores.
La clave del cifrado es la configuración inicial: posiciones de los rotores, conexiones del tablero, y posición inicial del reflector.
Código funcional en C
Este programa representa una simulación básica de la máquina Enigma. Aunque simplificado, ilustra los principios de funcionamiento del dispositivo histórico. La configuración inicial de los rotores y reflector puede personalizarse para experimentar con diferentes claves.
El siguiente programa simula una versión simplificada del cifrado de Enigma:
#include <stdio.h>
#include <string.h>
// Configuración de los rotores y reflector
char rotor1[] = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"; // Rotor I
char rotor2[] = "AJDKSIRUXBLHWTMCQGZNPYFVOE"; // Rotor II
char rotor3[] = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; // Rotor III
char reflector[] = "YRUHQSLDPXNGOKMIEBFZCWVJAT"; // Reflector B
char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// Función para buscar el índice de un carácter
int index_of(char c) {
for (int i = 0; i < 26; i++) {
if (alphabet[i] == c) return i;
}
return -1;
}
// Función para rotar un rotor
void rotate_rotor(char *rotor) {
char temp = rotor[0];
memmove(rotor, rotor + 1, 25);
rotor[25] = temp;
}
// Función de cifrado de una letra
char encrypt_letter(char letter, char *rotor1, char *rotor2, char *rotor3, char *reflector) {
int idx;
// Paso por el rotor 1
idx = index_of(letter);
letter = rotor1[idx];
// Paso por el rotor 2
idx = index_of(letter);
letter = rotor2[idx];
// Paso por el rotor 3
idx = index_of(letter);
letter = rotor3[idx];
// Paso por el reflector
idx = index_of(letter);
letter = reflector[idx];
// Paso inverso por el rotor 3
idx = strchr(rotor3, letter) - rotor3;
letter = alphabet[idx];
// Paso inverso por el rotor 2
idx = strchr(rotor2, letter) - rotor2;
letter = alphabet[idx];
// Paso inverso por el rotor 1
idx = strchr(rotor1, letter) - rotor1;
letter = alphabet[idx];
return letter;
}
// Función principal para cifrar un mensaje completo
void encrypt_message(char *message) {
for (int i = 0; i < strlen(message); i++) {
char letter = message[i];
if (letter >= 'A' && letter <= 'Z') {
letter = encrypt_letter(letter, rotor1, rotor2, rotor3, reflector);
printf("%c", letter);
rotate_rotor(rotor1); // Rotar el rotor 1
if (i % 26 == 0) rotate_rotor(rotor2); // Rotar el rotor 2 después de 26 pasos
if (i % (26 * 26) == 0) rotate_rotor(rotor3); // Rotar el rotor 3 después de 26*26 pasos
} else {
printf("%c", letter); // Dejar otros caracteres sin cifrar
}
}
printf("\n");
}
int main() {
char message[256];
printf("Introduce un mensaje (en mayúsculas sin espacios): ");
scanf("%s", message);
printf("Mensaje cifrado: ");
encrypt_message(message);
return 0;
}
Explicación detallada línea a línea
Definición de rotores y reflector:
-Los rotores y el reflector son cadenas que definen cómo se permutan las letras.
–rotor1
, rotor2
, rotor3
y reflector
contienen el mapeo fijo.
Función index_of
:
-Busca la posición de una letra en el alfabeto.
-Es útil para convertir una letra en un índice para acceder a los rotores.
Función rotate_rotor
:
-Simula la rotación de un rotor. La primera letra se mueve al final.
Función encrypt_letter
:
-Pasa la letra por los tres rotores y el reflector.
-Usa el mapeo inverso para devolver la señal en sentido contrario.
Función encrypt_message
:
-Cifra un mensaje completo, aplicando encrypt_letter
a cada carácter.
-Rota los rotores tras cada letra, emulando el comportamiento de la máquina Enigma.
Función main
:
-Toma un mensaje de entrada y lo cifra.
-Imprime el mensaje cifrado.