Inleiding §
Het Enigma codeersysteem was een veldcodeermachine die door de Duitsers werd gebruikt tijdens de Tweede Wereldoorlog. De Enigma is een van de bekendste historische codeermachines, en verwijst eigenlijk naar een reeks gelijksoortige codeermachines. De eerste Enigma machine werd uitgevonden door een Duitse ingenieur, Arthur Scherbius, op het einde van de eerste wereldoorlog. Ze werd commercieel gebruikt vanaf het begin van de jaren 1920, en werd ook gebruikt door het leger en de regeringsdiensten van een aantal naties – het meest bekend door Nazi Duitsland voor en tijdens de Tweede Wereldoorlog. Er werden verschillende modellen Enigma geproduceerd, maar het Duitse militaire model, de Wehrmacht Enigma, is de meest besproken versie.
Als je zelf wat Enigma berichten wilt vercijferen, kijk dan eens naar het javascript voorbeeld.
Het algoritme §
Dit gedeelte gaat over de Enigma I aka Wehrmacht Enigma, andere varianten zijn vergelijkbaar in werking. De ‘sleutel’ voor de enigma bestaat uit verschillende elementen:
- De rotors en hun volgorde
- De rotor startposities
- De ringstellung, of ring instellingen
- Steckerverbindungen, of stekkerbord instellingen
Voor informatie over de procedures die de Duitsers tijdens WO2 gebruikten bij het verzenden van Engima berichten, inclusief hoe de indicatoren werden ingesteld, zie deze beschrijving.
De rotors §
Aannemend dat onze rotors I,II,III zijn, van links naar rechts bewegend, en we proberen de letter ‘A’ te vercijferen. We nemen aan dat elke rotor in zijn startpositie staat als de letter ‘A’ vercijferd wordt (‘AAA’). Aangezien onze rotors I,II,III van links naar rechts bewegen, zal het karakter A eerst door rotor III gaan. Elke rotor past een eenvoudige substitutie operatie toe. De substitutietabel voor rotor III is hieronder te zien.
ABCDEFGHIJKLMNOPQRSTUVWXYZBDFHJLCPRTXVZNYEIWGAKMUSQO
B wordt vervangen door D, C wordt vervangen door F enz. Dus nadat de letter ‘A’ door de rotor is gegaan, komt hij eruit als een ‘B’. De letter ‘B’ wordt nu ingevoerd door rotor II, waar hij wordt vervangen door ‘J’ enz. Dit kan het best worden weergegeven met behulp van een tabel (voor een volledige beschrijving van de rotorbedrading voor elke rotor, zie deze wikipedia pagina):
III | II | I | Reflector | inv(I) | inv(II) | inv(III) |
A -> B | B – > B | B – | inv(III) | |||
A -> B | B -.> J | J -> Z | Z -> T | T -> L | L -> K | K -> U |
Nadat de brief door rotors III,II,I gaat, raakt hij de reflector en ondergaat nog een eenvoudige substitutie. Nadat de letter uit de reflector komt, wordt hij terug door de rotors gestuurd in omgekeerde richting (dit betekent dat de inverse substitutie wordt toegepast). We zien in de tabel dat nadat de vercijferde letter op het einde terug uit rotor III komt, we overblijven met de letter U. Een belangrijke stap die ik nog niet vermeld heb, is het feit dat de rotors incrementeren vooraleer elke letter vercijferd wordt. Als de startposities van de rotors ‘FEQ’ zijn, dan worden ze eerst verhoogd tot ‘FER’ alvorens de eerste letter wordt vercijferd.
Het verhogen van de rotors §
Een veelgemaakte fout bij het implementeren van het enigma is te veronderstellen dat de rotors werken als een standaard odometer, er zijn echter een paar belangrijke verschillen. Elke rotor heeft een inkeping die de rotor links ervan doet stappen. Rotor I zorgt ervoor dat de volgende rotor een stap zet bij de overgang van Q naar R, rotor II bij de overgang van E naar F enz. Rotors I tot en met V zijn gebruikt in het Wermacht enigma, later werden meer rotors toegevoegd die twee inkepingen hadden.
I | II | III | IV | V | VI | VII | VIII |
Q | E | V | J | Z | Z,M | Z,M | Z,M |
Er is nog een extra verwarrend detail, namelijk dat van ‘double stepping’. Wanneer een rotor stapt, veroorzaakt dit ook een stap van de rotor rechts ervan. Dit wordt niet opgemerkt wanneer de tweede rotor stapt, omdat de eerste rotor bij elke toetsaanslag stapt. Wanneer echter de derde (meest linkse) rotor een stap zet, doet dit de tweede rotor ook een stap zetten. Dit betekent dat de periode van de machine niet 26x26x26 is, maar slechts 26x25x26.
De Ringstellung §
De Ringstellung (ring instellingen) worden over het algemeen gegeven als een 3 letter reeks b.v. ‘FAM’ (of als getallen tussen 1 en 26, die de letters voorstellen). In de vorige bespreking heb ik aangenomen dat de eenvoudige substitutie vercijfering van elke rotor vast was. De ringinstellingen bieden de mogelijkheid om het substitutiecijfer als volgt te verschuiven. Met een ringinstelling van ‘A’ (of 1), ziet de substitutie van rotor I er als volgt uit:
ABCDEFGHIJKLMNOPQRSTUVWXYZEKMFLGDQVZNTOWYHXUSPAIBRCJ
Met een ringinstelling van ‘B’ (of 2), ziet de substitutie van rotor I er als volgt uit:
ZABCDEFGHIJKLMNOPQRSTUVWXYEKMFLGDQVZNTOWYHXUSPAIBRCJ
De Steckerverbindungen §
De steckerverbindungen (stekkerbord) is een extra beveiligingslaag die bestaat uit 13 draden die in stopcontacten aan de voorzijde van de enigma machine gestoken kunnen worden.Elke draad verbindt 2 letters, b.v. P met O. Deze koppelingen zijn gespecificeerd als deel van het sleutelmateriaal. Wanneer een letter wordt getypt, ondergaat hij, voordat hij in de eerste rotor gaat, de substitutie volgens het stekkerbord, en nadat de letter naar buiten komt, ondergaat hij opnieuw de substitutie volgens het stekkerbord alvorens te worden uitgevoerd. Een voorbeeld van een stekkerbord is als volgt: PO ML IU KJ NH YT GB VF RE AC (Dit betekent dat P en O worden verwisseld, M en L worden verwisseld enz.)
Als we het bovenstaande voorbeeld gebruiken waarbij de letter ‘A’ werd vercijferd met rotors I, II en III met de startposities AAA, dan was de letter A vercijferd als een U. Als we nu rekening houden met het stekkerbord, gebruik makend van de stekkerbord instellingen in de vorige paragraaf, wordt de ‘A’ eerst vertaald naar een ‘C’ alvorens te vercijferen. De vercijfering gaat verder zoals gebruikelijk, deze keer wordt de ‘C’ uitgevoerd als een ‘J’. Deze letter wordt dan opnieuw door het stekkerbord geleid om te worden vervangen door een ‘K’. Dus nu hebben we een ‘A’ die vercijferd wordt als een ‘K’ met het stekkerbord in gebruik. Het stekkerbord verhoogt de sterkte van het enigma codeerapparaat aanzienlijk, meer dan het toevoegen van nog een rotor zou kunnen.
Javascript Voorbeeld §
Plaintext
sleutelinstellingen:
ring instellingen:
Rotors:
Plug board instellingen:
Ciphertext
Andere implementaties §
Om uw eigen berichten in python te vercijferen, kunt u de pycipher-module gebruiken. Om deze te installeren, gebruikt u pip install pycipher. Om berichten te vercijferen met het Enigma codeerapparaat (of een ander codeerapparaat, zie hier voor documentatie), zie het voorbeeld hier.
Cryptanalyse §
Voor wat code om Enigma berichten automatisch te breken, zie Cryptanalyse van Enigma.
Er is veel werk gestoken in het breken van Enigma, sommige methoden zoals rodding en buttoning up werden gebruikt tijdens de tweede wereldoorlog, maar vereisen ‘cribs’, of bekende stukken klare tekst. Deze methoden worden besproken op de wikipedia pagina.
Meer moderne benaderingen zijn Jim Gillogly’s paper ‘Ciphertext only Cryptanalysis of the Enigma’. Een vervolgbrief die enkele fouten in de paper corrigeert kan hier gevonden worden. Een ander artikel dat voortbouwt op Jim Gillogly’s artikel is ‘Applying Statistical Language Recognition Techniques in the Ciphertext only Cryptanalysis of Enigma’ door Heidi Williams. Een andere interessante bron is The Cryptographic Mathematics of Enigma.