A community-driven registry for the Claude Code ecosystem. Not affiliated with Anthropic.
Are you the author? Sign in to claim
A simple yet faithful library to emulate different Enigma machines models using Python
Welcome to enigmapython, a Python package designed to emulate the legendary Enigma cryptographic machine used during World War II. enigmapython provides a faithful implementation of the Enigma machine, allowing users to explore and understand the workings of this historic device.
This project is listed on Wikipedia as a globally recognized Enigma machine simulator, noted for its historical accuracy.
For a detailed description of the rotor movement and stepping logic, including pseudocode, please refer to the Enigma Mechanics documentation.
enigmapython is rigorously tested against authentic historical data to ensure maximum accuracy.
The following Enigma machine models (along with their rotors, reflectors and plugboards) have been implemented:
| Scrambler | Wiring | Turnover | Implemented |
|---|---|---|---|
| ETW (passthrough) | abcdefghijklmnopqrstuvxyzåäö | N/A | ✅ |
| Rotor I | psbgöxqjdhoäucfrtezvåinlymka | ä | ✅ |
| Rotor II | chnsyöadmotrzxbäigåekqupflvj | ä | ✅ |
| Rotor III | åvqiaäxrjbözspcfyunthdomekgl | ä | ✅ |
| Reflector UKW | ldgbäncpskjavfzhxuiårmqöotey | N/A | ✅ |
*given the rarity of this model and the little documentation/simulators available, although I expect an encryption consistency on par with newer models, I was unable to test it as I would have liked
| Scrambler | Wiring | Turnover | Implemented |
|---|---|---|---|
| ETW "QWERTZ" | qwertzuioasdfghjkpyxcvbnml | N/A | ✅ |
| Rotor I | lpgszmhaeoqkvxrfybutnicjdw | y | ✅ |
| Rotor II | slvgbtfxjqohewirzyamkpcndu | e | ✅ |
| Rotor III | cjgdpshkturawzxfmynqobvlie | n | ✅ |
| Reflector UKW | imetcgfraysqbzxwlhkdvupojn | N/A | ✅ |
| Scrambler | Wiring | Turnover | Implemented |
|---|---|---|---|
| ETW "QWERTZ" | qwertzuioasdfghjkpyxcvbnml | N/A | ✅ |
| Rotor I | pezuohxscvfmtbglrinqjwaydk | y | ✅ |
| Rotor II | zouesydkfwpciqxhmvblgnjrat | e | ✅ |
| Rotor III | ehrvxgaobqusimzflynwktpdjc | n | ✅ |
| Reflector UKW | imetcgfraysqbzxwlhkdvupojn | N/A | ✅ |
| Scrambler | Wiring | Turnover | Implemented |
|---|---|---|---|
| ETW "QWERTZ" | qwertzuioasdfghjkpyxcvbnml | N/A | ✅ |
| Rotor I | lpgszmhaeoqkvxrfybutnicjdw | z* | ✅ |
| Rotor II | slvgbtfxjqohewirzyamkpcndu | z* | ✅ |
| Rotor III | cjgdpshkturawzxfmynqobvlie | z* | ✅ |
| Reflector UKW | imetcgfraysqbzxwlhkdvupojn | N/A | ✅ |
*Enigma D rotor turnover happens at Z when ringstellung is 0 (A), otherwise turnover position is calculated using the formula turnover = (ringstellung + 1) % 26.
Compared to the other machine models, this one encrypts numbers instead of letters.
| Scrambler | Wiring | Turnover | Implemented |
|---|---|---|---|
| ETW (passthrough) | 1234567890 | N/A | ✅ |
| Rotor I | 6418270359 | 9 | ✅ |
| Rotor II | 5841097632 | 9 | ✅ |
| Rotor III | 3581620794 | 9 | ✅ |
| Reflector UKW | 5079183642 | N/A | ✅ |
*given the rarity of this model and the little documentation/simulators available, although I expect an encryption consistency on par with newer models, I was unable to test it as I would have liked
| Scrambler | Wiring | Turnover | Implemented |
|---|---|---|---|
| Plugboard (passthrough+swappable) | N/A | N/A | ✅ |
| ETW (passthrough) | abcdefghijklmnopqrstuvwxyz | N/A | ✅ |
| Rotor I | ekmflgdqvzntowyhxuspaibrcj | q | ✅ |
| Rotor II | ajdksiruxblhwtmcqgznpyfvoe | e | ✅ |
| Rotor III | bdfhjlcprtxvznyeiwgakmusqo | v | ✅ |
| Reflector A | ejmzalyxvbwfcrquontspikhgd | N/A | ✅ |
| Reflector B | yruhqsldpxngokmiebfzcwvjat | N/A | ✅ |
| Reflector C | fvpjiaoyedrzxwgctkuqsbnmhl | N/A | ✅ |
| Scrambler | Wiring | Turnover | Implemented |
|---|---|---|---|
| Plugboard (passthrough+swappable) | N/A | N/A | ✅ |
| ETW (passthrough) | abcdefghijklmnopqrstuvwxyz | N/A | ✅ |
| Rotor I | wtokasuyvrbxjhqcpzefmdinlg | q | ✅ |
| Rotor II | gjlpubswemctqvhxaofzdrkyni | e | ✅ |
| Rotor III | jwfmhnbpusdytixvzgrqlaoekc | v | ✅ |
| Rotor IV | fgzjmvxepbwshqtliudykcnrao | j | ✅ |
| Rotor V | hejxqotzbvfdascilwpgynmurk | z | ✅ |
| Reflector UKW | mowjypuxndsraibfvlkzgqchet | N/A | ✅ |
| Scrambler | Wiring | Turnover | Implemented |
|---|---|---|---|
| Plugboard (passthrough+swappable) | N/A | N/A | ✅ |
| ETW (passthrough) | abcdefghijklmnopqrstuvwxyz | N/A | ✅ |
| Rotor I | veosirzujdqckgwypnxaflthmb | q | ✅ |
| Rotor II | uemoatqlshpkcyfwjzbgvxidnr | e | ✅ |
| Rotor III | tzhxmbsipnurjfdkeqvcwglaoy | v | ✅ |
| Reflector UKW | ciagsndrbytpzfulvhekoqxwjm | N/A | ✅ |
| Scrambler | Wiring | Turnover | Implemented |
|---|---|---|---|
| Plugboard (passthrough+swappable) | N/A | N/A | ✅ |
| ETW (passthrough) | abcdefghijklmnopqrstuvwxyz | N/A | ✅ |
| Rotor I | ekmflgdqvzntowyhxuspaibrcj | q | ✅ |
| Rotor II | ajdksiruxblhwtmcqgznpyfvoe | e | ✅ |
| Rotor III | bdfhjlcprtxvznyeiwgakmusqo | v | ✅ |
| Rotor IV | esovpzjayquirhxlnftgkdcmwb | j | ✅ |
| Rotor V | vzbrgityupsdnhlxawmjqofeck | z | ✅ |
| Rotor VI | jpgvoumfyqbenhzrdkasxlictw | m, z | ✅ |
| Rotor VII | nzjhgrcxmyswboufaivlpekqdt | m, z | ✅ |
| Rotor VIII | fkqhtlxocbjspdzramewniuygv | m, z | ✅ |
| Reflector B | yruhqsldpxngokmiebfzcwvjat | N/A | ✅ |
| Reflector C | fvpjiaoyedrzxwgctkuqsbnmhl | N/A | ✅ |
| Scrambler | Wiring | Turnover | Implemented |
|---|---|---|---|
| Plugboard (passthrough+swappable) | N/A | N/A | ✅ |
| ETW (passthrough) | abcdefghijklmnopqrstuvwxyz | N/A | ✅ |
| Rotor I | ekmflgdqvzntowyhxuspaibrcj | q | ✅ |
| Rotor II | ajdksiruxblhwtmcqgznpyfvoe | e | ✅ |
| Rotor III | bdfhjlcprtxvznyeiwgakmusqo | v | ✅ |
| Rotor IV | esovpzjayquirhxlnftgkdcmwb | j | ✅ |
| Rotor V | vzbrgityupsdnhlxawmjqofeck | z | ✅ |
| Rotor VI | jpgvoumfyqbenhzrdkasxlictw | m, z | ✅ |
| Rotor VII | nzjhgrcxmyswboufaivlpekqdt | m, z | ✅ |
| Rotor VIII | fkqhtlxocbjspdzramewniuygv | m, z | ✅ |
| Beta | leyjvcnixwpbqmdrtakzgfuhos | N/A | ✅ |
| Gamma | fsokanuerhmbtiycwlqpzxvgjd | N/A | ✅ |
| Reflector B Thin | enkqauywjicopblmdxzvfthrgs | N/A | ✅ |
| Reflector C Thin | rdobjntkvehmlfcwzaxgyipsuq | N/A | ✅ |
| Scrambler | Wiring | Turnover | Implemented |
|---|---|---|---|
| Plugboard (passthrough+swappable) | N/A | N/A | ✅ |
| ETW (Entry Wheel) | Custom | N/A | ✅ |
| Rotor | Custom | Custom | ✅ |
| Reflector | Custom | N/A | ✅ |
You can create a fully customized Enigma machine by instantiating the base components manually. This allows you to define custom alphabets, wirings, and turnover positions.
from enigmapython.Enigma import Enigma
from enigmapython.Rotor import Rotor
from enigmapython.Reflector import Reflector
from enigmapython.SwappablePlugboard import SwappablePlugboard
from enigmapython.Etw import Etw
from enigmapython.Alphabets import Alphabets
# 1. Define alphabet
alphabet = Alphabets.lookup.get("latin_i18n_26chars_lowercase")
# 2. Create custom rotors
# Parameters: wiring, turnover_indexes, alphabet, initial_position, ring_setting
rotor1 = Rotor("ekmflgdqvzntowyhxuspaibrcj", [16], alphabet, 0, 0) # Turnover at 'q'
rotor2 = Rotor("ajdksiruxblhwtmcqgznpyfvoe", [4], alphabet, 0, 0) # Turnover at 'e'
rotor3 = Rotor("bdfhjlcprtxvznyeiwgakmusqo", [21], alphabet, 0, 0) # Turnover at 'v'
# 3. Create custom reflector
reflector = Reflector("yruhqsldpxngokmiebfzcwvjat", alphabet)
# 4. Create other components
# Swappable plugboard allows you to connect pairs of letters
plugboard = SwappablePlugboard(alphabet=alphabet)
plugboard.swap("a", "z") # Example: swap 'a' with 'z'
etw = Etw(alphabet, alphabet) # Passthrough ETW using alphabet as wiring
# 5. Assemble the Enigma machine
engine = Enigma(plugboard, [rotor1, rotor2, rotor3], reflector, etw, auto_increment_rotors=True, alphabet=alphabet)
# 6. Encrypt/Decrypt
cipher = engine.input_string("hello")
print(f"Ciphertext: {cipher}") # Outputs: mfnca
pip install -r requirements.txt) or directly from PyPI using pip install enigmapythonGet started by installing the package from PyPI (pip install enigmapython) and exploring the examples in the examples folder.
Full API documentation is available on ReadTheDocs.
For additional details, you can also refer to the local documentation, examples, and code comments.
Here's a list containing all the known Enigma simulators that use the enigmapython API.
In the case you leveraged enigmapython API in a project, either public or not, drop me an email at denis.maggiorotto[at]gmail.com and I'll be happy to list you here.
Early days experiments with Python and Enigma (where this repo comes from) can be found at: https://github.com/denismaggior8/enigma-cypher
Rotors wirings have been taken from Crypto Museum at this link https://www.cryptomuseum.com/crypto/enigma/wiring.htm
Thanks to
for having helped me testing the correctness of the generated ciphertexts
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Secure MCP server for MySQL database interaction, queries, and schema management
English-first Korean equity intelligence MCP — DART filings, foreign-holder 5%-rule flows, activist filings, KRX news. F