From f7950b903b2e16d9d6f598fbd6ad8ab933af7c1f Mon Sep 17 00:00:00 2001 From: r0r-5chach Date: Sat, 2 Nov 2024 21:30:46 +0000 Subject: [PATCH] init. encoding --- src/cli.rs | 0 src/decoding.rs | 0 src/encoding.rs | 72 ++++++++++++++++++++++++++++++++++++++++ src/gui.rs | 0 src/lib.rs | 31 ++++++++++++++++++ src/main.rs | 11 +++++++ src/message.rs | 87 +++++++++++++++++++++++++++++++++++++++++++++++++ src/plotting.rs | 0 8 files changed, 201 insertions(+) create mode 100644 src/cli.rs create mode 100644 src/decoding.rs create mode 100644 src/encoding.rs create mode 100644 src/gui.rs create mode 100644 src/lib.rs create mode 100644 src/main.rs create mode 100644 src/message.rs create mode 100644 src/plotting.rs diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/decoding.rs b/src/decoding.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/encoding.rs b/src/encoding.rs new file mode 100644 index 0000000..d29590f --- /dev/null +++ b/src/encoding.rs @@ -0,0 +1,72 @@ +use std::{iter, ops::Add}; +use crate::message::{self, Message}; + +pub fn encrypt_message(message: &mut Message, circle_length: &usize) -> Vec { + fill_circles( + &mut encode_circles( + &mut triples_into_circles(&message.to_triples(), circle_length), + &mut message.parts.start_shift, + ), + circle_length + ) +} + +fn caesar_shift(char: char, shift: u8) -> char { + (char as u8 + shift) as char +} + +type Circle = Vec; + +fn triples_into_circles(triples: &Vec, circle_length: &usize) -> Vec { + triples.chunks(*circle_length) + .map(|chunk| { + chunk.to_vec() + }).collect() +} + +fn encode_circles(circles: &mut Vec, shift: &mut u8) -> Vec { + circles.iter_mut().enumerate().map(|(count, circle)| { + let shift_delta = match count { + count if count % 2 == 0 => count.add(1) as i8, + _ => -(count.add(1) as i8) + }; + + let circle_iter = circle.iter_mut(); + + let new_circle = match count { + 0 => circle_iter.skip(1), + _ => circle_iter.skip(0), + }.map(|triple| { + triple.first = caesar_shift(triple.first, *shift); + *shift = shift.wrapping_add_signed(shift_delta); + triple.second = caesar_shift(triple.second, *shift); + *shift = shift.wrapping_add_signed(shift_delta); + triple.second = caesar_shift(triple.third, *shift); + *shift = shift.wrapping_add_signed(shift_delta); + + triple.clone() + }).collect::(); + + let new_circle = match count { + 0 => { + let mut vec = vec![circle[0].clone()]; + vec.extend(new_circle); + return vec; + }, + _ => new_circle, + }; + + new_circle + }).collect() +} + +fn fill_circles(circles: &mut Vec, circle_length: &usize) -> Vec { + circles.iter_mut().map(|circle| { + circle.extend(iter::repeat(message::Triple::filler()) + .take( + circle_length - circle.len() + ) + ); + circle.clone() + }).collect() +} diff --git a/src/gui.rs b/src/gui.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..7048535 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,31 @@ +use clap::{Parser, Subcommand}; +use std::path::PathBuf; + +mod message; +mod encoding; + +pub use message::Message; +pub use encoding::encrypt_message; + +#[derive(Parser)] +#[command(version, about, long_about = None)] +pub struct Args { + #[command(subcommand)] + pub mode: Mode, + #[arg(short, long)] + pub message: String, + #[arg(short, long)] + pub start_shift: String, + #[arg(short, long)] + pub circle_length: usize, +} + +#[derive(Subcommand)] +pub enum Mode { + Gui, + Display, + Save { + #[arg(short, long)] + path: PathBuf + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..4a2b7df --- /dev/null +++ b/src/main.rs @@ -0,0 +1,11 @@ +use circle_cipher:: { + encrypt_message, + Message +}; + +fn main() { + let mut msg = Message::new("Hello".to_string(), 12); + let circles = encrypt_message(&mut msg, &127); + + println!("{:?}", circles) +} diff --git a/src/message.rs b/src/message.rs new file mode 100644 index 0000000..84133f4 --- /dev/null +++ b/src/message.rs @@ -0,0 +1,87 @@ +use std::vec::IntoIter; + + +pub struct Message { + pub parts: Parts, + pub combined: String, +} +impl Message { + pub fn new(content: String, start_shift: u8) -> Self { + let parts = Parts::new(content, start_shift); + let combined = parts.shift_to_string() + &parts.content; + Self { + parts, + combined, + } + } + + pub fn to_triples(&self) -> Vec { + self.combined.chars() + .collect::>() + .chunks(3) + .filter_map(|chunk| { + Some(Triple::new(chunk[0], chunk[1], chunk[2])) + } + ).collect() + } +} +pub struct Parts { + pub content: String, + pub start_shift: u8, +} +impl Parts { + fn new(content: String, start_shift: u8) -> Self { + let mut parts = Self { + content, + start_shift, + }; + parts.standardize(); + + parts + } + + fn standardize(&mut self) { + let delta = self.content.len() % 3; + match delta { + 0 => (), + _ => { self.content += &"_".repeat(3 - delta) }, + } + } + + fn shift_to_string(&self) -> String { + let string = self.start_shift.to_string(); + "0".repeat(3 - string.len()) + &string + } +} +#[derive(Clone, Debug)] +pub struct Triple { + pub first: char, + pub second: char, + pub third: char +} +impl Triple { + fn new(first: char, second: char, third: char) -> Self { + Self { + first, + second, + third, + } + } + + pub fn filler() -> Self { + let filler = 0 as char; + Self { + first: filler, + second: filler, + third: filler, + } + } +} +impl IntoIterator for Triple { + type Item = char; + type IntoIter = IntoIter; + + fn into_iter(self) -> Self::IntoIter { + vec![self.first, self.second, self.third].into_iter() + } +} diff --git a/src/plotting.rs b/src/plotting.rs new file mode 100644 index 0000000..e69de29