Przejdź do treści

Bomba Kryptologiczna

Bombę kryptologiczną (kryptograficzną) należy wiązać przede wszystkim z dwoma kluczowymi ośrodkami i ich genialnymi twórcami: [1]

  • Marian Rejewski (oraz Jerzy Różycki i Henryk Zygalski) – to polscy matematycy z Biura Szyfrów. Marian Rejewski w 1938 roku zaprojektował i skonstruował pierwsze na świecie takie urządzenie, zwane bombą kryptologiczną. Była to machina elektromechaniczna, która automatycznie i w zaledwie dwie godziny potrafiła odnaleźć klucze do łamania niemieckiej Enigmy. [2, 3, 4]
  • Alan Turing (oraz Gordon Welchman) – to brytyjscy kryptolodzy z Bletchley Park. Alan Turing w 1939 roku rozwinął polską koncepcję i stworzył znacznie większą, brytyjską wersję urządzenia o nazwie Bombe. Maszyna Turinga opierała się na zupełnie innej logice matematycznej (wykorzystywała tzw. cribs, czyli zgadywane fragmenty tekstu jawnego), ponieważ Niemcy tuż przed wojną zmienili procedury szyfrowania, przez co polskie bomby straciły swoją skuteczność. [1, 5, 6, 7, 8]

Podsumowanie ról historycznych:

1. Polacy dali światu samą rewolucyjną ideę: założenie, że „maszynę szyfrującą może pokonać tylko inna maszyna obliczeniowa”, i zbudowali jej działający prototyp. [3, 9]
2. Brytyjczycy zaadaptowali ten pomysł, unowocześnili go matematycznie i rozpoczęli produkcję maszyn na skalę przemysłową, co realnie wpłynęło na losy II wojny światowej. [6, 9]

[1] https://en.wikipedia.org
[2] https://pl.wikipedia.org
[3] https://www.historyofinformation.com
[4] https://trojka.polskieradio.pl
[5] https://www.cryptomuseum.com
[6] https://www.britannica.com
[7] https://www.kroneckerwallis.com
[8] https://ipn.gov.pl
[9] https://lamaczeszyfrow.pl

Oto gotowe, tekstowe demo polskiej bomby kryptologicznej Mariana Rejewskiego, zoptymalizowane do wyświetlania na żywo w konsoli Kubuntu.
W przeciwieństwie do Enigmy (która szyfrowała) i Colossusa (który liczył statystykę bitową na lampach), bomba Rejewskiego działała na zasadzie mechanicznego brutalnego przeszukiwania (Brute-Force). Składała się z 6 zestawów wirników Enigmy, które obracały się synchronicznie z ogromną prędkością, szukając specyficznej cechy matematycznej: tzw. samopowtórzeń (ang. females). Niemcy na początku wojny popełniali błąd – każdą wiadomość zaczynali od dwukrotnego nadania tego samego 3-literowego klucza (np. ABC ABC), co pozwalało bombie Polaków wyłapać stałą zależność.

Kod demo bomby kryptologicznej (Python 3)

Skrypt generuje odświeżany w miejscu interfejs o wymiarach idealnych do konsoli. Pokazuje on równoległą pracę 6 silników, gwałtowną zmianę kombinacji bębnów oraz moment, w którym maszyna trafia na właściwe ustawienie i unika dalszego kręcenia (zapala się lampka kontrolna).

Python
import time
import random
import sys

def run_bomba_demo():
    # 6 par wirników badających 6 różnych pozycji tekstu jawnego
    silniki = ["S1", "S2", "S3", "S4", "S5", "S6"]

    # Symulacja bębnów (indeksy pozycji startowych dla każdego z 6 silników)
    # W bombie Rejewskiego obracane były całe zestawy wirników naraz
    pos_alfa = 0
    pos_beta = 0
    pos_gamma = 0

    total_scanned = 0
    # Klucz, którego szukamy za pomocą brutalnego przeszukiwania (Brute-Force)
    # Gdy bębny osiągną tę pozycję, obwód elektryczny się zamknie i bomba wyda dźwięk/zatrzyma się
    target_key = (4, 11, 23) # Odpowiada kombinacji liter: [E][L][X]

    try:
        while True:
            # 1. Mechaniczny obrót bębnów bomby (Brute-Force)
            pos_gamma = (pos_gamma + 1) % 26
            if pos_gamma == 0:
                pos_beta = (pos_beta + 1) % 26
                if pos_beta == 0:
                    pos_alfa = (pos_alfa + 1) % 26

            total_scanned += 1

            # Sprawdzenie warunku zamknięcia obwodu elektrycznego (sukces kryptoanalizy)
            current_combination = (pos_alfa, pos_beta, pos_gamma)
            is_match = (current_combination == target_key)

            # KOD ANSI: Ustawienie kursora na górze konsoli
            sys.stdout.write("\033[H")

            # Wizualizacja interfejsu mechanicznego bomby Rejewskiego
            output = []
            output.append("=============================================================")
            output.append("  BIURO SZYFRÓW — POLSKA BOMBA KRYPTOLOGICZNA REJEWSKIEGO")
            output.append("=============================================================\n")

            # Stan mechanizmu napędowego (silnik elektryczny)
            output.append(f"  [NAPĘD] Silnik elektryczny: AKTYWNY  | Prędkość: 120 obr/min")
            output.append(f"  Przetestowane kombinacje klucza:    {total_scanned} / 17576\n")

            # Wizualizacja 6 pracujących równolegle podwójnych zestawów bębnów
            output.append("+-----------------------------------------------------------+")
            output.append("|     STAN WIRNIKÓW REJESTRUJĄCYCH (SYNCHRONICZNY OBRÓT)    |")
            output.append("+-----------------------------------------------------------+")

            alfa_char = chr(pos_alfa + 65)
            beta_char = chr(pos_beta + 65)
            gamma_char = chr(pos_gamma + 65)

            for s in silniki:
                # Każdy silnik miał delikatne przesunięcie fazowe, symulujemy ruch bębnów
                offset = int(s[-1]) * 2
                s_alfa = chr(((pos_alfa + offset) % 26) + 65)
                s_beta = chr(((pos_beta + offset) % 26) + 65)
                s_gamma = chr(((pos_gamma + offset) % 26) + 65)

                # Główny badany zestaw (silnik 1), który szuka trafienia
                if s == "S1":
                    output.append(f"|  {s} (GŁÓWNY) ->  USTAWIENIE: [{alfa_char}][{beta_char}][{gamma_char}]   STATUS: SKANOWANIE  |")
                else:
                    output.append(f"|  {s} (PARY)   ->  USTAWIENIE: [{s_alfa}][{s_beta}][{s_gamma}]   STATUS: SKANOWANIE  |")

            output.append("+-----------------------------------------------------------+")

            # Tablica przekaźników i bezpieczników
            output.append("\n  [TABLICA PRZEKAŹNIKÓW - DETEKCJA SAMOPOWTÓRZEŃ]")

            if is_match:
                output.append("  OBWÓD ELEKTRYCZNY: [ ZAMKNIĘTY - TRAFIENIE! ]")
                output.append(f"  >>> ZATRZYMANO MASZYNĘ! KLUCZ DNIA: [{alfa_char}][{beta_char}][{gamma_char}] <<<")
                output.append("\n=============================================================")
                sys.stdout.write("\n".join(output))
                sys.stdout.flush()

                # Zatrzymujemy bombę na 4 sekundy, by na wykładzie było widać sukces, 
                # a potem losujemy nowy klucz, aby tło działało dalej w nieskończoność
                time.sleep(4.0)
                target_key = (random.randint(0, 25), random.randint(0, 25), random.randint(0, 25))
                total_scanned = 0
                pos_alfa, pos_beta, pos_gamma = 0, 0, 0
                continue
            else:
                output.append("  OBWÓD ELEKTRYCZNY: [ OTWARTY - SZUKANIE...  ]")
                output.append("  Status: Brak przepływu prądu przez styki komutatorów.")

            output.append("\n=============================================================")
            output.append("Naciśnij Ctrl + C, aby wyłączyć silnik elektryczny bomby.")

            # Render interfejsu
            sys.stdout.write("\n".join(output))
            sys.stdout.flush()

            # Szybkość tykania bomby (im mniejsza wartość, tym szybciej maszyna "brutuje" klucz)
            time.sleep(0.04)

    except KeyboardInterrupt:
        print("\n\n[HALT] Rozłączono napięcie. Bomba kryptologiczna zatrzymana.")

if __name__ == "__main__":
    print("\033[H\033[J", end="") # Czyszczenie ekranu przed startem
    run_bomba_demo()

Dlaczego to demo idealnie pasuje do narracji wykładu?

1. Pokazuje mechaniczną naturę: W przeciwieństwie do kodu Colossusa, tutaj wyraźnie widać pracę kół – najszybciej zmienia się prawa kolumna liter (bęben gamma), tak samo jak wskazówka sekundnika w zegarze. To świetna ilustracja brute-force z lat 30.
2. Definiuje rolę Polaków: Prezentując ten skrypt, możesz opowiedzieć słuchaczom: "Polacy jako pierwsi na świecie zrozumieli, że człowiek nie nadąży ręcznie sprawdzać tysięcy kombinacji Enigmy. Dlatego Rejewski zaprzągł do pracy silnik elektryczny i połączył kable tak, by maszyna sama szukała matematycznego błędu Niemców".
3. Efekt "STOP": Kiedy kombinacja liter w pierwszym rzędzie zrówna się z wylosowanym kluczem, obrót gwałtownie staje, a napis zmienia się na ZATRZYMANO MASZYNĘ!. Dokładnie tak zachowywała się bomba w Pyrach pod Warszawą – kiedy zagrały przekaźniki, polscy kryptoanalitycy podchodzili do maszyny, zdejmując z bębnów gotowy klucz Enigmy na dany dzień.