Skip to content

Commit

Permalink
feat: project: encryption
Browse files Browse the repository at this point in the history
  • Loading branch information
ghimiresdp committed Sep 30, 2024
1 parent 6ceaa2d commit a867f04
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 6 deletions.
23 changes: 17 additions & 6 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ members = [
"problem-solving",
# projects
"projects/pandas",
"projects/ruscrypt",
]
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ cargo test --bin huffman
## [5. Projects](./projects/)

1. [Python's `Pandas` like dataframe container](projects/pandas/README.md) `cargo run --bin pandas`
2. [`ruscrypt` basic encryption](projects/ruscrypt/README.md) `cargo run --bin ruscrypt`

> **Note**: Topics that do not contain hyperlinks are work in progress and will
> be updated as soon as the solution gets completed.
Expand Down
6 changes: 6 additions & 0 deletions projects/ruscrypt/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[package]
name = "ruscrypt"
version = "0.1.0"
edition = "2021"

[dependencies]
8 changes: 8 additions & 0 deletions projects/ruscrypt/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Ruscrypt

`ruscrypt` is a basic encryption and decryption project that can encrypt and
decrypt messages with passwords.

This library demonstrates the basics of encrypting the data which is not safe
in production use, however you can use it as a fun project and encrypt and
decrypt your basic messages.
25 changes: 25 additions & 0 deletions projects/ruscrypt/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
mod ruscrypt;

use ruscrypt::Crypto;

fn main() {
let crypto = Crypto::new("test".to_owned());
let encrypted = crypto.encrypt("This is a original text".to_owned());
println!("Encrypted: {encrypted}");
let decrypted = crypto.decrypt(encrypted);
println!("Decrypted: {decrypted}");
}

#[cfg(test)]
mod tests {
use crate::ruscrypt::Crypto;

#[test]
fn test_encrypt_decrypt() {
let key = String::from("My Encryption Key");
let message = String::from("This is my Secret Message");

let crypt = Crypto::new(key);
assert_eq!(crypt.decrypt(crypt.encrypt(message.clone())), message);
}
}
38 changes: 38 additions & 0 deletions projects/ruscrypt/src/ruscrypt/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
pub(crate) struct Crypto {
key: Vec<u8>,
}

impl Crypto {
pub(crate) fn new(key: String) -> Self {
Self {
key: key.as_bytes().to_owned(),
}
}

pub(crate) fn encrypt(&self, message: String) -> String {
let len = self.key.len();
let enc = message
.bytes()
.enumerate()
.map(|(idx, ch)| {
let target = self.key[idx % len];
(target ^ ch) as char
// format!("{:0x}", target ^ ch)
})
.collect::<String>();
return enc;
}

pub(crate) fn decrypt(&self, message: String) -> String {
let len = self.key.len();
let dec = message
.bytes()
.enumerate()
.map(|(idx, ch)| {
let target = self.key[idx % len];
(target ^ ch) as char
})
.collect::<String>();
return dec;
}
}

0 comments on commit a867f04

Please sign in to comment.