Introduktion §
Enigmachiffret var ett fältchiffer som användes av tyskarna under andra världskriget. Enigma är en av de mer kända historiska krypteringsmaskinerna, och det hänvisar faktiskt till en rad liknande krypteringsmaskiner. Den första Enigma-maskinen uppfanns av en tysk ingenjör vid namn Arthur Scherbius i slutet av första världskriget. Den användes kommersiellt från början av 1920-talet och framåt, och användes också av militär och statliga myndigheter i ett antal länder – mest känt av Nazityskland före och under andra världskriget. En mängd olika modeller av Enigma tillverkades, men den tyska militärmodellen, Wehrmacht Enigma, är den version som oftast diskuteras.
Om du vill kryptera några egna Enigma-meddelanden kan du ta en titt på javascript-exemplet.
Algoritmen §
Detta avsnitt kommer att handla om Enigma I aka Wehrmacht Enigma, andra varianter har en liknande funktion. ”Nyckeln” för Enigma består av flera delar:
- Rotorerna och deras ordning
- Rotorernas startpositioner
- Ringstellung, eller ringinställningar
- Steckerverbindungen, eller pluggbrädans inställningar
För information om de förfaranden som tyskarna använde under andra världskriget när de skickade Engima-meddelanden, inklusive hur indikatorerna ställdes in, se denna beskrivning.
Rotorerna §
Antag att våra rotorer är I,II,III som rör sig från vänster till höger, och att vi försöker chiffrera bokstaven ”A”. Vi antar för tillfället att när bokstaven ”A” chiffreras så befinner sig varje rotor i sin startposition (”AAA”).Eftersom våra rotorer är I,II,III som rör sig från vänster till höger kommer bokstaven ”A” först att passera genom rotor III. Varje rotor tillämpar en enkel ersättningsoperation. Ersättningstabellen för rotor III kan ses nedan:
ABCDEFGHIJKLMNOPQRSTUVWXYZBDFHJLCPRTXVZNYEIWGAKMUSQO
B ersätts med D, C ersätts med F osv. Så efter att bokstaven ”A” har gått genom rotorn kommer den ut som ett ”B”. Bokstaven ”B” förs nu in genom rotor II, där den ersätts med ”J” osv. Detta beskrivs bäst med hjälp av en tabell (för en fullständig beskrivning av rotorernas ledningar för varje rotor, se denna wikipediasida):
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 att bokstaven har passerat genom rotorer III,II,I, träffar den sedan reflektorn och genomgår ytterligare en enkel substitution. Efter att ha kommit ut ur reflektorn skickas bokstaven tillbaka genom rotorerna i omvänd riktning (detta innebär att den omvända substitutionen tillämpas) Vi kan se i tabellen att efter att den chiffrerade bokstaven kommer tillbaka ut ur rotor III i slutet, återstår bokstaven U. Ett viktigt steg som jag ännu inte har nämnt är det faktum att rotorerna ökar i antal innan varje bokstav är chiffrerad. Om rotorns startpositioner är ”FEQ” kommer de först att ökas till ”FER” innan den första bokstaven chiffreras.
Inkrementering av rotorerna §
Ett vanligt misstag när man implementerar enigma är att anta att rotorerna fungerar som en vanlig odometer, det finns dock några viktiga skillnader. Varje rotor har en skåra som gör att rotorn till vänster om den går i ett steg. Rotor I får nästa rotor att kliva vid övergången från Q till R, rotor II vid övergången från E till F osv. Rotorerna I till V används i Wermacht-gåtan, senare lades fler rotorer till som hade två skåror.
I | II | III | IV | V | VI | VII | VIII |
Q | E | V | J | Z | Z,M | Z,M | Z,M |
Det finns en extra förvirrande detalj, nämligen ”double stepping”. När en rotor kliver, får den även den högra rotorn att kliva. Detta märks inte när den andra rotorn kliver, eftersom den första rotorn kliver vid varje tangenttryckning. Men när den tredje rotorn (längst till vänster) kliver, får det den andra rotorn att också kliva. Detta innebär att maskinens period inte är 26x26x26, utan endast 26x25x26.
Ringstellung §
Ringstellung (ringinställningar) anges i allmänhet som en kedja av tre bokstäver, t.ex. ”FAM” (eller alternativt som siffror mellan 1 och 26, som representerar bokstäverna). I den tidigare diskussionen har jag antagit att varje rotors enkla substitutionsciffer var fast. Ringställningen gör det möjligt att förflytta substitutionsnumret på följande sätt. Med en ringställning på ”A” (eller 1) ser rotor I:s substitution ut så här:
ABCDEFGHIJKLMNOPQRSTUVWXYZEKMFLGDQVZNTOWYHXUSPAIBRCJ
Med en ringställning på ”B” (eller 2) ser rotor I:s substitution ut så här:
ZABCDEFGHIJKLMNOPQRSTUVWXYEKMFLGDQVZNTOWYHXUSPAIBRCJ
The Steckerverbindungen §
The steckerverbindungen (pluggkortet) är ett extra säkerhetsskikt som består av 13 trådar som pluggas in i uttag på enigma-maskinens framsida.Varje tråd förbinder två bokstäver, t.ex. P till O. Dessa kopplingar specificeras som en del av nyckelmaterialet. När en bokstav skrivs, innan den går in i den första rotorn, genomgår den substitutionen enligt plugboardet, och när bokstaven kommer ut genomgår den återigen substitutionen enligt plugboardet innan den skrivs ut. Ett exempel på en inställning av en pluggboard är följande: PO ML IU KJ NH YT GB VF RE AC (Detta innebär att P och O byts ut, M och L byts ut etc.).
Om vi använder exemplet ovan där bokstaven ”A” krypterades med rotorerna I, II och III med startpositionerna AAA, hade vi bokstaven A krypterad som ett U. Om vi nu tar hänsyn till plugboardet, med hjälp av plugboardinställningarna i föregående stycke, översätts bokstaven ”A” först till ett ”C” innan den chiffreras. Chiffreringen fortsätter som vanligt, men den här gången skrivs ”C” ut som ett ”J”. Denna bokstav leds sedan genom plugboardet igen för att ersättas med ”K”. Nu har vi alltså ett ”A” som chiffreras som ett ”K” med plugboardet i bruk. Plugboardet ökar avsevärt styrkan hos enigmachiffret som helhet, mer än vad ytterligare en rotor skulle kunna göra.
Javascript Exempel §
Plaintext
Nyckelinställningar:
Ringinställningar:
Rotorer:
Inställningar för stickkort:
Inställningar för stickkort:
Ciphertext
Andra implementeringar §
För att chiffrera dina egna meddelanden i python kan du använda pycipher-modulen. För att installera den använder du pip install pycipher. För att chiffrera meddelanden med Enigmachiffret (eller ett annat chiffer, se här för dokumentation), se exemplet här.
Kryptoanalys §
För viss kod för att automatiskt knäcka Enigma-meddelanden, se Kryptoanalys av Enigma.
Mycket arbete har lagts ner på att knäcka Enigma, vissa metoder, såsom rodding och buttoning up, användes under andra världskriget, men kräver ”kribbor”, eller kända delar av klartext. Dessa metoder diskuteras på wikipedia-sidan.
Mer moderna metoder inkluderar Jim Gilloglys artikel ”Ciphertext only Cryptanalysis of the Enigma”. Ett uppföljningsbrev som korrigerar vissa fel i dokumentet finns här. En annan artikel som bygger på Jim Gilloglys artikel är ”Applying Statistical Language Recognition Techniques in the Ciphertext only Cryptanalysis of Enigma” av Heidi Williams. En annan intressant resurs är The Cryptographic Mathematics of Enigma.