Enigma a C#

Co je Enigma?
Enigma je elektromechanický šifrovací stroj, který byl široce používán německou armádou během druhé světové války. Na rozdíl od klasických ručních šifer, Enigma kombinovala rotory, reflektor a plugboard, aby vytvořila velmi složité šifrování. Výsledkem bylo, že každý znak textu byl transformován na jiný znak a tato transformace se neustále měnila s každým stiskem klávesy.
Princip fungování Enigmy
- Rotory – hlavní komponenta Enigmy. Každý rotor nahrazuje písmeno jiným písmenem a po každém stisknutí klávesy se rotor mírně otočí, čímž se mění substituce.
- Reflektor – rotor, který odráží signál zpět přes rotory, aby umožnil obousměrné šifrování, což znamená, že stejný stroj s tímto nastavením může šifrovat i dešifrovat.
- Plugboard (steckerbrett) – přepojovací panel, který umožňuje dodatečné párování písmen před vstupem do rotorů, čímž se zvyšuje složitost šifry.
- Denní nastavení – kombinace rotorů, jejich počátečních pozic a zapojení plugboardu tvořila tzv. denní klíč, který musel být předem znám jak u odesílatele, tak u příjemce.
Bezpečnost Enigmy
Enigma byla v době svého používání považována za velmi bezpečnou, protože počet možných konfigurací byl astronomický – kombinace rotorů, jejich pořadí, počáteční pozice a plugboardu poskytovala stovky trilionů možností. Přesto byla prolomena díky kombinaci:
- systematické práce kryptografů, zejména Alana Turinga a jeho týmu v Bletchley Parku,
- chybám v používání šifrovacích klíčů,
- využití známého textu a statistik při prolomení denních klíčů.
Příklad šifrování textu HELLO
V Enigmě nelze jednoduše demonstrovat kompletní proces ručně, protože výsledné písmeno závisí na aktuální pozici rotorů a plugboardu. Pro ilustraci lze uvést simulovaný výsledek při jednom konkrétním nastavení:
Text: HELLO
Zašifrovaný text: MFNCZ
Každé písmeno se mění podle složitého elektrického průchodu přes rotory a plugboard, a při každém stisku klávesy se konfigurace rotorů posune, takže další písmeno má úplně jinou substituci.
Implementace Enigma v C#
Zjednodušená
Implementace plné Enigmy je složitá, ale zjednodušenou verzi lze demonstrovat jedním rotorem a substituční tabulkou:
using System;
using System.Collections.Generic;
class SimpleEnigma
{
private string rotor = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"; // zjednodušený rotor
private int position = 0;
private char EncryptChar(char c)
{
if (!char.IsLetter(c)) return c;
int index = (c - 'A' + position) % 26;
char encrypted = rotor[index];
position = (position + 1) % 26;
return encrypted;
}
public string Encrypt(string input)
{
input = input.ToUpper();
var result = "";
foreach (var c in input)
result += EncryptChar(c);
return result;
}
}
class Program
{
static void Main()
{
var enigma = new SimpleEnigma();
string plaintext = "HELLO";
string encrypted = enigma.Encrypt(plaintext);
Console.WriteLine($"Původní text: {plaintext}");
Console.WriteLine($"Zašifrovaný text: {encrypted}");
}
}
Plná
plná implementace Enigmy je o něco komplexnější, protože musí obsahovat:
- více rotorů, každý s vlastním posunem a zapojením,
- reflektor, který odráží signál zpět,
- plugboard (steckerbrett) pro párování písmen,
- rotaci rotorů (tzv. stepping), včetně „double-step“ mechanismu.
Níže je plná implementace Enigma v C#.
using System;
using System.Collections.Generic;
using System.Linq;
namespace EnigmaMachine
{
class Rotor
{
public string Wiring { get; }
public char Notch { get; }
public int Position { get; set; }
public Rotor(string wiring, char notch, char initialPosition)
{
Wiring = wiring;
Notch = notch;
Position = initialPosition - 'A';
}
public char Forward(char c)
{
int idx = (c - 'A' + Position) % 26;
return Wiring[idx];
}
public char Backward(char c)
{
int idx = Wiring.IndexOf(c);
int result = (idx - Position + 26) % 26;
return (char)(result + 'A');
}
public bool AtNotch() => (Position + 'A') == Notch;
public void Step() => Position = (Position + 1) % 26;
}
class Enigma
{
private Rotor[] rotors;
private Dictionary<char, char> plugboard;
private string reflector;
public Enigma(Rotor[] rotors, string reflector, Dictionary<char, char> plugboard = null)
{
this.rotors = rotors;
this.reflector = reflector;
this.plugboard = plugboard ?? new Dictionary<char, char>();
}
private char SwapPlugboard(char c)
{
return plugboard.ContainsKey(c) ? plugboard[c] : c;
}
private void StepRotors()
{
if (rotors[1].AtNotch())
{
rotors[0].Step();
rotors[1].Step();
}
else if (rotors[2].AtNotch())
{
rotors[1].Step();
}
rotors[2].Step();
}
public string Encrypt(string text)
{
text = text.ToUpper().Where(char.IsLetter).Aggregate("", (s, c) => s + c);
var result = "";
foreach (var c in text)
{
StepRotors();
char current = SwapPlugboard(c);
for (int i = rotors.Length - 1; i >= 0; i--)
current = rotors[i].Forward(current);
current = reflector[current - 'A'];
for (int i = 0; i < rotors.Length; i++)
current = rotors[i].Backward(current);
current = SwapPlugboard(current);
result += current;
}
return result;
}
}
class Program
{
static void Main()
{
var rotorI = new Rotor("EKMFLGDQVZNTOWYHXUSPAIBRCJ", 'Q', 'A');
var rotorII = new Rotor("AJDKSIRUXBLHWTMCQGZNPYFVOE", 'E', 'A');
var rotorIII = new Rotor("BDFHJLCPRTXVZNYEIWGAKMUSQO", 'V', 'A');
string reflectorB = "YRUHQSLDPXNGOKMIEBFZCWVJAT";
var plugboard = new Dictionary<char, char> {
{'A','B'}, {'B','A'}, {'C','D'}, {'D','C'}
};
var enigma = new Enigma(new[] { rotorI, rotorII, rotorIII }, reflectorB, plugboard);
string plaintext = "HELLO";
string encrypted = enigma.Encrypt(plaintext);
Console.WriteLine($"Původní text: {plaintext}");
Console.WriteLine($"Zašifrovaný text: {encrypted}");
var decrypted = enigma.Encrypt(encrypted);
Console.WriteLine($"Dešifrovaný text: {decrypted}");
}
}
}
Vysvětlení
- Rotory – tři rotory s nastavitelnou počáteční pozicí a „notch“ pro posun dalších rotorů.
- Reflektor – jednoduchý substituční řetězec, který odráží písmena zpět.
- Plugboard – umožňuje předem definované párování písmen.
- Kroky rotorů – implementuje mechaniku Enigmy včetně double-stepping efektu.
- Šifrování a dešifrování – stejná metoda, protože Enigma je symetrická.
Závěr
Enigma ukazuje, jak kombinace mechanických a elektrických prvků dokáže vytvořit extrémně složité šifrování. Přestože byla v době druhé světové války považována za téměř neprůstřelnou, její prolomení ukázalo, že i velmi složité šifry lze překonat kombinací matematiky, statistiky a znalostí systému. Enigma je dnes ikonou kryptografie a důležitým historickým příkladem evoluce šifrovacích metod.