• +34 685 967 885
  • +34 695 898 191
  • antgarprats@gmail.com
  • Antonio García Prats

máquina enigma

La máquina enigma

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.

      Deja una respuesta

      Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *