Introduktion §
Enigma-chifferet var et feltchiffer, der blev brugt af tyskerne under Anden Verdenskrig. Enigma er en af de mere kendte historiske krypteringsmaskiner, og det henviser faktisk til en række lignende krypteringsmaskiner. Den første Enigma-maskine blev opfundet af en tysk ingeniør ved navn Arthur Scherbius i slutningen af første verdenskrig. Den blev brugt kommercielt fra begyndelsen af 1920’erne og frem, og den blev også indført af militæret og de statslige tjenester i en række nationer – mest berømt af Nazityskland før og under Anden Verdenskrig. Der blev produceret en række forskellige modeller af Enigma, men den tyske militærmodel, Wehrmacht Enigma, er den version, der oftest omtales.
Hvis du gerne vil kryptere nogle af dine egne Enigma-beskeder, så tag et kig på javascript-eksemplet.
Algoritmen §
Dette afsnit vil tale om Enigma I aka Wehrmacht Enigma, andre varianter er lignende i funktion. ‘Nøglen’ til en enigmaen består af flere elementer:
- Rotorerne og deres rækkefølge
- Rotorernes startpositioner
- Ringstellung, eller ringindstillinger
- Steckerverbindungen, eller stikpladeindstillinger
For oplysninger om de procedurer, som tyskerne brugte under 2. verdenskrig, når de sendte Engima-meddelelser, herunder hvordan indikatorerne blev indstillet, se denne beskrivelse.
Rotorerne §
Antag, at vores rotorer er I,II,III, der bevæger sig fra venstre mod højre, og vi forsøger at kryptere bogstavet “A”. Vi antager indtil videre, at hver rotor er i sin startposition (‘AAA’), mens bogstavet ‘A’ krypteres.Da vores rotorer er I,II,III, der bevæger sig fra venstre mod højre, vil bogstavet A først gå gennem rotor III. Hver rotor anvender en simpel substitutionsoperation. Substitutionstabellen for rotor III kan ses nedenfor:
ABCDEFGHIJKLMNOPQRSTUVWXYZBDFHJLCPRTXVZNYEIWGAKMUSQO
B erstattes med D, C erstattes med F osv. Så efter at bogstavet “A” er gået gennem rotoren, kommer det ud som et “B”. Bogstavet “B” føres nu gennem rotor II, hvor det erstattes af “J” osv. Dette kan bedst illustreres ved hjælp af en tabel (se denne wikipedia-side for en fuldstændig beskrivelse af rotorforbindelserne for de enkelte rotorer):
III | II | I | Reflektor | inv(I) | inv(II) | inv(III) |
A -> B | B -> J | J -> Z | Z -> T | T -> L | L -> K | K -> U |
Efter at bogstavet går gennem rotorerne III,II,I, rammer det derefter reflektoren og gennemgår endnu en simpel substitution. Når bogstavet kommer ud af reflektoren, sendes det tilbage gennem rotorerne i den omvendte retning (det betyder, at den omvendte substitution anvendes).Vi kan se af tabellen, at efter at det krypterede bogstav kommer tilbage ud af rotor III til sidst, står vi tilbage med bogstavet U. Et vigtigt skridt, som jeg endnu ikke har nævnt, er, at rotorerne øges, før hvert bogstav er krypteret. Hvis rotorernes startpositioner er ‘FEQ’, vil de først blive forøget til ‘FER’, før det første bogstav bliver tydet.
Inkrementering af rotorerne §
En almindelig fejl, når man implementerer gåden, er at antage, at rotorerne fungerer som et almindeligt odometer, der er dog et par vigtige forskelle. Hver rotor har et hak, som får rotoren til venstre til at træde. Rotor I får den næste rotor til at træde ved overgangen fra Q til R, rotor II ved overgangen fra E til F osv. Rotor I til V anvendes i Wermacht-enigmaet, senere blev der tilføjet flere rotorer, som havde to hak.
I | II | III | IV | V | VI | VII | VIII | |
Q | E | V | J | Z | Z | Z,M | Z,M | Z,M |
Der er en ekstra forvirrende detalje, nemlig “double stepping”. Når en rotor træder, får den også rotoren til højre for den til at træde. Dette bemærkes ikke, når den anden rotor træder, da den første rotor træder ved hvert tastetryk. Men når den tredje rotor (længst til venstre) træder, får det også den anden rotor til at træde. Dette betyder, at maskinens periode ikke er 26x26x26, men kun 26x25x26.
Ringstellung §
Ringstellung (ringindstillinger) angives normalt som en streng af tre bogstaver, f.eks. “FAM” (eller alternativt som tal mellem 1 og 26, der repræsenterer bogstaverne). I den foregående diskussion har jeg antaget, at hver rotors simple substitutionsciffer var fast. Ringstellung giver mulighed for at flytte substitutionscifferet på følgende måde. Med en ringindstilling på “A” (eller 1) ser rotor I’s substitution således ud:
ABCDEFGHIJKLMNOPQRSTUVWXYZEKMFLGDQVZNTOWYHXUSPAIBRCJ
Med en ringindstilling på “B” (eller 2) ser rotor I’s substitution således ud:
ZABCDEFGHIJKLMNOPQRSTUVWXYEKMFLGDQVZNTOWYHXUSPAIBRCJ
The Steckerverbindungen §
The steckerverbindungen (plugboard) er et ekstra sikkerhedslag, som består af 13 ledninger, der sættes i stik i stikkontakter på forsiden af enigma-maskinen.Hver ledning forbinder 2 bogstaver, f.eks. P til O. Disse pardannelser er specificeret som en del af nøglematerialet. Når et bogstav indtastes, gennemgår det, inden det går ind i den første rotor, substitutionen i henhold til stikpladen, og når bogstavet kommer ud, gennemgår det igen stikpladens substitution, inden det udgives. Et eksempel på en plugboard-indstilling er som følger: PO ML IU KJ NH YT GB VF RE AC (det betyder, at P og O byttes om, M og L byttes om osv.)
Hvis vi bruger eksemplet ovenfor, hvor bogstavet “A” blev krypteret med rotorerne I, II og III med startpositionerne AAA, fik vi bogstavet A krypteret som et U. Hvis vi nu tager hensyn til plugboardet ved hjælp af plugboard-indstillingerne i det foregående afsnit, oversættes “A” først til et “C” før kryptering. Krypteringen fortsættes som sædvanlig, denne gang udskrives “C” som et “J”. Dette bogstav ledes derefter gennem plugboardet igen for at blive erstattet med “K”. Nu har vi altså et “A”, der er blevet tydet som et “K” med plugboardet i brug. Plugboardet øger styrken af enigma-chiffret som helhed betydeligt, mere end hvis man tilføjer endnu en rotor.
Javascript Eksempel §
Plaintext
nøgleindstillinger:
ringindstillinger:
Rotorer:
Rotorer:
Stikpladeindstillinger:
Stikpladeindstillinger:
Ciphertext
Andre implementeringer §
For at kryptere dine egne meddelelser i python, kan du bruge pycipher-modulet. For at installere det skal du bruge pip install pycipher. For at kryptere meddelelser med Enigma cipher (eller en anden cipher, se her for dokumentation), se eksemplet her.
Kryptoanalyse §
For noget kode til automatisk at bryde Enigma-meddelelser se Cryptanalysis of Enigma.
Der er blevet arbejdet meget på at bryde Enigma, nogle metoder som rodding og buttoning up blev brugt under anden verdenskrig, men kræver ‘cribs’, eller kendte stykker af klartekst. Disse metoder er diskuteret på wikipedia-siden.
Mere moderne metoder omfatter Jim Gilloglys artikel ‘Ciphertext only Cryptanalysis of the Enigma’. Et opfølgende brev, der korrigerer nogle fejl i papiret, kan findes her. Et andet dokument, der bygger videre på Jim Gilloglys dokument, er ‘Applying Statistical Language Recognition Techniques in the Ciphertext only Cryptanalysis of Enigma’ af Heidi Williams. En anden interessant ressource er The Cryptographic Mathematics of Enigma.