Cryptanalysis of the Enigma machine in Rust.
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

ultra Build Status License

ultra is a Rust implementation of the Enigma machine that includes the ability to decrypt ciphertext.


ultra can be installed from using Cargo:

$ cargo install ultra


Encrypt a message with rotors 1-4-2, key setting D-O-G, and ring setting C-A-T:

$ ultra --rotor=142 --key=DOG --ring=CAT "The quick brown fox jumps over the lazy dog."
Ntz ntqlz jmwll art bbnow wzqk keq ievk lzo.

Encrypt a message using random Enigma settings:

$ ultra --randomize "The quick brown fox jumps over the lazy dog."
Kxj mcwzf oqgmz pwr vnfqq iwhv wcr qqgt lgd.
(Rotors: 314, Key Setting: NHO, Ring Setting: VTB)

Decrypt the ciphertext generated in the previous example:

$ ultra --decrypt "Kxj mcwzf oqgmz pwr vnfqq iwhv wcr qqgt lgd."
The quick brown fox jumps over the lazy dog.
(Rotors: 314, Key Setting: SZO, Ring Setting: ALB)

Decryption relies on quadgram frequencies to infer the original Enigma machine settings, and as a result, it is quite likely that short messages will be decrypted incorrectly. Additionally, decryption will not work for messages that were encrypted with any plugboard plugs active. See this blog post for a brief overview of the decryption algorithm.


This project's quadgram data and decryption algorithm is based on James Lyons' articles about the Enigma machine.


ultra is licensed under the MIT License.