# playfair-rs - [Playfair Cipher](https://en.wikipedia.org/wiki/Playfair_cipher) in [Rust](https://www.rust-lang.org/).
Origionally was an assignment for my CS 303: Databases and Information Security class, 
I wanted to take some more time and implement it again. This is that solution to implementing
the [Playfair Cipher](https://en.wikipedia.org/wiki/Playfair_cipher) in Rust.

## Design choices
Some implementations omit the letter 'q' in encryption/decryption, some omit 'j', and 
some equate 'i' to 'j'. For my implementation, I went with 'i' = 'j', since that is 
what the Wikipedia article's example followed, and a [random online playfair cipher](https://www.boxentriq.com/code-breaking/playfair-cipher)
website used by default. This allowed for easy verification of my implementation.

I also used a [Makefile](Makefile) to enforce strict commenting of all my functions 
to ensure I knew what was going on at that line and function. As well thanks to the awesome
[Rust ecosystem](https://www.rust-lang.org/tools), it enables generation of documentation
with just a single `make` command. That documentation can be found in the `./target/doc/playfair_rs/`
directory, following execution of the `make` command.

I also used testing extensively, for each part from keyword generation, matrix computation, 
character location, to [full integration testing](./tests/playfair_tests.rs). Combining this
with assertions in the code, I have a pretty good idea that my code is correct.

## Examples
You can see an example in [main.rs](./src/main.rs), or here is a simple shown implementation:

**Encrypt:**
```rust
use playfair_rs::{Cipher, Playfair};

// Example from https://en.wikipedia.org/wiki/Playfair_cipher.
fn main() {
    let pf = Playfair::new("playfair example");
    let out = pf.encrypt("Hide the gold in the tree stump.");

    // out = bmodzbxdnabekudmuixmmouvif
}
```

**Decrypt:**
```rust
use playfair_rs::{Cipher, Playfair};

// Example from https://en.wikipedia.org/wiki/Playfair_cipher.
fn main() {
    let pf = Playfair::new("playfair example");
    let out = pf.decrypt("bmodzbxdnabekudmuixmmouvif");

    // out = hidethegoldinthetrexestump
}
```
