Published on Sunday, February 2, 2025
The Enigma machine is a cipher device developed and used in the early- to mid-20th century to protect commercial, diplomatic, and military communication. It was employed extensively by Nazi Germany during World War II, in all branches of the German military. The Enigma machine was considered so secure that it was used to encipher the most top-secret messages.
This project is a high performance Enigma Machine emulator that allows you to:
Just like the physical device, machine state is used to both encipher and decipher text with the same Encipher()
method (like a text toggle). Machine state had to match on both the encipher and decipher machines. Each operator would add specific rotors in a specific order, set rotor ring positions and starting rotations, as well as set plug wire positions. This emulator provides virtual versions of all key machine components by way of a deterministic random number generator using AES in counter (CTR) mode.
The emulated components include:
Additionally, characters in the source string that do not exist in the cipher character set are kept as-is in the enciphered text. For example, if you encipher a string with line breaks they are maintained in-place in the enciphered text since neither the classic 26 letter character set nor the 95 character ASCII set contain line break characters.
The emulator is FAST! When using the full 95 character ASCII character set, a large 800KB text string takes about 1 second to encipher. Typical text sizes encipher in a few milliseconds.
The physical machine modified with a plug board provided 150 trillion possible settings combinations for the 26 letter character set, with a 10^16 key space for a 3 rotor configuration. 4 rotors yielded a key space of 10^19, 5 rotors yielded a key space of 10^23, and so on.
So by simply using the full 95 character ASCII character set the cipher strength will be exponentially better than the original machine, even without additional rotors or other configuration, and should meet modern quantum-resistant cryptography needs.
It's easy to create a new virtual Enigma Machine and encipher your own text by using one of the provided presets based on one of the provided historical machine configurations:
Using one of the presets is easy:
var message = "FYNYDD IS A SOFTWARE DEVELOPMENT AND HOSTING COMPANY";
var machine = new Machine(new MachineConfiguration
{
MachinePreset = MachinePresets.Commercial_1924,
PlugBoardWires =
{
{ 'A', 'T' },
{ 'B', 'V' },
{ 'C', 'M' },
{ 'D', 'O' },
{ 'E', 'Y' },
}
});
var enciphered = machine.Encipher(message.ToString());
Assert.NotEqual(message.ToString(), enciphered);
machine.Reset();
var deciphered = machine.Encipher(enciphered);
Assert.Equal(message.ToString(), deciphered);
It's even easier to use the Enigma Machine for modern encryption, since all you need to provide are a cipher key, nonce, and the number of relevant machine components. There's no need to change rotor ring positions and rotations, or set plug board wire pair values, since your cipher key and nonce are unique and drive the creation of all machine components.
Here's an example of using the Enigma Machine without a historical preset:
var message = @"
Fynydd is a software development & hosting company.
Fynydd is a Welsh word that means mountain or hill.
";
/*
AES key must be 16, 24, or 32 bytes for AES-128, AES-192, or AES-256
Nonce or initial counter value must be 16 bytes
*/
var machine = new Machine(
"ThisIsA32ByteLongSecretKey123456",
"UniqueNonce12345",
rotorCount: 6,
plugWires: 47);
var enciphered = machine.Encipher(message.ToString());
Assert.NotEqual(message.ToString(), enciphered);
machine.Reset();
var deciphered = machine.Encipher(enciphered);
Assert.Equal(message.ToString(), deciphered);
You can also create a custom machine by assembling the virtual components, and more. Check out the project on Github.
Whether your organization is big or small, book a conference call or request a project estimate and find out how Fynydd can help with your next web development or mobile app project!