Progetto Python che combina simulazione Enigma a 3 rotori e cracking incrementale basato su Z3, fallback numerico e ranking euristico.
- Simulatore Enigma completo con double-stepping, ring settings e plugboard.
- Rotori supportati:
I,II,III,IV,V. - Riflettori supportati:
B,C. - Cracking posizioni rotori (
crack_rotor_positions). - Cracking con plugboard ignoto (
crack_with_plugboard). - Ricerca completa con ordine rotori e ring settings ignoti (
rank_rotor_configurations,crack_full_configuration). - CLI unificata:
encrypt,decrypt,crack,benchmark. - Demo interattiva terminale per presentazioni orali (
interactive_demo.py).
- Python 3.12 consigliato.
- Dipendenze runtime:
z3-solver,matplotlib.
Setup minimo:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtSetup sviluppo (test, coverage, lint, type-check):
pip install -r requirements-dev.txtHelp generale:
python enigma_cli.py --helpEncrypt:
python enigma_cli.py encrypt \
--text "HELLOWORLD" \
--rotors I,II,III \
--positions 5,10,20 \
--rings 0,0,0 \
--reflector B \
--plugboard AZ,BYDecrypt usa gli stessi parametri (Enigma e simmetrica):
python enigma_cli.py decrypt \
--text "<CIPHERTEXT>" \
--rotors I,II,III \
--positions 5,10,20 \
--rings 0,0,0 \
--reflector B \
--plugboard AZ,BYCrack modalita positions (plugboard noto o assente):
python enigma_cli.py crack \
--mode positions \
--ciphertext "XYZ..." \
--crib "WETTERBERICHT" \
--rotors I,II,III \
--rings 0,0,0 \
--plugboard AZ,BY \
--timeout-ms 3000Output: JSON con campo positions.
Crack modalita plugboard (plugboard ignoto, numero coppie noto):
python enigma_cli.py crack \
--mode plugboard \
--ciphertext "XYZ..." \
--crib "WETTERBERICHT" \
--rotors I,II,III \
--rings 0,0,0 \
--num-pairs 3 \
--timeout-ms 8000Output: JSON con positions e plugboard_pairs (oppure result: null).
Crack modalita full (ordine rotori/rings ignoti con ranking):
python enigma_cli.py crack \
--mode full \
--ciphertext "XYZ..." \
--crib "WETTERBERICHT" \
--rotor-pool I,II,III,IV \
--ring-candidates 0,0,0 \
--ring-candidates 2,11,7 \
--top-k 5 \
--timeout-ms 8000 \
--per-config-timeout-ms 120 \
--heuristic-budget 1200Output: JSON con best e lista ranked.
Benchmark:
python enigma_cli.py benchmark --csv benchmark_results.csv --png benchmark_results.png --seed 42Script pensato per demo orale end-to-end:
python interactive_demo.pyLa demo mostra:
- cifratura lettera per lettera con trace completo del segnale;
- verifica di simmetria (stessa chiave = decifratura);
- cracking posizioni con Z3 e tempo di risoluzione;
- decifratura finale con chiave trovata.
Configurazione demo di default in interactive_demo.py:
- rotori
I,II,III - posizioni iniziali
(5, 10, 20) - rings
(0, 0, 0) - riflettore
B - plugboard con 10 coppie (
A-B,C-D, ...,S-T)
Export pubblici dal package cracker:
crack_simple_enigma(...)crack_rotor_positions(...)crack_with_plugboard(...)rank_rotor_configurations(...)crack_full_configuration(...)CrackCandidate
Esempio rapido:
from cracker import crack_full_configuration
best = crack_full_configuration(
ciphertext="...",
crib="WETTERBERICHT",
rotor_pool=("I", "II", "III"),
search_rotor_order=True,
search_ring_settings=True,
global_timeout_ms=5000,
)
print(best)Test:
pytest tests/ -vSuite locale quality:
./scripts/run_quality.shRelease check locale (quality + benchmark + profiling):
./scripts/release.shProfiling full cracker:
python scripts/profile_full_cracker.pyOutput profiling: profiling/full_cracker_profile.txt.
Workflow GitHub Actions: .github/workflows/ci.yml.
- test + coverage
- lint (
ruff) - type-check (
mypy)
enigmaZ3/
├── enigma/
│ ├── rotor.py
│ ├── reflector.py
│ ├── plugboard.py
│ └── machine.py
├── cracker/
│ ├── simple_cracker.py
│ └── full_cracker.py
├── tests/
│ └── test_enigma.py
├── interactive_demo.py
├── enigma_cli.py
├── benchmark.py
├── scripts/
│ ├── run_quality.sh
│ ├── release.sh
│ └── profile_full_cracker.py
├── requirements.txt
├── requirements-dev.txt
└── pyproject.toml