Created Enigma, the Bombe, and Typex (markdown)
parent
3adb0270e8
commit
ed7ab8b927
350
Enigma,-the-Bombe,-and-Typex.md
Normal file
350
Enigma,-the-Bombe,-and-Typex.md
Normal file
@ -0,0 +1,350 @@
|
|||||||
|
## How to guides
|
||||||
|
|
||||||
|
### How to encrypt/decrypt with Enigma
|
||||||
|
|
||||||
|
We'll start with a step-by-step guide to decrypting a known message. You can see the result of
|
||||||
|
these steps in CyberChef
|
||||||
|
[here](https://gchq.github.io/CyberChef/#recipe=Enigma('3-rotor','','','','BDFHJLCPRTXVZNYEIWGAKMUSQO<W','K','O','AJDKSIRUXBLHWTMCQGZNPYFVOE<F','N','P','ESOVPZJAYQUIRHXLNFTGKDCMWB<K','G','M','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','AH%20CO%20DE%20GZ%20IJ%20KM%20LQ%20NY%20PS%20TW',true)&input=WFRTWU4gV0FFVUcgRVpBTFkgTlJRSU0gQU1MWlggTUZVT0QgQVdYTFkgTFpDVVogUU9RQlEgSkxDUEsgTkREUlcgRg).
|
||||||
|
Let's say that our message is as follows:
|
||||||
|
|
||||||
|
`XTSYN WAEUG EZALY NRQIM AMLZX MFUOD AWXLY LZCUZ QOQBQ JLCPK NDDRW F`
|
||||||
|
|
||||||
|
And that we've been told that a German service Enigma is in use with the following settings:
|
||||||
|
|
||||||
|
Rotors `III`, `II`, and `IV`, reflector `B`, ring settings (Ringstellung in German) `KNG`,
|
||||||
|
plugboard (Steckerbrett)`AH CO DE GZ IJ KM LQ NY PS TW`, and finally the rotors are set to `OPM`.
|
||||||
|
|
||||||
|
Enigma settings are generally given left-to-right. Therefore, you should ensure the 3-rotor Enigma
|
||||||
|
is selected in the first dropdown menu, and then use the dropdown menus to put rotor
|
||||||
|
`III` in the 1st rotor slot, `II` in the 2nd, and `IV` in the 3rd, and pick
|
||||||
|
`O` in the reflector slot. In the ring setting and initial value boxes for the 1st rotor, put `K`
|
||||||
|
and `M` respectively, `N` and `P` in the 2nd, and `G` and `M` in the 3rd. Copy the plugboard
|
||||||
|
settings `AH CO DE GZ IJ KM LQ NY PS TW` into the plugboard box. Finally, paste the message into
|
||||||
|
the input window.
|
||||||
|
|
||||||
|
The output window will now read as follows:
|
||||||
|
|
||||||
|
`HELLO CYBER CHEFU SERST HISIS ATEST MESSA GEFOR THEDO CUMEN TATIO N`
|
||||||
|
|
||||||
|
The Enigma machine doesn't support any special characters, so there's no support for spaces, and
|
||||||
|
by default unsupported characters are removed and output is put into the traditional five-character
|
||||||
|
groups. (You can turn this off by disabling "strict input".) In some messages you may see X used to
|
||||||
|
represent space.
|
||||||
|
|
||||||
|
Encrypting with Enigma is exactly the same as decrypting - if you copy the decrypted message back
|
||||||
|
into the input box with the same recipe, you'll get the original ciphertext back.
|
||||||
|
|
||||||
|
#### Plugboard, rotor and reflector specifications
|
||||||
|
|
||||||
|
The plugboard exchanges pairs of letters, and is specified as a space-separated list of those
|
||||||
|
pairs. For example, with the plugboard `AB CD`, `A` will be exchanged for `B` and vice versa, `C`
|
||||||
|
for `D`, and so forth. Letters that aren't specified are not exchanged, but you can also specify,
|
||||||
|
for example, `AA` to note that `A` is not exchanged. A letter cannot be exchanged more than once.
|
||||||
|
In standard late-war German military operating practice, ten pairs were used.
|
||||||
|
|
||||||
|
You can enter your own components, rather than using the standard ones. A rotor is an arbitrary
|
||||||
|
mapping between letters - the rotor specification used here is the letters the rotor maps A through
|
||||||
|
Z to, so for example with the rotor `ESOVPZJAYQUIRHXLNFTGKDCMWB`, `A` maps to `E`, `B` to `S`, and
|
||||||
|
so forth. Each letter must appear exactly once. Additionally, rotors have a defined step point (the
|
||||||
|
point or points in the rotor's rotation at which the neighbouring rotor is stepped) - these are
|
||||||
|
specified using a `<` followed by the letters at which the step happens.
|
||||||
|
|
||||||
|
Reflectors, like the plugboard, exchange pairs of letters, so they are entered the same way.
|
||||||
|
However, letters cannot map to themselves.
|
||||||
|
|
||||||
|
### How to encrypt/decrypt with Typex
|
||||||
|
|
||||||
|
The Typex machine is very similar to Enigma. There are a few important differences from a user
|
||||||
|
perspective:
|
||||||
|
|
||||||
|
* Five rotors are used.
|
||||||
|
* Rotor wirings cores can be inserted into the rotors backwards.
|
||||||
|
* The input plugboard (on models which had one) is more complicated, allowing arbitrary letter
|
||||||
|
mappings, which means it functions like, and is entered like, a rotor.
|
||||||
|
* There was an additional plugboard which allowed rewiring of the reflector: this is supported by
|
||||||
|
simply editing the specified reflector.
|
||||||
|
|
||||||
|
Like Enigma, Typex only supports enciphering/deciphering the letters A-Z. However, the keyboard was
|
||||||
|
marked up with a standardised way of representing numbers and symbols using only the letters. You
|
||||||
|
can enable emulation of these keyboard modes in the operation configuration. Note that this needs
|
||||||
|
to know whether the message is being encrypted or decrypted.
|
||||||
|
|
||||||
|
### How to attack Enigma using the Bombe
|
||||||
|
|
||||||
|
Let's take the message from the first example, and try and decrypt it without knowing the settings
|
||||||
|
in advance. Here's the message again:
|
||||||
|
|
||||||
|
`XTSYN WAEUG EZALY NRQIM AMLZX MFUOD AWXLY LZCUZ QOQBQ JLCPK NDDRW F`
|
||||||
|
|
||||||
|
Let's assume to start with that we know the rotors used were `III`, `II`, and `IV`, and reflector
|
||||||
|
`B`, but that we know no other settings. Put the ciphertext in the input window and the Bombe
|
||||||
|
operation in your recipe, and choose the correct rotors and reflector. We need one additional piece
|
||||||
|
of information to attack the message: a "crib". This is a section of known plaintext for the
|
||||||
|
message. If we know something about what the message is likely to contain, we can guess possible
|
||||||
|
cribs.
|
||||||
|
|
||||||
|
We can also eliminate some cribs by using the property that Enigma cannot encipher a letter as
|
||||||
|
itself. For example, let's say our first guess for a crib is that the message begins with "Hello
|
||||||
|
world". If we enter `HELLO WORLD` into the crib box, it will inform us that the crib is invalid,
|
||||||
|
as the `W` in `HELLO WORLD` corresponds to a `W` in the ciphertext. (Note that spaces in the input
|
||||||
|
and crib are ignored - they're included here for readability.) You can see this in CyberChef
|
||||||
|
[here](https://gchq.github.io/CyberChef/#recipe=Bombe('3-rotor','LEYJVCNIXWPBQMDRTAKZGFUHOS','BDFHJLCPRTXVZNYEIWGAKMUSQO<W','AJDKSIRUXBLHWTMCQGZNPYFVOE<F','ESOVPZJAYQUIRHXLNFTGKDCMWB<K','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','HELLO%20WORLD',0,true)&input=WFRTWU4gV0FFVUcgRVpBTFkgTlJRSU0gQU1MWlggTUZVT0QgQVdYTFkgTFpDVVogUU9RQlEgSkxDUEsgTkREUlcgRg)
|
||||||
|
|
||||||
|
Let's try "Hello CyberChef" as a crib instead. If we enter `HELLO CYBER CHEF`, the operation
|
||||||
|
will run and we'll be presented with some information about the run, followed by a list of stops.
|
||||||
|
You can see this
|
||||||
|
[here](https://gchq.github.io/CyberChef/#recipe=Bombe('3-rotor','LEYJVCNIXWPBQMDRTAKZGFUHOS','BDFHJLCPRTXVZNYEIWGAKMUSQO<W','AJDKSIRUXBLHWTMCQGZNPYFVOE<F','ESOVPZJAYQUIRHXLNFTGKDCMWB<K','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','HELLO%20CYBER%20CHEF',0,true)&input=WFRTWU4gV0FFVUcgRVpBTFkgTlJRSU0gQU1MWlggTUZVT0QgQVdYTFkgTFpDVVogUU9RQlEgSkxDUEsgTkREUlcgRg).
|
||||||
|
Here you'll notice that it says `Bombe run on menu with 0 loops (2+ desirable).`, and there are a
|
||||||
|
large number of stops listed. The menu is built from the crib you've entered, and is a web linking
|
||||||
|
ciphertext and plaintext letters. (If you're maths inclined, this is a graph where letters - plain
|
||||||
|
or ciphertext - are nodes and states of the Enigma machine are edges.) The machine performs better
|
||||||
|
on menus which have loops in them - a letter maps to another to another and eventually returns to
|
||||||
|
the first - and additionally on longer menus. However, menus that are too long risk failing because
|
||||||
|
the Bombe doesn't simulate the middle rotor stepping, and the longer the menu the more likely this
|
||||||
|
is to have happened. Getting a good menu is a mixture of art and luck, and you may have to try a
|
||||||
|
number of possible cribs before you get one that will produce useful results.
|
||||||
|
|
||||||
|
<img src="https://user-images.githubusercontent.com/22770796/54355102-285ca900-4650-11e9-823a-c001cd2cf99c.png" width=500 alt="Bombe menu diagram">
|
||||||
|
|
||||||
|
|
||||||
|
In this case, if we extend our crib by a single character to `HELLO CYBER CHEFU`, we get a loop in
|
||||||
|
the menu (that `U` maps to a `Y` in the ciphertext, the `Y` in the second cipher block maps to
|
||||||
|
`A`, the `A` in the third ciphertext block maps to `E`, and the `E` in the second crib block maps
|
||||||
|
back to `U`). We immediately get a manageable number of results. You can see this
|
||||||
|
[here](https://gchq.github.io/CyberChef/#recipe=Bombe('3-rotor','LEYJVCNIXWPBQMDRTAKZGFUHOS','BDFHJLCPRTXVZNYEIWGAKMUSQO<W','AJDKSIRUXBLHWTMCQGZNPYFVOE<F','ESOVPZJAYQUIRHXLNFTGKDCMWB<K','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','HELLO%20CYBER%20CHEFU',0,true)&input=WFRTWU4gV0FFVUcgRVpBTFkgTlJRSU0gQU1MWlggTUZVT0QgQVdYTFkgTFpDVVogUU9RQlEgSkxDUEsgTkREUlcgRg).
|
||||||
|
Each result gives a set of rotor initial values and a set of identified plugboard wirings.
|
||||||
|
Extending the crib further to `HELLO CYBER CHEFU SER` produces a single result, and it has also
|
||||||
|
recovered eight of the ten plugboard wires and identified four of the six letters which are not
|
||||||
|
wired. You can see this
|
||||||
|
[here](https://gchq.github.io/CyberChef/#recipe=Bombe('3-rotor','LEYJVCNIXWPBQMDRTAKZGFUHOS','BDFHJLCPRTXVZNYEIWGAKMUSQO<W','AJDKSIRUXBLHWTMCQGZNPYFVOE<F','ESOVPZJAYQUIRHXLNFTGKDCMWB<K','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','HELLO%20CYBER%20CHEFU%20SER',0,true)&input=WFRTWU4gV0FFVUcgRVpBTFkgTlJRSU0gQU1MWlggTUZVT0QgQVdYTFkgTFpDVVogUU9RQlEgSkxDUEsgTkREUlcgRg).
|
||||||
|
|
||||||
|
We now have two things left to do:
|
||||||
|
|
||||||
|
1. Recover the remaining plugboard settings.
|
||||||
|
1. Recover the ring settings.
|
||||||
|
|
||||||
|
This will need to be done manually.
|
||||||
|
|
||||||
|
Set up an Enigma operation with these settings. Leave the ring positions set to `A` for the moment,
|
||||||
|
so from top to bottom we have rotor `III` at initial value `E`, rotor `II` at `C`, and rotor `IV`
|
||||||
|
at `G`, reflector `B`, and plugboard `DE AH BB CO FF GZ LQ NY PS RR TW UU`.
|
||||||
|
|
||||||
|
You can see this
|
||||||
|
[here](https://gchq.github.io/CyberChef/#recipe=Enigma('3-rotor','LEYJVCNIXWPBQMDRTAKZGFUHOS','A','A','BDFHJLCPRTXVZNYEIWGAKMUSQO<W','A','E','AJDKSIRUXBLHWTMCQGZNPYFVOE<F','A','C','ESOVPZJAYQUIRHXLNFTGKDCMWB<K','A','G','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','DE%20AH%20BB%20CO%20FF%20GZ%20LQ%20NY%20PS%20RR%20TW%20UU',true)&input=WFRTWU4gV0FFVUcgRVpBTFkgTlJRSU0gQU1MWlggTUZVT0QgQVdYTFkgTFpDVVogUU9RQlEgSkxDUEsgTkREUlcgRg).
|
||||||
|
You will immediately notice that the output is not the same as the decryption preview from the
|
||||||
|
Bombe operation! Only the first three characters - `HEL` - decrypt correctly. This is because the
|
||||||
|
middle rotor stepping was ignored by the Bombe. You can correct this by adjusting the ring position
|
||||||
|
and initial value on the right-hand rotor in sync. They are currently `A` and `G` respectively.
|
||||||
|
Advance both by one to `B` and `H`, and you'll find that now only the first two characters decrypt
|
||||||
|
correctly.
|
||||||
|
|
||||||
|
Keep trying settings until most of the message is legible. You won't be able to get the whole
|
||||||
|
message correct, but for example at `F` and `L`, which you can see
|
||||||
|
[here](https://gchq.github.io/CyberChef/#recipe=Enigma('3-rotor','LEYJVCNIXWPBQMDRTAKZGFUHOS','A','A','BDFHJLCPRTXVZNYEIWGAKMUSQO<W','A','E','AJDKSIRUXBLHWTMCQGZNPYFVOE<F','A','C','ESOVPZJAYQUIRHXLNFTGKDCMWB<K','F','L','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','DE%20AH%20BB%20CO%20FF%20GZ%20LQ%20NY%20PS%20RR%20TW%20UU',true)&input=WFRTWU4gV0FFVUcgRVpBTFkgTlJRSU0gQU1MWlggTUZVT0QgQVdYTFkgTFpDVVogUU9RQlEgSkxDUEsgTkREUlcgRg),
|
||||||
|
our message now looks like:
|
||||||
|
|
||||||
|
`HELLO CYBER CHEFU SERTC HVSJS QTEST KESSA GEFOR THEDO VUKEB TKMZM T`
|
||||||
|
|
||||||
|
At this point we can recover the remaining plugboard settings. The only letters which are not known
|
||||||
|
in the plugboard are `J K V X M I`, of which two will be unconnected and two pairs connected. By
|
||||||
|
inspecting the ciphertext and partially decrypted plaintext and trying pairs, we find that
|
||||||
|
connecting `IJ` and `KM` results, as you can see
|
||||||
|
[here](https://gchq.github.io/CyberChef/#recipe=Enigma('3-rotor','LEYJVCNIXWPBQMDRTAKZGFUHOS','A','A','BDFHJLCPRTXVZNYEIWGAKMUSQO<W','A','E','AJDKSIRUXBLHWTMCQGZNPYFVOE<F','A','C','ESOVPZJAYQUIRHXLNFTGKDCMWB<K','F','L','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','DE%20AH%20BB%20CO%20FF%20GZ%20LQ%20NY%20PS%20RR%20TW%20UU%20IJ%20KM',true)&input=WFRTWU4gV0FFVUcgRVpBTFkgTlJRSU0gQU1MWlggTUZVT0QgQVdYTFkgTFpDVVogUU9RQlEgSkxDUEsgTkREUlcgRg),
|
||||||
|
in:
|
||||||
|
|
||||||
|
`HELLO CYBER CHEFU SERST HISIS ATEST MESSA GEFOR THEDO CUMEO TMKZK T`
|
||||||
|
|
||||||
|
This is looking pretty good. We can now fine tune our ring settings. Adjusting the right-hand rotor to
|
||||||
|
`G` and `M` gives, as you can see
|
||||||
|
[here](https://gchq.github.io/CyberChef/#recipe=Enigma('3-rotor','LEYJVCNIXWPBQMDRTAKZGFUHOS','A','A','BDFHJLCPRTXVZNYEIWGAKMUSQO<W','A','E','AJDKSIRUXBLHWTMCQGZNPYFVOE<F','A','C','ESOVPZJAYQUIRHXLNFTGKDCMWB<K','G','M','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','DE%20AH%20BB%20CO%20FF%20GZ%20LQ%20NY%20PS%20RR%20TW%20UU%20IJ%20KM',true)&input=WFRTWU4gV0FFVUcgRVpBTFkgTlJRSU0gQU1MWlggTUZVT0QgQVdYTFkgTFpDVVogUU9RQlEgSkxDUEsgTkREUlcgRg),
|
||||||
|
|
||||||
|
`HELLO CYBER CHEFU SERST HISIS ATEST MESSA GEFOR THEDO CUMEN WMKZK T`
|
||||||
|
|
||||||
|
which is the best we can get with only adjustments to the first rotor. You now need to adjust the
|
||||||
|
second rotor. Here, you'll find that anything from `D` and `F` to `Z` and `B` gives the correct
|
||||||
|
decryption, for example
|
||||||
|
[here](https://gchq.github.io/CyberChef/#recipe=Enigma('3-rotor','LEYJVCNIXWPBQMDRTAKZGFUHOS','A','A','BDFHJLCPRTXVZNYEIWGAKMUSQO<W','A','E','AJDKSIRUXBLHWTMCQGZNPYFVOE<F','D','F','ESOVPZJAYQUIRHXLNFTGKDCMWB<K','G','M','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','DE%20AH%20BB%20CO%20FF%20GZ%20LQ%20NY%20PS%20RR%20TW%20UU%20IJ%20KM',true)&input=WFRTWU4gV0FFVUcgRVpBTFkgTlJRSU0gQU1MWlggTUZVT0QgQVdYTFkgTFpDVVogUU9RQlEgSkxDUEsgTkREUlcgRg).
|
||||||
|
It's not possible to determine the exact original settings from only this message. In practice,
|
||||||
|
for the real Enigma and real Bombe, this step was achieved via methods that exploited the Enigma
|
||||||
|
network operating procedures, but this is beyond the scope of this document.
|
||||||
|
|
||||||
|
#### What if I don't know the rotors?
|
||||||
|
|
||||||
|
You'll need the "Multiple Bombe" operation for this. You can define a set of rotors to choose
|
||||||
|
from - the standard WW2 German military Enigma configurations are provided or you can define your
|
||||||
|
own - and it'll run the Bombe against every possible combination. This will take up to a few hours
|
||||||
|
for an attack against every possible configuration of the four-rotor Naval Enigma! You should run
|
||||||
|
a single Bombe first to make sure your menu is good before attempting a multi-Bombe run.
|
||||||
|
|
||||||
|
You can see an example of using the Multiple Bombe operation to attack the above example message
|
||||||
|
without knowing the rotor order in advance
|
||||||
|
[here](https://gchq.github.io/CyberChef/#recipe=Multiple_Bombe('German%20Service%20Enigma%20(First%20-%203%20rotor)','EKMFLGDQVZNTOWYHXUSPAIBRCJ<R%5CnAJDKSIRUXBLHWTMCQGZNPYFVOE<F%5CnBDFHJLCPRTXVZNYEIWGAKMUSQO<W%5CnESOVPZJAYQUIRHXLNFTGKDCMWB<K%5CnVZBRGITYUPSDNHLXAWMJQOFECK<A','','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','HELLO%20CYBER%20CHEFU%20SER',0,true)&input=WFRTWU4gV0FFVUcgRVpBTFkgTlJRSU0gQU1MWlggTUZVT0QgQVdYTFkgTFpDVVogUU9RQlEgSkxDUEsgTkREUlcgRg).
|
||||||
|
|
||||||
|
#### What if I get far too many stops?
|
||||||
|
|
||||||
|
Use a longer or different crib. Try to find one that produces loops in the menu.
|
||||||
|
|
||||||
|
#### What if I get no stops, or only incorrect stops?
|
||||||
|
|
||||||
|
Are you sure your crib is correct? Try alternative cribs.
|
||||||
|
|
||||||
|
#### What if I know my crib is right, but I still don't get any stops?
|
||||||
|
|
||||||
|
The middle rotor has probably stepped during the encipherment of your crib. Try a shorter or
|
||||||
|
different crib.
|
||||||
|
|
||||||
|
## How things work
|
||||||
|
|
||||||
|
### How Enigma works
|
||||||
|
|
||||||
|
We won't go into the full history of Enigma and all its variants here, but as a brief overview of
|
||||||
|
how the machine works:
|
||||||
|
|
||||||
|
Enigma uses a series of letter-\>letter conversions to produce ciphertext from plaintext. It
|
||||||
|
is symmetric, such that the same series of operations on the ciphertext recovers the original
|
||||||
|
plaintext.
|
||||||
|
|
||||||
|
The bulk of the conversions are implemented in "rotors", which are just an arbitrary mapping from
|
||||||
|
the letters A-Z to the same letters in a different order. Additionally, to enforce the symmetry, a
|
||||||
|
reflector is used, which is a symmetric paired mapping of letters (that is, if a given reflector
|
||||||
|
maps X to Y, the converse is also true). These are combined such that a letter is mapped through
|
||||||
|
three different rotors, the reflector, and then back through the same three rotors in reverse.
|
||||||
|
|
||||||
|
To avoid Enigma being a simple [Caesar cipher](https://wikipedia.org/wiki/Caesar_cipher), the
|
||||||
|
rotors rotate (or "step") between enciphering letters, changing the effective mappings. The right
|
||||||
|
rotor steps on every letter, and additionally defines a letter (or
|
||||||
|
later, letters) at which the adjacent (middle) rotor will be stepped. Likewise, the middle rotor
|
||||||
|
defines a point at which the left rotor steps. (A mechanical issue known as the
|
||||||
|
double-stepping anomaly means that the middle rotor actually steps twice when the left hand rotor
|
||||||
|
steps.)
|
||||||
|
|
||||||
|
The German military Enigma adds a plugboard, which is a configurable pair mapping of letters
|
||||||
|
(similar to the reflector, but not requiring that every letter is exchanged) applied before the
|
||||||
|
first rotor (and thus also after passing through all the rotors and the reflector).
|
||||||
|
|
||||||
|
It also adds a ring setting, which allows the stepping point to be adjusted.
|
||||||
|
|
||||||
|
Later in the war, the Naval Enigma added a fourth rotor. This rotor does not step during
|
||||||
|
operation. (The fourth rotor is thinner than the others, and fits alongside a thin reflector,
|
||||||
|
meaning this rotor is not interchangeable with the others on a real Enigma.)
|
||||||
|
|
||||||
|
There were a number of other variants and additions to Enigma which are not currently supported
|
||||||
|
here, as well as different Enigma networks using the same basic hardware but different rotors
|
||||||
|
(which are supported by supplying your own rotor configurations).
|
||||||
|
|
||||||
|
### How Typex works
|
||||||
|
|
||||||
|
Typex is a clone of Enigma, with a few changes implemented to improve security. It uses five rotors
|
||||||
|
rather than three, and the _rightmost_ two are static. Each rotor has more stepping points.
|
||||||
|
Additionally, the rotor design is slightly different: the wiring for each rotor is in a removable
|
||||||
|
core, which sits in a rotor housing that has the ring setting and stepping notches. This means each
|
||||||
|
rotor has the same stepping points, and the rotor cores can be inserted backwards, effectively
|
||||||
|
doubling the number of rotor choices.
|
||||||
|
|
||||||
|
Later models (from the Mark 22, which is the variant we simulate here) added two plugboards: an
|
||||||
|
input plugboard, which allowed arbitrary letter mappings
|
||||||
|
(rather than just pair switches) and thus functioned similarly to a configurable extra static
|
||||||
|
rotor, and a reflector plugboard, which allowed rewiring the reflector.
|
||||||
|
|
||||||
|
### How the Bombe works
|
||||||
|
|
||||||
|
The Bombe is a mechanism for efficiently testing and discarding possible rotor positions, given
|
||||||
|
some ciphertext and known plaintext. It exploits the symmetry of Enigma and the reciprocal
|
||||||
|
(pairwise) nature of the plugboard to do this regardless of the plugboard settings. Effectively,
|
||||||
|
the machine makes a series of guesses about the rotor positions and plugboard settings and for
|
||||||
|
each guess it checks to see if there are any contradictions (e.g. if it finds that, with its
|
||||||
|
guessed settings, the letter `A` would need to be connected to both `B` and `C` on the plugboard,
|
||||||
|
that's impossible, and these settings cannot be right). This is implemented via careful connection
|
||||||
|
of electrical wires through a group of simulated Enigma machines.
|
||||||
|
|
||||||
|
A full explanation of the Bombe's operation is beyond the scope of this document - you can read
|
||||||
|
the source code, and the authors also recommend Graham Ellsbury's
|
||||||
|
[Bombe explanation](http://www.ellsbury.com/bombe1.htm), which is very clearly diagrammed.
|
||||||
|
|
||||||
|
## Implementation in CyberChef
|
||||||
|
|
||||||
|
### Enigma/Typex
|
||||||
|
|
||||||
|
Enigma and Typex were implemented from documentation of their functionality.
|
||||||
|
|
||||||
|
Enigma rotor and reflector settings are from GCHQ's documentation of known Enigma wirings. We
|
||||||
|
currently simulate all basic versions of the German Service Enigma; most other versions should be
|
||||||
|
possible by manually entering the rotor wirings. There are a few models of Enigma, or attachments
|
||||||
|
for the Service Enigma, which we don't currently simulate. The operation was tested against some
|
||||||
|
of GCHQ's working examples of Enigma machines. Output should be letter-for-letter identical to a
|
||||||
|
real German Service Enigma. Note that some Enigma models used numbered rather than lettered
|
||||||
|
rotors - we've chosen to stick with the easier-to-use lettered rotors.
|
||||||
|
|
||||||
|
There were a number of different Typex versions over the years. We implement the Mark 22, which is
|
||||||
|
backwards compatible with some (but not completely with all, as some early variants supported case
|
||||||
|
sensitivity) older Typex models. GCHQ also has a partially working Mark 22 Typex. This was used to
|
||||||
|
test the plugboards and mechanics of the machine. Typex rotor settings were changed regularly, and
|
||||||
|
none have ever been published, so a test against real rotors was not possible. An example set of
|
||||||
|
rotors have been randomly generated for use in the Typex operation. Some additional information on
|
||||||
|
the internal functionality was provided by the Bombe Rebuild Project.
|
||||||
|
|
||||||
|
### The Bombe
|
||||||
|
|
||||||
|
The Bombe was likewise implemented on the basis of documentation of the attack and the machine. The
|
||||||
|
Bombe Rebuild Project at the National Museum of Computing answered a number of technical questions
|
||||||
|
about the machine and its operating procedures, and helped test our results against their working
|
||||||
|
hardware Bombe, for which the authors would like to extend our thanks.
|
||||||
|
|
||||||
|
Constructing menus from cribs in a manner that most efficiently used the Bombe hardware was another
|
||||||
|
difficult step of operating the real Bombes. We have chosen to generate the menu automatically from
|
||||||
|
the provided crib, ignore some hardware constraints of the real Bombe (e.g. making best use of the
|
||||||
|
number of available Enigmas in the Bombe hardware; we simply simulate as many as are necessary),
|
||||||
|
and accept that occasionally the menu selected automatically may not always be the optimal choice.
|
||||||
|
This should be rare, and we felt that manual menu creation would be hard to build an interface for,
|
||||||
|
and would add extra barriers to users experimenting with the Bombe.
|
||||||
|
|
||||||
|
The output of the real Bombe is optimised for manual verification using the checking machine, and
|
||||||
|
additionally has some quirks (the rotor wirings are rotated by, depending on the rotor, between one
|
||||||
|
and three steps compared to the Enigma rotors). Therefore, the output given is the _ring position_,
|
||||||
|
and a correction depending on the rotor needs to be applied to the _initial value_, setting it to
|
||||||
|
`W` for rotor V, `X` for rotor IV, and `Y` for all other rotors. We felt that this would require
|
||||||
|
too much explanation in CyberChef, so the output of CyberChef's Bombe operation is the initial
|
||||||
|
value for each rotor, with the ring positions set to `A`, required to decrypt the ciphertext starting
|
||||||
|
at the beginning of the crib. The actual stops are the same. This would not have caused problems at
|
||||||
|
Bletchley Park, as operators working with the Bombe would never have dealt with a real or simulated
|
||||||
|
Enigma, and vice versa.
|
||||||
|
|
||||||
|
By default the checking machine is run automatically and stops which fail silently discarded. This
|
||||||
|
can be disabled in the operation configuration, which will cause it to output all stops from the
|
||||||
|
actual Bombe hardware instead. (In this case you only get one stecker pair, rather than the set
|
||||||
|
identified by the checking machine.)
|
||||||
|
|
||||||
|
#### Optimisation
|
||||||
|
|
||||||
|
A three-rotor Bombe run (which tests 17,576 rotor positions and takes about 15-20 minutes on
|
||||||
|
original Turing Bombe hardware) completes in about a fifth of a second in our tests. A four-rotor
|
||||||
|
Bombe run takes about 5 seconds to try all 456,976 states. This also took about 20 minutes on the
|
||||||
|
four-rotor US Navy Bombe (which rotates about 30 times faster than the Turing Bombe!). CyberChef
|
||||||
|
operations run single-threaded in browser JavaScript.
|
||||||
|
|
||||||
|
We have tried to remain fairly faithful to the implementation of the real Bombe, rather than
|
||||||
|
a from-scratch implementation of the underlying attack. There is one small deviation from "correct"
|
||||||
|
behaviour: the real Bombe spins the slow rotor on a real Enigma fastest. We instead spin the fast
|
||||||
|
rotor on an Enigma fastest. This means that all the other rotors in the entire Bombe are in the
|
||||||
|
same state for the 26 steps of the fast rotor and then step forward: this means we can compute
|
||||||
|
the 13 possible routes through the lower two/three rotors and reflector (symmetry means there are
|
||||||
|
only 13 routes) once every 26 ticks and then save them. This does not affect where the machine stops,
|
||||||
|
but it does affect the order in which those stops are generated.
|
||||||
|
|
||||||
|
The fast rotors repeat each others' states: in the 26 steps of the fast rotor between steps of the
|
||||||
|
middle rotor, each of the scramblers in the complete Bombe will occupy each state once. This means
|
||||||
|
we can once again store each state when we hit them and reuse them when the other scramblers rotate
|
||||||
|
through the same states.
|
||||||
|
|
||||||
|
Note also that it is not necessary to complete the energisation of all wires: as soon as 26 wires
|
||||||
|
in the test register are lit, the state is invalid and processing can be aborted.
|
||||||
|
|
||||||
|
The above simplifications reduce the runtime of the simulation by an order of magnitude.
|
||||||
|
|
||||||
|
If you have a large attack to run on a multiprocessor system - for example, the complete M4 Naval
|
||||||
|
Enigma, which features 1344 possible choices of rotor and reflector configuration, each of which
|
||||||
|
takes about 5 seconds - you can open multiple CyberChef tabs and have each run a subset of the
|
||||||
|
work. For example, on a system with four or more processors, open four tabs with identical Multiple
|
||||||
|
Bombe recipes, and set each tab to a different combination of 4th rotor and reflector (as there are
|
||||||
|
two options for each). Leave the full set of eight primary rotors in each tab. This should complete
|
||||||
|
the entire run in about half an hour on a sufficiently powerful system.
|
||||||
Loading…
x
Reference in New Issue
Block a user