Struct EnigmaMachine

Source
pub struct EnigmaMachine { /* private fields */ }
Expand description

An enigma machine with applied settings that can encrypt or decrypt text.

Implementations§

Source§

impl EnigmaMachine

Source

pub fn new() -> impl EnigmaBuilder

Creates a new Enigma machine with blank settings. The settings for the machine must be added using the methods of EnigmaBuilder; See the README for an example.

The returned value from this will always be Ok, and will be an Enigma machine with rotors 1, 1, 1, ring positions 1, 1, and 1, ring settings 1, 1, and 1, reflector A, and an empty plugboard.

This opts you into the safe and Rusty API; To use the unsafe maximum performance API, use EnigmaMachine::unchecked(). See the README for more information.

Source

pub fn unchecked() -> impl UncheckedEnigmaBuilder

Creates a new Enigma machine with blank settings. The settings for the machine must be added using the methods of EnigmaBuilder; See the README for an example.

The returned value from this will always be Ok, and will be an Enigma machine with rotors 1, 1, 1, ring positions 1, 1, and 1, ring settings 1, 1, and 1, reflector A, and an empty plugboard.

This opts you into the unsafe API; To use the safer API at the expense of some performance, use EnigmaMachine::new(). See the README for more information.

Source

pub fn decrypt(&self, text: &str) -> String

Decodes the given text using this Enigma machine.

The decryption process does the following for each letter in the ciphertext:

  • Rotate the rotors
  • Pass the letter through the plugboard
  • Pass the letter through the rotors from right to left
  • Pass the letter through the reflector
  • Pass the letter back through the rotors from left to right
  • Pass the letter through the plugboard again

The reflector maps each characters to different ones, meaning no character can be encrypted or decrypted into itself.

This is exactly the same as calling machine.encode(text), since the enigma cipher is symmetric; The only difference is semantic meaning and intent, i.e.,

assert_eq!(text, machine.decrypt(machine.decrypt(text)));
assert_eq!(text, machine.encrypt(machine.encrypt(text)));
assert_eq!(text, machine.decrypt(machine.encrypt(text)));
assert_eq!(text, machine.encrypt(machine.decrypt(text)));
§Parameters
  • text - The text to decode.
§Returns

The decoded text.

Source

pub fn encrypt(&self, text: &str) -> String

Encodes the given text using this Enigma machine.

The encryption process does the following for each letter in the plaintext:

  • Rotate the rotors
  • Pass the letter through the plugboard
  • Pass the letter through the rotors from right to left
  • Pass the letter through the reflector
  • Pass the letter back through the rotors from left to right
  • Pass the letter through the plugboard again

The reflector maps each characters to different ones, meaning no character can be encrypted or decrypted into itself.

This is exactly the same as calling machine.decode(text), since the enigma cipher is symmetric; The only difference is semantic meaning and intent, i.e.,

assert_eq!(text, machine.decode(machine.decode(text)));
assert_eq!(text, machine.encode(machine.encode(text)));
assert_eq!(text, machine.decode(machine.encode(text)));
assert_eq!(text, machine.encode(machine.decode(text)));
§Parameters
  • text - The text to encode.
§Returns

The encoded text.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.