Tento projekt vznikl v rámci předmětu BPC-VBA. Naším cílem bylo vytvořit program v jazyce C simulující šifrovací stroj Enigma.
Kód je členěn do několika logických sektorů. Nejprve jsou inicializovány jednotlivé komponenty - plugboard, rotory a reflektor. Plugboard umožňuje manuální změnu mapování jednotlivých písmen. Rotory jsou 3 a pro každý z nich je definována substituce pro průchod šifrovaného znaku v obou směrech. Reflektor přijímá výstup z posledního rotoru a připraví jej pro zpětný průchod rotory. Hodnoty jednotlivých proměnných jsou uloženy v příslušných strukturách, které jsou definovány v souboru enigma.h. Následují funkce pro samotné šifrování. Jejich princip je obdobný, jedním z parametrů je vždy šifrované písmeno, které je patřičně substituováno. Jednotlivé kroky šifrování propojuje funkce enigmaEncChar()
. Znak je nejprve odeslán do plugboardu, následuje průchod rotory, reflektorem a opět se vrací přes rotory do plugboardu.
Pro jednotlivé funkce byly vytvořeny odpovídající jednotkové testy ověřující správnou funkčnost kódu.
Po spuštění aplikace je uživateli zobrazeno defaultní nastavení Enigmy a prostřednictvím terminálu je vyzván k výběru jedné z nabízených funkcionalit programu, kterými je šifrování, dešifrování a vytvoření nové Enigmy. Svou volbu provede zadáním příslušného vstupu z klávesnice.
Šifrování a dešifrování
V případě šifrování či dešifrování uživatel zadá do terminálu vstup obsahující pouze abecední znaky bez diakritiky. Při zadávání textu nezáleží na použití velkých a malých písmen. Jakékoliv jiné znaky, včetně interpunkčních znamének a mezer, způsobí výpis chybové hlášky.
Vytvoření nové Enigmy
Uživatel má možnost změnit počáteční nastavení plugboardu, vybrat 3 z nabídky 5 dostupných rotorů, startovní pozici rotoru a pozici vnitřního kroužku rotoru. Proces je následujicí:
- Pro změnu zapojení plugboardu je nezbytné zadat 6 dvojic pouze abecedních znaků oddělených mezerami. Pořadí znaků ve dvojici určuje, odkud kam bude písmeno mapováno.
- Výběr rotorů je proveden zadáním římské číslice z rozsahu I až V. Jednotlivé výběry budou odděleny mezerami.
- Změna nastavení počáteční pozice pro vybrané rotory proběhne zadáním příslušných abecedních znaků, které budou odděleny mezerami.
- Změna nastavení počáteční pozice vnitřního kroužku jednotlivých rotorů proběhne analogicky jako v předchozím případě.
Jestliže bude zadán chybný vstup, bude uživatel informován prostřednictvím výpisu v terminálu.