1 unstable release

new 0.1.0 Jan 10, 2025

#343 in Command-line interface

Download history 137/week @ 2025-01-08

137 downloads per month
Used in cipha-cli

MIT license

41KB
593 lines

cipha

A simple CLI and Package for Classical Ciphers and Cryptography in Rust

Stable Dev

Introduction

cipha consist of two main part the cipha and cipha-cli.

Installation

To install cipha you can do so via cargo

cargo add cipha

Or simply put the following in your Cargo.toml.

[dependencies]
cipha = "0.1.0"

Usage

The Function Based Approach

use cipha::utils::rot13;

fn main() {
  let input = "Hello, World!".to_string();
  let output = rot13(input);
  assert_eq!(output, "Uryyb, Jbeyq!");
}

Or via the Struct Based Approach

use cipha::ciphers::{Rot13Cipher};

fn main() {
    let r1 = Rot13Cipher::new();
    let encrypted = r1.encipher("Some string");
    let decrypted = r1.decipher(&encrypted);
    println!("Encrypted: {}, Decrypted: {}", encrypted, decrypted);
}

cipha-lib

The cipha-lib crate provides a collection of cryptographic functions, including various ciphers and encoding schemes. It is designed to be easy to use and integrate into Rust projects.

Functions

Below is a list of supported classical ciphers

  • rot13
  • caesar cipher
  • vigenere cipher
  • reverse
  • gematria
  • atbash
  • morse code

ROT13 Cipher

The ROT13 cipher is a special case of the Caesar cipher where the shift is always 13.

Example

use cipha::utils::rot13;
let input = "Hello, World!".to_string();
let output = rot13(input);
assert_eq!(output, "Uryyb, Jbeyq!");

Caesar Cipher

The Caesar cipher shifts each letter in the input message by a specified number of places.

Example

use cipha::utils::caesar_cipher;
let input = "Hello, World!".to_string();
let shift = 3;
let output = caesar_cipher(input, shift);
assert_eq!(output, "Khoor, Zruog!");

Reverse Cipher

This function reverses the input message.

Example

use cipha::utils::reverse_cipher;
let input = "Hello, World!";
let reversed = reverse_cipher(input);
assert_eq!(reversed, "!dlroW ,olleH");

Alpha to Num and Num to Alpha

These functions convert alphabetic characters to their corresponding numerical values and vice versa. It is used to compute Gematria

Example

use cipha::utils::alpha2num;
let input = "Hello, World!";
let result = alpha2num(input);
assert_eq!(result, "8 5 12 12 15 ,   23 15 18 12 4 !");

use cipha::utils::num2alpha;
let input = "8 5 12 12 15 , 23 15 18 12 4 !";
let result = num2alpha(input);
assert_eq!(result, "Hello, World!");

Vigenère Cipher

The Vigenère cipher uses a keyword to shift each letter in the input message.

Example

use cipha::utils::vigenere_cipher;
let plaintext = "ATTACKATDAWN".to_string();
let key = "LEMON".to_string();
let ciphertext = vigenere_cipher(&plaintext, &key);
assert_eq!(ciphertext, "LXFOPVEFRNHR");

use cipha::utils::vigenere_decipher;
let ciphertext = "LXFOPVEFRNHR".to_string();
let key = "LEMON".to_string();
let plaintext = vigenere_decipher(&ciphertext, &key);
assert_eq!(plaintext, "ATTACKATDAWN");

Morse Code Cipher

This function encodes and decodes text into Morse code.

Example

use cipha::utils::morse_code_cipher;
let input = "HELLO".to_string();
let morse_code = morse_code_cipher(&input);
assert_eq!(morse_code, ".... . .-.. .-.. ---");

use cipha::utils::morse_code_decipher;
let input = ".... . .-.. .-.. ---".to_string();
let result = morse_code_decipher(&input);
assert_eq!(result, "HELLO");

Atbash Cipher

The Atbash cipher is a simple substitution cipher where each letter is replaced by its corresponding letter at the opposite end of the alphabet.

Example

use cipha::utils::atbash_cipher;
let plaintext = "ATTACKATDAWN";
let ciphertext = atbash_cipher(plaintext);
assert_eq!(ciphertext, "ZGGZXPZGWZDM");

use cipha::utils::atbash_decipher;
let ciphertext = "ZGGZXPZGWZDM";
let plaintext = atbash_decipher(&ciphertext);
assert_eq!(plaintext, "ATTACKATDAWN");

Rail Fence Cipher

This function encodes and decodes text using the Rail Fence cipher which is a transposition cipher.

Example

use cipha::utils::rail_fence_cipher;
let plaintext = "WEAREDISCOVEREDSAVEYOURSELF";
let rails = 3;
let ciphertext = rail_fence_cipher(plaintext, rails);
assert_eq!(ciphertext, "WECRAOEERDSOEESVYUSLAIVDERF");

use cipha::utils::rail_fence_decipher;
let ciphertext = "WECRAOEERDSOEESVYUSLAIVDERF";
let rails = 3;
let plaintext = rail_fence_decipher(&ciphertext, rails);
assert_eq!(plaintext, "WEAREDISCOVEREDSAVEYOURSELF");

Conclusion

The cipha-lib crate provides a variety of cryptographic functions that can be easily integrated into your Rust projects. By following the examples and testing your code, you can ensure that your cryptographic operations are accurate and reliable.

Cipha-lib: Struct Based Approach

  • We can also use the ciphers using a struct based approach inspired by the cipers package ciphers.rs
use cipha::ciphers::*;

fn main() {
    let r1 = Rot13Cipher::new();
    let encrypted = r1.encipher("Some string");
    let decrypted = r1.decipher(&encrypted);
    println!("Encrypted: {}, Decrypted: {}", encrypted, decrypted);

    let c1 = CaesarCipher::new(3);
    let encrypted = c1.encipher("Some string");
    let decrypted = c1.decipher(&encrypted);
    println!("Encrypted: {}, Decrypted: {}", encrypted, decrypted);

    let v1 = VigenereCipher::new("LEMON");
    let encrypted = v1.encipher("ATTACKATDAWN");
    let decrypted = v1.decipher(&encrypted);
    println!("Encrypted: {}, Decrypted: {}", encrypted, decrypted);


    let morse_code = MorseCode::new();
    let input = "HELLO";
    let encoded = morse_code.encode(input);
    println!("Encoded: {}", encoded);

    let decoded = morse_code.decode(&encoded);
    println!("Decoded: {}", decoded);

      let converter = AlphaNumConverter::new();
    let input = "Hello, World!";
    let result = converter.alpha_to_num(input);
    println!("Alpha to Num: {}", result);

    let input = "8 5 12 12 15 , 23 15 18 12 4 !";
    let result = converter.num_to_alpha(input);
    println!("Num to Alpha: {}", result);

     let atbash = AtbashCipher::new();
    let plaintext = "ATTACKATDAWN";
    let ciphertext = atbash.encipher(plaintext);
    println!("Encrypted: {}", ciphertext);

    let decrypted_text = atbash.decipher(&ciphertext);
    println!("Decrypted: {}", decrypted_text);
}


Cipha-cli

The cipha-cli provides an interface to use all the ciphers from the command line. You can find more here cipha-cli.

No runtime deps