# Enigma Machine
## Description
### Introduction
The enigma was an encryption machine used in and post WWII. It used physical rotors to encode and decode message. My implementation is for the "Glühlampenmaschine" and later models; Complete with plugboard, rotors, and reflector. The enigma machine was deemed unbreakable at the time due it it's complexity but it's cipher is not secure by today's standards.
### My Implementation
I have implemented the enigma machine as a command line tool using rust and standard library (std::env). My main goal was to create a command line interface to gain experience parsing arguments and flags to configure the encoding of the message. There are no other dependencies.
### Soruces
- [Wikipedia 1 - Enigma Page](https://en.wikipedia.org/wiki/Enigma_machine)
- [Wikipedia 2 - Rotors and Internals](https://en.wikipedia.org/wiki/Enigma_rotor_details)
## Using
### Example
This example will decode "JDPEN XCJJO" into Hello World.
*This can be found in the help page.*
```bash
./enigma --rotor "EKMFLGDQVZNTOWYHXUSPAIBRCJ" V A --rotor "AJDKSIRUXBLHWTMCQGZNPYFVOE" E A --rotor "BDFHJLCPRTXVZNYEIWGAKMUSQO" Q A --reflector "YR UH QS LD PX NG OK MI EB FZ CW VJ AT" --message "JDPEN XCJJO"
OUTPUT: "HELLO WORLD"
```
### Flags
#### --rotor | -r
Use `--rotor ENCODING TURNOVER POSITION` to add and configure a rotor.
`ENCODING` is the encoding of the rotor. This is a string of 26 characters. Each character is a letter in the alphabet. A letter can only be used once but can be used in any order.
`TURNOVER` is the letter that will cause the next rotor to turn. This is a single character.
`POSITION` is the starting position of the rotor. This is a single character.
*You can have as many rotors as you want.*
###### Example:
```bash
./enigma ... --rotor "EKMFLGDQVZNTOWYHXUSPAIBRCJ" D A --rotor "AJDKSIRUXBLHWTMCQGZNPYFVOE" F B --rotor "BDFHJLCPRTXVZNYEIWGAKMUSQO" E C``
```
#### --reflector | -rf
Use `--reflector "PAIRS"` to configure the reflector.
`PAIRS` represents the pairs of letters that are connected in the reflector (required for symmetrical encryption). Each pair are two letters separated by a space. Each letter can only be used once but can be used in any order.
*The reflector must be included*
###### Example:
```bash
./enigma ... --reflector "AB CD EF GH IJ KL MN OP QR ST UV WX YZ"
```
#### --message | -m
Use `--message "MESSAGE"` to set the message to be encoded.
`MESSAGE` is the message to be encoded. This is a string of characters. Any non-alphabetic characters will be ignored and passed through.
*The message must be included*
###### Example:
```bash
./enigma ... --message "HELLO WORLD"
```
#### --plugboard | -pb
Use `--plugboard "PAIRS"` to configure the plugboard.
`PAIRS` represents the pairs of letters that are connected in the plugboard. Each pair are two letters separated by a space. Each letter can only be used once but can be used in any order. You can have as many pairs as you want.
*The plugboard is optional*
###### Example:
```bash
./enigma ... --plugboard "AB CD EF GH IJ KL MN OP QR ST UV WX YZ"
```
#### --help | -h
Use `--help` to print the help page.
*All other arguments will be ignored*
###### Example:
```bash
./enigma --help
```
#### --state | -s
Use `--state` to print the finial state of the enigma machine after encoding the message.
*This is optional*
###### Example:
```bash
./enigma ... --state
```
## Errors
I tried to make the error messages informative. I will not show them all here but this is an example:
```bash
$ ./enigma wooooop -rotor abcdefghijklmnopqrstuvwxyz a y -rotor abc a a
["$", "wooooop", "-rotor", "abcdefghijklmnopqrstuvwxyz", "a", "y", "-rotor", "abc", "a", "a"]
Error parsing rotor 2.
Encoding must be 26 characters long.
```
## Building
### Installation
Clone the repo, build and run. (Cargo required)
```bash
$ git clone https://GitHub.com/Andrew-McCall/enigma-rs.git
$ cd enigma-rs
$ cargo build
```
### Cargo Build
Use `cargo build --release` to build the binary.
```bash
$ ./enigma [flags]
```
The binary will be located in `target/release/enigma`.
### Cargo Run
Use `cargo run --release -- [flags]` to build and run the binary with one command.
## License
MIT License
Copyright (c) 2023 Andrew McCall