miércoles, 11 de junio de 2025

Sistemas Operativos. 1.- Instalación de VirtualBox

¿Te pierdes entre tantos temas? 📚✨ Descubre todo lo que ofrece este blog en un solo vistazo [👉 Ver índice completo]

Instalación y funcionamiento de Virtual Box

Para aprender y practicar Linux sin poner en riesgo tu sistema principal, una buena opción es usar máquinas virtuales. Esto te permite crear un "ordenador dentro de tu ordenador", donde puedes instalar Linux, probar comandos, y hacer experimentos sin preocuparte por romper nada. Todo se ejecuta en una ventana, y si algo sale mal, puedes borrar la máquina y empezar de nuevo.

Una de las herramientas más conocidas y gratuitas para esto es VirtualBox.

VirtualBox es un programa gratuito de Oracle que te permite crear y usar máquinas virtuales en tu ordenador. Es compatible con Windows, Linux y macOS, y muy fácil de usar para empezar.

¿Cómo instalarlo?


      1. Entra en la página oficial:

        👉 https://www.virtualbox.org


      2. Haz clic en "Downloads" (descargas).

        - Selecciona la plataforma para que lo quieres instalar (windows en mi caso).
        - Una vez descargado, abre el archivo y sigue estos pasos:
        - Acepta los términos de uso.
        - Deja las opciones por defecto.
        - Pulsa en “Next” varias veces y luego en “Install”.
        - Espera a que termine y haz clic en “Finish”.

Ya puedes abrir VirtualBox desde el menú de inicio.

Instalación de una imagen ISO de Linux o Windows en Virtual Box.

Una vez que tienes VirtualBox instalado, el siguiente paso es crear una máquina virtual e
instalar Linux desde una imagen ISO (como Ubuntu, Debian, etc.) o lo mismo con Windows.

Lo primero que tienes que hacer es descargar la imagen ISO del sistema Linux que quieras
utilizar o la imagen ISO de Windows de que dispongas. Lo recomendable es que la guardes
en una carpeta que sea fácil de recordar.

Lo siguiente es crear una nueva máquina virtual en Virtual Box. Para ello, vamos a dejar lo que
nos recomienda el programa y lo haremos lo más sencillo posible. (se podría configurar el
número de procesadores, la memoria dedicada, el tamaño del disco duro etc, pero de momento
no lo haremos):
  • Abre VirtualBox
  • Haz clic en "Nueva" (o "New")
  • Ponle un nombre (por ejemplo: Linux_Prueba)
  • Versión: selecciona la distribución que descargaste (por ejemplo, Xubuntu (64-bit))
  • Haz click en "Omitir selección desatendida"
Haz clic en "Terminar"

Instalación de una máquina virtual

Lo siguiente es instalar el sistema que hayas elegido como lo harías normalmente en tu
ordenador. Para ello tienes que iniciar la máquina virtual, lo cual se hace pulsando en el icono
verde "Iniciar" que está en la parte superior derecha de la pantalla. Al pulsarlo, verás que
arranca con la ISO que cargaste. Sigue los pasos del instalador del sistema operativo como si fuera
un ordenador real.

¿Qué son las Guest Additions de Virtual Box?

Las "Guest Additions" o "complementos del invitado" en español, son un conjunto de
herramientas que se instalan dentro de la máquina virtual (el sistema invitado) para mejorar su
funcionamiento. Sirven por ejemplo para:
  • Usar el ratón sin tener que capturarlo dentro de la ventana.
  • Compartir carpetas entre tu PC y la máquina virtual.
  • Ajustar automáticamente la resolución de la pantalla.
  • Copiar y pegar texto entre el sistema real y la máquina virtual.
  • Mejorar el sistema general del sistema invitado.
Vamos a ver como sería la instalación en un una máquina virtual con Linux (como Xubuntu).
Lo primero que tendremos que hacer es insertar el disco de las "Guest Additions". Para ello
desde la ventana de Virtual Box, con la máquina virtual abierta, ve al menu superior y selecciona

Dispositivos -> Insertar imagen de CD de las "Guest Additions"

Esto montará un "CD virtual" en la máquina.

Complementos del invitado

A continuación tenemos que ejecutar el instalador.

Instalador de guest additions

En las imágenes actuales de Linux, lo normal es que la imagen se monte sola como una
unidad de cd, si no es así te tocará montar la unidad a mano, si no se montó automáticamente.
Para finalizar ejecuta el instalador como superusuario con el siguiente comando:


En una máquina virtual de Windows las "Guest Adittions" se montan en la unidad de CD y solo
tenemos que ejecutar el archivo "VBoxWindowsAdditions.exe"

Oracle VirtualBox Extension Pack


También es recomendable instalar el Oracle VM VirtualBox Extension Pack que es un complemento
oficial que añade funcionalidades avanzadas a VirtualBox, mejorando la experiencia de virtualización.
Aquí te explico para qué sirve y sus principales características:

🔹 Funcionalidades principales del Extension Pack

  • Soporte para USB 2.0 y USB 3.0
  • Permite conectar dispositivos USB físicos (pendrives, cámaras, impresoras, etc.)
         directamente a la máquina virtual.
  • Sin el Extension Pack, solo funciona USB 1.1 (muy lento).
  • Virtualización de tarjetas gráficas (VRDP)
  • Soporte para el protocolo Remote Desktop Protocol (RDP) para acceder remotamente a
        la máquina virtual.
  • Mejora el rendimiento gráfico en algunos sistemas operativos invitados.
  • Cifrado de discos duros virtuales
  • Permite cifrar las máquinas virtuales (AES-256) para mayor seguridad.
  • Útil si manejas datos sensibles dentro de la VM.
  • Soporte para PXE Boot en tarjetas de red virtuales
  • Permite arrancar máquinas virtuales desde la red (útil para entornos de pruebas de
        servidores).
  • Compatibilidad con NVMe (SSD virtuales)
  • Mejor rendimiento para discos virtuales con emulación NVMe (en lugar de SATA/IDE
        tradicional).
  • Passthrough de webcams
  • Permite usar cámaras físicas conectadas al host dentro de la máquina virtual.
  • Soporte para imágenes de disco adicionales
  • Permite usar el formato VMDK (VMware) y HDX (Hyper-V) directamente en VirtualBox.
¿Cómo instalarlo?

Descarga el Extension Pack desde la página oficial de VirtualBox:
📌 https://www.virtualbox.org/wiki/Downloads
(Asegúrate de descargar exactamente la misma versión que tu VirtualBox).

Abre VirtualBox.

Ve a Archivo > Preferencias > Extensiones.

Haz clic en el icono "Añadir" y selecciona el archivo .vbox-extpack descargado.
Acepta los términos de licencia.

Requisitos:

Necesitas permisos de administrador.
La versión del Extension Pack debe coincidir con la de VirtualBox
(ej.: VirtualBox 7.0.x → Extension Pack 7.0.x).
Oracle requiere una licencia comercial.

Es gratis para uso personal, educativo o evaluación. Sin embargo, para entornos empresariales,


Exportar una máquina virtual


Exportar una máquina virtual es útil para guardar una copia portable de todo el sistema (SO,
programas y configuraciones) en un solo archivo (como .ova o .ovf), lo que permite migrarla a
otro equipo, compartirla con otros o recuperarla tras un fallo. También facilita clonar entornos
de trabajo preconfigurados, probar software sin riesgos (aislando cambios) o incluso migrar la
VM entre diferentes plataformas de virtualización (como VirtualBox a VMware). Además, sirve
como respaldo seguro o para distribuir entornos de desarrollo uniformes en equipos, evitando
problemas de compatibilidad. En VirtualBox, basta con exportarla a un formato estándar como
.ova para moverla o almacenarla fácilmente.

Es muy fácil de realizar. Con la máquina virtual que quieras exportar apagada ve al siguiente
menú:
exportar máquina virtual

Luego te saldrá un menú para que selecciones la máquina que quieres exportar, lo haces y le
das al botón "terminar"

Importar una máquina virtual


Es justo el proceso contrario al anterior. Coges la imagen que tenias exportada de la maquina
virtual y la importas a tu ordenador para poder ejecutarla.
importar máquina virtual

Añadir disco Duro (La máquina virtual tiene que estar apagada)


Si quieres añadir más discos duros a tu máquina virtual debes realizar el siguiente proceso.
Con la máquina virtual apagada, la seleccionas, y le das clic al botón de "Configuración". Después
seleccionas "Almacenamiento" y le das a "añadir disco duro"

Añadir disco duro

En el siguiente menú seleccionas "Crear" y estableces el tamaño y ubicación del archivo del disco.

crear nuevo disco


tamaño del disco

Compartir Carpetas.


El compartir carpetas entre tu sistema host (anfitrión) y una máquina virtual en virtual box es útil
para:
    - Transferir archivos fácilmente sin depender de USB, correo o redes.     - Desarrollar software editando código en el host y ejecutándolo en la VM (o viceversa).     - Acceder a documentos o bases de datos desde ambos sistemas sin duplicar archivos.     - Probar programas en entornos aislados sin contaminar el host, pero usando datos reales.     - Optimizar espacio, ya que evita copiar archivos grandes dentro de la VM.     - Desarrollar software editando código en el host y ejecutándolo en la VM (o viceversa).     - Acceder a documentos o bases de datos desde ambos sistemas sin duplicar archivos.     - Probar programas en entornos aislados sin contaminar el host, pero usando datos reales.     - Optimizar espacio, ya que evita copiar archivos grandes dentro de la VM.

Se configura en VirtualBox con Carpetas Compartidas (vía menú o comando) y se accede desde
la VM como una unidad de red o montaje.

Compartir una carpeta automáticamente:

Para que una carpeta de tu sistema host (anfitrión) esté disponible automáticamente cada vez

que inicies la máquina virtual en VirtualBox, sigue estos pasos:

📌 Requisitos previos
Guest Additions instalados en la máquina virtual (necesario para compartir carpetas).
Si necesitas instalarlos, recuerda, en la máquina virtual, ve a Dispositivos > Insertar imagen de
CD de Guest Additions y ejecuta el instalador. (En Linux guest: monta el CD y ejecuta sudo ./VBoxLinuxAdditions.run). Apaga la VM antes de configurar la carpeta compartida.

🔹 Paso 1: Configurar la carpeta compartida en VirtualBox
Abre VirtualBox, selecciona tu VM y haz clic en Configuración > Carpetas compartidas. Haz clic en el icono + (Añadir). Define: Ruta de la carpeta: Selecciona una carpeta en tu host
(ej.: C:\SharedVM en Windows o /home/usuario/compartida en Linux). Nombre de la carpeta: Así la verás en la VM (ej.: shared). Opciones importantes: ✅ Montar automáticamente (para que esté disponible al iniciar). 🔹 Opcional: Marca Solo lectura si no quieres cambios desde la VM.

Compartir carpetas

🔹 Paso 2: Acceder a la carpeta compartida desde la VM
En Windows (Guest): Abre el Explorador de archivos y ve a Red > VBOXSVR. Verás la carpeta compartida con el nombre que le diste (ej.: shared).


En Linux (Guest): La carpeta se monta automáticamente en /media/sf_NombreDeLaCarpeta.

Si por la razón que fuese la carpeta no se montara automáticamente, podemos hacerlo nosotros

en Windows manualmente. El comando "net use" es la forma clásica en Windows para mapear

unidades de red (como las carpetas compartidas de VirtualBox) directamente desde la terminal (CMD).

🔍 Desde la terminal del la máquina virtual (guest) teclearíamos: (cmd para entrar en la terminal)
net use p: \\vboxsvr\compartida p:: Asigna la carpeta compartida a la unidad P: (puedes usar otra letra disponible). \\vboxsvr: Es el servidor de recursos compartidos de VirtualBox (siempre usa este nombre). \compartir: Nombre de la carpeta compartida que definiste en VirtualBox
(ej.: si la llamaste "compartida" al configurarla).

Listo: Verás la unidad P: en el Explorador de archivos con los archivos compartidos

carpetas compartidas
📌 Pasos para usarlo correctamente Ten en cuenta que primeramente la carpeta tiene que estar compartida en VirtualBox. Para
ello recuerda que los pasos que hicimos fueron los siguientes: Ve a Configuración > Carpetas compartidas de tu VM. Añade una carpeta del host (ej.: C:\Shared) con un nombre (ej.: compartida). Marca Montar automáticamente. Si quisieras eliminar del guest la conexión con esta carpeta compartida, el comando a teclear
en la terminal sería:

net use p: /d

donde "p" es la letra de la unidad que hayas escogido y "/d" la opción de borrar.

Modos de red en Virtual Box.


VirtualBox ofrece 4 modos principales de red, cada uno con un propósito específico. Aquí te los
explico de forma clara y práctica:

1. NAT (Traducción de Direcciones de Red)
🔹 ¿Qué hace?
La VM comparte la IP del host (como si tu PC fuera un router). Internet funciona, pero no es accesible desde fuera (host u otras VMs). 💡 Cuándo usarlo:
Para VMs que solo necesitan salir a Internet (navegar, descargar updates). Ejemplo: Una VM con Windows para probar navegación web. ⚠️ Limitaciones:
No puedes hacer ping al host ni entre VMs en modo NAT. No sirve para servidores (no es accesible desde la red física).

2. Adaptador Puente (Bridged Adapter)
🔹 ¿Qué hace?
La VM aparece como un dispositivo más en tu red física (como otro PC). Obtiene IP del router (ej: 192.168.1.100), en la misma red que tu host. 💡 Cuándo usarlo:
Para servidores accesibles desde la red local (ej: web, FTP). Para hacer ping entre VMs o desde el host (ideal para prácticas de redes). ⚠️ Requisitos:
Necesitas una red con DHCP (o configurar IPs manuales).

3. Red Interna (Internal Network)
🔹 ¿Qué hace?
Crea una red privada solo entre VMs (el host no puede acceder). Las VMs se comunican entre sí, pero sin salida a Internet. 💡 Cuándo usarlo:
Para labs de redes aislados (ej: un servidor y un cliente en una red privada). Pruebas de seguridad (malware, pentesting) sin riesgo a la red real. ⚠️ Ejemplo:
VM1 (IP: 192.168.10.1) <---> VM2 (IP: 192.168.10.2)

4. Red NAT (NAT Network)
🔹 ¿Qué hace?
Combina NAT + Red Interna: VMs comparten una red privada y tienen salida a Internet. VirtualBox actúa como router (como en NAT), pero las VMs pueden comunicarse entre sí. 💡 Cuándo usarlo:
Para múltiples VMs que necesitan Internet + comunicación interna (ej: un lab con 3 VMs que se

conectan entre sí y a la web). ⚠️ Configuración extra:
Debes crear una red NAT en:
Herramientas > Administrador de redes NAT > Crear.

5. Modo Anfitrión (Host-Only)
🔹 ¿Qué hace?
Crea una red solo entre el host y las VMs (sin Internet ni red física). El host tiene una IP fija (ej: 192.168.56.1) y las VMs se conectan a ella. 💡 Cuándo usarlo:
Para probar servicios solo en tu PC (ej: un servidor SSH accesible solo desde tu host). Desarrollo local (bases de datos, APIs).


Consejos para un mejor funcionamiento.


a) Eliminar la tortuga verde o indicador de bajo rendimiento en VirtualBox




¿Te ha aparecido el molesto símbolo de la tortuga verde en tu máquina virtual de VirtualBox?
Este icono indica que el sistema está funcionando en modo de bajo rendimiento, generalmente
porque VirtualBox no puede acceder directamente al hardware debido a conflictos con otras
tecnologías de virtualización (como Hyper-V de Windows). En mi caso, logré solucionarlo haciendo dos ajustes: 1. Desactivar el "Aislamiento del Núcleo" en Windows Este es un mecanismo de seguridad de Windows (parte de Memory Integrity en el Modo Seguro)
que puede interferir con la virtualización. Pasos para desactivarlo: Ve a Configuración de Windows > Actualización y seguridad > Seguridad de Windows. Haz clic en "Seguridad del dispositivo" > "Aislamiento del núcleo". Desactiva la opción (si está disponible) y reinicia el equipo. 🔹 ¿Por qué funciona? El aislamiento del núcleo restringe el acceso al hardware para prevenir exploits, pero también
puede bloquear funciones que VirtualBox necesita para un rendimiento óptimo. 2. Deshabilitar Hyper-V con bcdedit Windows suele tener Hyper-V activado por defecto (incluso si no lo usas), lo que compite con
VirtualBox. Solución rápida desde CMD (como Administrador): Abre el terminal como administrador y cuando aparezca el shell teclea bcdedit /set hypervisorlaunchtype off
Luego reinicia el equipo.
Este comando es totalmente reversible. Si necesitas volver a utilizar Hyper-V porque, por ejemplo
utilices Docker vuelve a hacer lo mismo tecleando bcdedit /set hypervisorlaunchtype on. 🔹 ¿Por qué funciona? VirtualBox y Hyper-V no pueden correr simultáneamente. Este comando desactiva el hipervisor
de Microsoft, permitiendo que VirtualBox use virtualización anidada sin limitaciones. Resultado Tras estos cambios, la tortuga verde desapareció y mi máquina virtual volvió a funcionar a
velocidad normal. ⚠ Nota: Si usas WSL2 o Docker con Hyper-V, como ya te comente vuelve a activar el hipervisor
porque si no estos programas no te funcionarán.

b) Configuración Recomendada para Ubuntu en VirtualBox (Rendimiento Óptimo)

Para que tu máquina virtual con Ubuntu funcione de manera fluida en VirtualBox, aquí te dejo
una posible configuración equilibrada según el hardware de tu PC anfitrión (Host). 💻 Configuración Básica Recomendada
1. Memoria RAM (RAM) Mínimo recomendado: 2 GB (para Ubuntu Lite o sin entorno gráfico). Recomendado para escritorio (GNOME): 4 GB (si tu Host tiene 8 GB o más). Óptimo para desarrollo/uso intensivo: 8 GB (si tu Host tiene 16 GB+). 🔹 ¿Por qué? Ubuntu con GNOME consume ~1.5 GB en reposo. Si asignas muy poca RAM,
usará swap (disco) y se ralentizará. 2. Procesadores (CPU) Mínimo: 1 núcleo (solo para tareas básicas). Recomendado: 2 núcleos (para un uso fluido con escritorio). Óptimo: 4 núcleos (si tu CPU Host tiene 6+ núcleos). ⚠ No asignes todos los núcleos al Guest, deja al menos 2 para el Host. 🔹 ¿Por qué? VirtualBox no maneja bien CPUs con muchos núcleos. 2-4 suelen ser el punto óptimo. 3. Video Memory (Gráficos) Mínimo: 16 MB (solo modo terminal). Recomendado: 128 MB (para GNOME/Unity sin efectos). Óptimo: 256 MB (si usas aceleración 3D). ✅ Activar "Aceleración 3D" (en Pantalla > Gráficos): Mejora el rendimiento gráfico en Ubuntu (GNOME necesita esto para animaciones fluidas). 4. Almacenamiento (Disco Duro Virtual) Tipo de disco: VDI (asignación dinámica) para ahorrar espacio. Tamaño mínimo: 25 GB (para instalación básica). Recomendado: 40-60 GB (si instalas muchos programas). Formato: SSD (si tu Host tiene SSD) → Más rápido. 🔹 ¿Mejor configuración? Controlador SATA (mejor rendimiento que IDE). Tamaño de caché de E/S: Normal (a menos que tengas un SSD NVMe). ⚡ Ajustes Avanzados para Mejor Rendimiento 1. Aceleración de Virtualización (En "General > Procesador") ✅ Habilitar "VT-x/AMD-V" (obligatorio para 64 bits). ✅ Habilitar "PAE/NX" (necesario para algunos kernels).

configuración virtualbox

🔄 Paravirtualización: "KVM" (mejor para Linux). (En General -> Sistema -> Aceleración)
mejorar rendimiento

2. Red (En "Red") Modo recomendado: "NAT" (para internet simple). Mejor rendimiento: "Adaptador Puente" (si necesitas IP local). 📊 Resumen: Configuración Ideal (PC Host con 16 GB RAM / 8 núcleos) Componente Configuración Recomendada RAM 4 GB - 8 GB CPU 2-4 núcleos Video Memory 128 MB - 256 MB (3D ON) Disco 40 GB (VDI dinámico) Red NAT o Adaptador Puente






domingo, 29 de diciembre de 2024

Crear y descodificar mensajes codificados con Enigma usando Python




Basado en "OctaPi: brute-force Enigma"

y el módulo py-enigma.

Licencia de "Creative Commons Attribution 4.0 International License" (CC BY 4.0).

Lo que vamos a hacer en este post es crear mensajes encriptados, mensajes secretos que solo tu y las personas en las que confíes podrán leer. Luego desarrollaremos código en Python para realizar un ataque criptográfico de fuerza bruta parcial sobre los mensajes de Enigma y recuperar la configuración de los rotores de la máquina.

¿Qué es la máquina Enigma y como funciona?

Antes de nada, para entender mejor el proceso, puedes ver como funciona la máquina enigma en este video.



Enigma es una máquina de cifrado que fue creada a principios del siglo XX para aplicaciones comerciales, diplomáticas y militares. Durante la Segunda Guerra Mundial, la máquina fue adoptada por el ejército alemán para comunicaciones secretas. El código de cifrado Enigma fue famoso por ser descifrado durante la guerra en Bletchley Park, el precursor del GCHQ, lo que permitió que los mensajes interceptados del ejército alemán pudieran ser descifrados y leídos. Este logro espectacular se cree que acortó la guerra, salvando muchas vidas en ambos lados del conflicto.

Desde un punto de vista eléctrico, la máquina Enigma es simplemente una batería, 26 bombillas y un circuito de interruptores. No tiene electrónica, por lo que es un dispositivo electro-mecánico. El cifrado se logra variando el camino de una corriente eléctrica a través del cableado de la máquina.


funcionamiento de la máquina enigma


Pej. Si tecleamos una T, con una determinada configuración de los rotores, obtendremos una G como letra cifrada.

En el diagrama anterior, puedes ver cómo una letra tecleada en el teclado pasa por muchas etapas de transposición antes de ser dirigida a una bombilla en el tablero de luces que representa la letra cifrada. El usuario escribe su mensaje en texto normal en el teclado, carácter por carácter, y lee el texto cifrado a medida que cada bombilla se ilumina en el tablero de luces en respuesta. Debido a la forma en que se realiza la transposición, una letra tecleada nunca se cifra como ella misma (por ejemplo, teclear una A nunca iluminará la bombilla para A).

El diagrama puede dar la impresión de que la transposición de letras es invariable. Sin embargo, esto no es cierto; la forma en que se transponen las letras cambia con cada letra que se teclea en la máquina Enigma. ¡Eso es lo que hizo que el código Enigma fuera tan difícil de romper! La transposición cambia porque, a medida que se teclea cada letra, el camino de la corriente cambia a medida que fluye hacia las bombillas. ¿Cómo funciona esto?

Rotores y Reflectores.

En el interior de la máquina, varios rotores con 26 contactos (uno para cada letra de la A a la Z) están apilados juntos para crear el camino de la corriente a través del corazón de la máquina. Cada rueda del rotor tiene 26 contactos eléctricos en ambos lados y un enredo de cableado en el interior, de modo que las letras tecleadas se transponen de un lado al otro. En la práctica, esto significa que un rotor específico transponde la A en E, la B en K, la C en M, y así sucesivamente.



En la foto anterior, puedes ver el lio de cables dentro de una rueda de rotor expandida de una máquina Enigma capturada en la Segunda Guerra Mundial. Al apilar varios rotores y usar un reflector al final para devolver la corriente a través de los rotores, cada letra se transponde muchas veces. Al usar la máquina Enigma, se seleccionan tres rotores de cinco disponibles (también había máquinas con cuatro rotores). La configuración de transposición del reflector es fija, asegurando que la corriente regrese a través de la máquina sin invertir la transposición.

Entonces, ¿Cómo se cambia el camino de la corriente que fluye a través de estos componentes?

Movimiento de los rotores Para utilizar una transposición diferente caracter por caracter, el primer rotor avanza paso a paso a medida que se escribe cada letra del mensaje, creando una nueva ruta para la corriente cada vez. Como resultado, el usuario puede escribir 'LL' y ambas letras serán cifradas de manera diferente, por lo que el resultado podría ser 'XV'. Después de que el primer rotor haya avanzado 26 posiciones (una revolución completa), la máquina comienza a avanzar la posición del siguiente rotor, y así sucesivamente.

Posiciones iniciales de los rotores Parte de lo que hace que el cifrado de Enigma sea difícil de romper es el hecho de que cada rotor puede usarse con una posición inicial diferente. Por ejemplo, si un rotor se establece en la posición 10 al principio y se introduce la letra A en la máquina, no entrará donde la A entra por defecto, sino donde entra la J (letra 10 en el alfabeto) por defecto. Ten en cuenta que un rotor avanzará 26 pasos sin importar cuál sea su posición inicial.

Para facilitar su ajuste, el rotor está marcado con un anillo alfabético. Por lo tanto, una posición inicial de 10 se lograría ajustando el rotor de modo que la letra J sea visible; la posición inicial de "JFM" para tres rotores significaría ajustar el primer rotor a J, el segundo a F y el tercero a M.

Anillos deslizantes Además, las asignaciones de letras pueden desplazarse al girar un anillo deslizante en el rotor. Girar el anillo deslizante rota el cableado dentro del rotor. Por ejemplo, supongamos que con el anillo deslizante en la posición predeterminada, el cableado del rotor transpondría A en E, B en K, C en M, y así sucesivamente. Mover el anillo deslizante en 1 significaría que la letra A se transpondría en K, B en M, etc.

Tablero de conexiones Como si esto no fuera suficiente, la versión alemana de la máquina Enigma también incluye un tablero de conexiones (el cuadro verde más a la izquierda en el diagrama en la parte superior), que se puede ajustar manualmente para que hasta diez pares de letras se transpongan al entrar en los rotores y nuevamente al salir.

Configuraciones de cifrado Al combinar tres rotores de un conjunto de cinco, las configuraciones de rotor con 26 posiciones y el tablero de conexiones con diez pares de letras conectadas, la máquina Enigma utilizada por el ejército durante la Segunda Guerra Mundial tenía 158962555217826360000 (casi 159 quintillones) configuraciones diferentes.

El cifrado dependía de que tanto la máquina Enigma emisora como la receptora estuvieran configuradas de la misma manera. Para lograr esto, se usaban hojas de configuración secretas idénticas en las estaciones de comunicación emisoras y receptoras. Estas hojas especificaban:

  • Qué rotores debían seleccionarse y en qué orden debían insertarse en la máquina.
  • Cuánto debía girar cada rotor.
  • Qué letras debían ser cambiadas por el tablero de conexiones.
  • Qué posiciones iniciales de los rotores debían usarse.

Se utilizaban diferentes configuraciones de máquina cada día, y las posiciones iniciales de los rotores se cambiaban incluso cada seis horas, por lo que la configuración de la máquina era altamente sensible al tiempo. Por eso las hojas de configuración distribuidas por el ejército eran tan cuidadosamente guardadas.


Hoja de configuraciones Esta es una simulación de una hoja de configuraciones de Enigma capturada al final de la Segunda Guerra Mundial. En la vista ampliada de una de las líneas mostradas a continuación, puedes ver cómo se disponen las diversas configuraciones:


Una línea de configuraciones de una hoja de Enigma capturada durante la Segunda Guerra Mundial

Las configuraciones en las que hemos hecho zoom son para el primer día del mes, de ahí el "1" en la segunda columna desde la izquierda. 

La siguiente columna muestra que los rotores IV, I y V deben seleccionarse y usarse en ese orden. 

La cuarta columna contiene las configuraciones de los anillos deslizantes: el rotor IV debe ajustarse a la posición 20, el rotor I a la posición 5 y el rotor V a la posición 10. 

Luego vienen las conexiones del tablero de enchufes: S a X, K a U, Q a F, y así sucesivamente. 

Finalmente, las posiciones iniciales de los rotores para los cuatro períodos de seis horas del día son "SRC", "EEJ", "FNZ" y "SZK". Además de eso, había dos reflectores, B y C, uno de los cuales se elegía para su uso. Para los programas de cifrado y descifrado aquí, asumiremos el uso del reflector B.

Clave única Para cada mensaje durante la Segunda Guerra Mundial, el remitente también seleccionaba tres caracteres por sí mismo como una clave única para ese mensaje, digamos "RPF". Cifraban esta clave usando las configuraciones de la hoja de configuraciones y anotaban el resultado, digamos "QMD". Luego procedían a cifrar su mensaje usando su clave única, en este caso "RPF", como las posiciones iniciales de los rotores, anotando el texto cifrado que la máquina devolvía. La versión cifrada de la clave, en este caso "QMD", más el texto cifrado, se enviaban al destinatario por radio.


Uso de la máquina enigma durante la segunda guerra mundial.

En la Segunda Guerra Mundial, los mensajes cifrados con Enigma solían enviarse en código Morse a través de radio de onda corta. Esto significaba que podían interceptarse fácilmente a cierta distancia, por lo que el ejército alemán dependía en gran medida de la fortaleza de la técnica de cifrado para mantener sus mensajes en secreto. Sin embargo, Gran Bretaña interceptó y descifró con éxito los mensajes en Bletchley Park.

Una transmisión cifrada con Enigma habría tenido un aspecto similar a este:

mensaje cifrado con enigma

Mensaje cifrado

¿Cómo cifraban los operadores en las estaciones de comunicaciones?

Paso 1: Seleccionar los rotores y elegir una clave de mensaje de tres letras


Primero, el operador buscaba la línea en la hoja de configuraciones correspondiente al día del mes actual. Esto le indicaba cómo configurar la máquina Enigma, incluyendo qué rotores seleccionar y en qué orden colocarlos, así como la posición inicial de los rotores para el período de seis horas actual.

Paso 2: Elegir y cifrar una clave de mensaje de tres letras


Luego, el operador elegía una clave de mensaje de tres letras única y aleatoria para cada mensaje. Supongamos que pensó en "SCC" como la clave. Evidentemente, esta clave no podía enviarse abiertamente. Para cifrarla antes de la transmisión, el operador escribía "SCC" en la máquina Enigma configurada según la hoja, obteniendo (por ejemplo) "PWE" como la clave cifrada. Esta clave ya era segura para enviarse por un canal de radio.

Durante al menos una parte de la Segunda Guerra Mundial, el procedimiento militar alemán consistía en enviar y cifrar la clave del mensaje dos veces. Siguiendo nuestro ejemplo, el operador habría escrito "SCCSCC" y obtenido "PWEHVF".

¿Cuál es el problema de repetir la clave del mensaje?

Anteriormente mencionamos que ninguna letra del texto plano se cifra como sí misma. Esto significa que cualquier persona que intercepte un mensaje codificado con Enigma sabe que ninguna de las letras en la clave del mensaje descifrada puede ser la correcta. En nuestro ejemplo, interceptar la clave “PWE” nos dice que “P” no es la primera letra, “W” no es la segunda y “E” no es la tercera.

Si la clave del mensaje se envía dos veces, como solía hacer el ejército alemán, también sabemos que la primera letra no puede ser “H”, la segunda no puede ser “V” y la tercera no puede ser “F”. Esto reduce la cantidad de búsqueda necesaria para encontrar las letras del texto plano de la clave del mensaje, porque ya podemos excluir dos opciones para cada letra de la clave.

Paso 3: Cifrar el mensaje utilizando la clave del mensaje sin cifrar

Una vez que la clave del mensaje había sido elegida y cifrada, el operador ajustaba los rotores a la versión sin cifrar de la clave que había elegido y escribía el mensaje en el teclado.

Los números debían escribirse completamente en palabras, ya que la máquina Enigma no tenía teclas numéricas. Además, no había barra espaciadora, por lo que a menudo se usaba una ‘X’ para indicar un espacio. Por ejemplo, si queríamos cifrar “este mensaje es secreto”, escribiríamos “ESTEXMENSAJEXESXSECRETO”.

Paso 4: Enviar el mensaje cifrado por radio

Un operador de radio enviaba la clave cifrada y el mensaje en código Morse, utilizando distintivos de llamada y texto abreviado, de forma similar a cómo usamos abreviaturas en los mensajes de texto para reducir la cantidad de escritura necesaria.

Encriptando un mensaje.

Para poder emular la máquina "enigma" en python necesitaremos instalar el paquete py-enigma.

Crea un entorno virtual con:

python3 -m venv miEntorno
source ./miEntorno/bin/activate
pip3 install py-enigma

Luego utiliza el IDLE que más te guste y crea el archivo encriptar.py

Lo primero que tenemos que hacer es importar la clase EnigmaMachine desde el módulo py-enigma de la siguiente forma:

from enigma.machine import EnigmaMachine

Tendríamos que ver en que día del mes estamos pero para esta práctica vamos a suponer que estamos a día uno. Si consultamos la hoja de configuraciones de la máquina enigma que vimos anteriormente para el día uno vemos que son las siguientes:

enigma

En tu archivo de Python, configura un objeto EnigmaMachine utilizando los ajustes de tu hoja de configuraciones. Cada ajuste debe ser una cadena y escribirse exactamente como aparece en la hoja. Por ejemplo, los rotores se configurarían como 'IV I V'.

# configuración de la máquina enigma
machine = EnigmaMachine.from_key_sheet(
    rotors='IV I IV',
    reflector='B',
    ring_settings='20 5 10',
    plugboard_settings='SX KU QP VN JG TC LA WM OB ZF'
)

Como ya comentamos usaremos el reflector B para todos los programas.

Escribe otra línea de código para establecer la posición inicial de los rotores, la configuración está al final de la hoja de configuraciones para el día 1.

# Establecemos la posición inicial de los rotores.
machine.set_display('FNZ')

Elige tres letras al azar para usar como tu clave de cifrado; usaremos "BLA", pero puedes elegir las que quieras. Cifra la clave del mensaje y anota el resultado. Esta será la clave cifrada que enviarás junto con tu mensaje.

# Encripta el texto 'BFR' y guardalo como msg_key
msg_key = machine.process_text('BLA')
print(msg_key)


Si ejecutas el código deberías obtener la siguiente salida del programa:

(miEntorno) usuario:~/enigma$ python3 encriptar.py 
LHU

Escribe una línea de código para restablecer las posiciones iniciales de los rotores a tu clave de cifrado (en nuestro ejemplo, “BLA”).

Luego, escribe un código para procesar el texto plano “LOSXRUSOSXSEXACERCAN” y mostrar el texto cifrado resultante.

# Encriptamos el texto plano a enviar
machine.set_display('BLA')    # usamos la clave de cifrado BLA
ciphertext = machine.process_text('LOSXRUSOSXSEXACERCAN')
print(ciphertext)



Si has usado la clave de cifrado "BLA", el texto cifrado esperado debería ser "JLISVXPGICEZSMQFKXFK". Si has escogido una clave diferente entonces el texto cifrado no será el mismo.

Desencriptando el mensaje

Imagina que eres un operador de la máquina enigma y acabas de recibir este mensaje:

LHU JLISVXPGICEZSMQFKXFK


Vamos a escribir código de Python que nos permita, utilizando el módulo Py-enigma simular que estamos usando una máquina enigma para desencriptar el mensaje.

Abre le IDLE que estés utilizando y crea un archivo llamado desencriptar.py

Consultando la hoja de configuración de la máquina enigma encuentras que esta es la línea que corresponde con el día y hora de envió del mensaje. En nuestro caso es el mismo día y misma hora que usamos para la codificación.

enigma

Dentro del archivo que has creado, importa la clase EnigmaMachine igual que hicimos anteriormente, y configura la maquina igual que hicimos antes. El código sería algo como esto:

# configuración de la máquina enigma
machine = EnigmaMachine.from_key_sheet(
    rotors='IV I IV',
    reflector='B',
    ring_settings='20 5 10',
    plugboard_settings='SX KU QP VN JG TC LA WM OB ZF'
)

Añadiremos también el código necesario para establecer la posición inicial de los rotores.

# Establecemos la posición inicial de los rotores.
machine.set_display('FNZ')

El operador de radio te ha enviado la clave "LHU" como llave para este mensaje. Antes de enviarla la clave estaba encriptada para impedir que algún espía la pudiera interceptar. Por tanto para leer el mensaje lo primero que tenemos que hacer es desencriptar la clave que hemos recibido para poder usar la clave real de desencriptado.

# Desencriptamos el texto 'LHU' para obtener el msg_key
msg_key = machine.process_text('LHU')
print(msg_key)
Si ejecutas el programa obtendrás la clave real utilizada anteriormente que era, en mi caso "BLA".

Ya solo nos queda desencriptar el mensaje.

# Reiniciamos la posición inicial de los rotores para decodificar el mensaje principal
# usando la clave original
machine.set_display(msg_key)

# Decodificamos el texto cifrado
texto_cifrado = 'JLISVXPGICEZSMQFKXFK'
texto_plano = machine.process_text(texto_cifrado)

print(texto_plano)

Si todo ha ido bien al desencriptar el mensaje deberías ver lo siguiente:

LOSXRUSOSXSEXACERCAN

Ejemplo de procedimiento de comunicación.

La Wehrmacht tenía diversos procedimientos elaborados para transmitir y recibir mensajes. Estos procedimientos variaban según la rama del servicio y también cambiaban a lo largo de la guerra. En general, los procedimientos de la Kriegsmarine eran más complejos e implicaban no solo hojas de claves, sino también otros documentos auxiliares. Además, cada rama del ejército tenía sus propias convenciones para codificar abreviaturas, números, caracteres de espacio, nombres de lugares, etc. Palabras o frases importantes podían necesitar ser repetidas o resaltadas de alguna manera.

Supongamos que se necesita transmitir un mensaje. El operador de la máquina transmisora consulta su hoja de claves y configura su máquina de acuerdo con los ajustes diarios indicados en ella. 

Según la wikipedia, el siguiente, es un mensaje auténtico enviado el 7 de julio de 1941 por la División SS-Totenkopf sobre la campaña contra Rusia, en la Operación Barbarroja. El mensaje (enviado en dos partes) fue descifrado por Geoff Sullivan y Frode Weierud, dos miembros del Crypto Simulation Group (CSG).

Puedes observar como los caracteres se mostraban en grupos de 5 caracteres.

1840 - 2TLE 1TL 179 - WXC KCH
RFUGZ EDPUD NRGYS ZRCXN
UYTPO MRMBO FKTBZ REZKM
LXLVE FGUEY SIOZV EQMIK
UBPMM YLKLT TDEIS MDICA
GYKUA CTCDO MOHWX MUUIA
UBSTS LRNBZ SZWNR FXWFY
SSXJZ VIJHI DISHP RKLKA
YUPAD TXQSP INQMA TLPIF
SVKDA SCTAC DPBOP VHJK

2TL 155 - CRS YPJ
FNJAU SFBWD NJUSE GQOBH
KRTAR EEZMW KPPRB XOHDR
OEQGB BGTQV PGVKB VVGBI
MHUSZ YDAJQ IROAX SSSNR
EHYGG RPISE ZBOVM QIEMM
ZCYSG QDGRE RVBIL EKXYQ
IRGIR QNRDN VRXCY YTNJR
SBDPJ BFFKY QWFUS
El mensaje fue cifrado para el modelo de tres rotores con el reflector B. Para descifrar el mensaje, primero hay que configurar la máquina con la información diaria especificada en los libros de códigos alemanes para ese mes. Para el 7 de julio de 1941 era:

Tag  Walzenlage  Ringstellung  ---- Steckerverbindungen ----
  7  II  IV  V     02 21 12    AV BS CG DL FU HZ IN KM OW RX
El operador de la máquina debía colocar esa configuración antes de enviar o recibir el primer mensaje del día. Cogería los rotores 2, 4 y 5 (en ese orden), y movería el anillo de cada rotor a las posiciones 2, 21 y 12 respectivamente (a veces la configuración se puede ver en las letras correspondientes a la posición del anillo; en este caso serían B U L), y los insertaría en la máquina. También debía colocar los cables conectores uniendo en la parte baja de la máquina las posiciones que se indican, uniendo A con V, B con S, C con G, etc. Esta configuración se mantendrá en todos los mensajes del día, y con ella ya se pueden empezar a descifrar mensajes.

El mensaje original se envió en dos partes (ya que el tamaño máximo por cada mensaje era de 250 letras). Cada mensaje tiene una cabecera, que se enviaba sin cifrar (y es la única parte del mensaje que podía tener números); en este caso:

1ª parte del mensaje:
1840 - 2TLE 1TL 179 - WXC KCH
2ª parte del mensaje:

2TL 155 - CRS YPJ
En la cabecera se indicaba la hora a la que se mandaba el mensaje (en este caso 1840 representa las 18:40), cuántas partes componían el mensaje (seguido de TLE, de Teile) y qué parte era (seguido de TL, de Teil) si había más de una, el tamaño del texto cifrado y dos grupos de tres letras (que eran diferentes y aleatorios en cada mensaje). El primer grupo era la configuración inicial y el segundo la clave cifrada del mensaje. 

El operador moverá los tres rotores a la letra indicada por el primer grupo (W X C), y tecleará el otro grupo, la clave cifrada (K C H), que le dará al operador la clave sin cifrar, en este caso B L A). 

Si traducimos esto a lo que hemos visto en código python obtendremos lo siguiente:

from enigma.machine import EnigmaMachine

# Configuración de la máquina Enigma
machine = EnigmaMachine.from_key_sheet(
    rotors='II IV V',
    reflector='B',
    ring_settings='2 21 12',
    plugboard_settings='AV BS CG DL FU HZ IN KM OW RX'
)

# Establecemos la posición inicial de los rotores
machine.set_display('WXC')

# Desencriptamos el texto 'KCH' para obtener el msg_key
msg_key = machine.process_text('KCH')
print(msg_key)

Si lo ejecutas la salida será "BLA".

A continuación pondrá los tres rotores en las posiciones B L A y tecleará el resto del mensaje cifrado, teniendo en cuenta que las cinco primeras letras corresponden al Kenngruppe, que indicará quiénes pueden leer el mensaje (ten cuidado de ignorarlas, es decir no las pongas en el mensaje a desencriptar).

# Reiniciamos la posición inicial de los rotores para decodificar el mensaje principal
# usando la clave original
machine.set_display(msg_key)

# Decodificamos el texto cifrado
texto_crudo = """EDPUD NRGYS ZRCXN
UYTPO MRMBO FKTBZ REZKM
LXLVE FGUEY SIOZV EQMIK
UBPMM YLKLT TDEIS MDICA
GYKUA CTCDO MOHWX MUUIA
UBSTS LRNBZ SZWNR FXWFY
SSXJZ VIJHI DISHP RKLKA
YUPAD TXQSP INQMA TLPIF
SVKDA SCTAC DPBOP VHJK"""
# Unir todo el texto en una única línea y quitar espacios
texto_cifrado = texto_crudo.replace("\n", "").replace(" ", "")

texto_plano = machine.process_text(texto_cifrado)

# Remplazamos las X por espacios
texto_espaciado = texto_plano.replace("X", " ")

print(texto_espaciado)

Si lo ejecutas deberías obtener:
AUFKL ABTEILUNG VON KURTINOWA KURTINOWA NORDWESTL SEBEZ SEBEZ UAFFLIEGERSTRASZERIQTUNG DUBROWKI DUBROWKI OPOTSCHKA OPOTSCHKA UM EINSAQTDREINULL UHRANGETRETEN ANGRIFF INF RGT
y modificando el código para la segunda parte del texto obtenemos:

from enigma.machine import EnigmaMachine

# Configuración de la máquina Enigma
machine = EnigmaMachine.from_key_sheet(
    rotors='II IV V',
    reflector='B',
    ring_settings='2 21 12',
    plugboard_settings='AV BS CG DL FU HZ IN KM OW RX'
)

# Establecemos la posición inicial de los rotores
machine.set_display('CRS')

# Desencriptamos el texto 'YPJ' para obtener el msg_key
msg_key = machine.process_text('YPJ')
print(msg_key)

# Reiniciamos la posición inicial de los rotores para decodificar el mensaje principal
# usando la clave original
machine.set_display(msg_key)

# Decodificamos el texto cifrado
texto_crudo = """SFBWD NJUSE GQOBH
KRTAR EEZMW KPPRB XOHDR
OEQGB BGTQV PGVKB VVGBI
MHUSZ YDAJQ IROAX SSSNR
EHYGG RPISE ZBOVM QIEMM
ZCYSG QDGRE RVBIL EKXYQ
IRGIR QNRDN VRXCY YTNJR
SBDPJ BFFKY QWFUS"""
# Unir todo el texto en una única línea y quitar espacios
texto_cifrado = texto_crudo.replace("\n", "").replace(" ", "")

texto_plano = machine.process_text(texto_cifrado)

Remplazamos las X por espacios
texto_espaciado = texto_plano.replace("X", " ")

print(texto_espaciado)

Cuya salida es:
DREIGEHTLANGSAMABERSIQERVORWAERTS EINSSIEBENNULLSEQS UHR ROEM EINS INFRGT DREI AUFFLIEGERSTRASZEMITANFANG EINSSEQS KM KM OSTW KAMENEC KAMENEC DIV KDR 
Si unimos ambas partes:

AUFKL ABTEILUNG VON KURTINOWA KURTINOWA NORDWESTL SEBEZ SEBEZ UAFFLIEGERSTRASZERIQTUNG DUBROWKI DUBROWKI OPOTSCHKA OPOTSCHKA UM EINSAQTDREINULL UHRANGETRETEN ANGRIFF INF RGT
DREIGEHTLANGSAMABERSIQERVORWAERTS EINSSIEBENNULLSEQS UHR ROEM EINS INFRGT DREI AUFFLIEGERSTRASZEMITANFANG EINSSEQS KM KM OSTW KAMENEC KAMENEC DIV KDR 
Los nombres propios se ponían dos veces seguidas (por ejemplo, KURTINOWA), y algunas combinaciones de letras se sustituían, por ejemplo, CH por Q (en SIQER, que es sicher), y los números debían escribirse con letras. 

La traducción aproximada al español sería:

"Unidad de reconocimiento de Kurtinowa,  noroeste de Sebez. Sebez en dirección de la carretera de avance Dubrowki, Opotschka. Movilizada a las 18:30 horas. Ataque del regimiento de infantería tres avanza lentamente pero de manera segura. A las 17:06 horas el regimiento de infantería tres en la carretera de avance a 16 km al este de Kamenec. Cuartel general de la división."

Algunas palabras pueden tener errores tipográficos o ser abreviaturas propias de la Wehrmacht, lo que podría afectar ligeramente la interpretación.