diff --git a/src/lib/crypt.rs b/src/lib/crypt.rs index 81427ff..c9e1e3f 100644 --- a/src/lib/crypt.rs +++ b/src/lib/crypt.rs @@ -4,6 +4,7 @@ use cfb_mode::Cfb; use des::Des; use rand::Rng; use rayon::prelude::*; +use std::sync::Mutex; type DesCfb = Cfb; @@ -35,15 +36,24 @@ pub fn decrypt_with_dictionary( dict: Vec, checksum: &[u8], ) -> Option> { + let decrypted = Mutex::>>::new(None); let pass = dict.par_iter().find_first(|(_pw, key)| { let decrypted_data = decrypt_data(&data, key); let decr_check = sha_checksum(&decrypted_data); - - decr_check == checksum + return if decr_check == checksum { + let mut decry = decrypted.lock().unwrap(); + *decry = Some(decrypted_data); + true + } else { + false + }; }); - if let Some((pw, key)) = pass { + if let Some((pw, _key)) = pass { println!("Password found: {}", pw); - return Some(decrypt_data(data, &key)); + let decry = decrypted.lock().unwrap(); + if let Some(decrypted_data) = (*decry).clone() { + return Some(decrypted_data); + } } None } diff --git a/src/main.rs b/src/main.rs index f6c8405..7673573 100644 --- a/src/main.rs +++ b/src/main.rs @@ -180,7 +180,7 @@ fn create_dictionary(_opts: &Opts, args: &CreateDictionary) { println!("Writing passwords to file..."); let mut fout = File::create(args.output.clone()).unwrap(); - for entry in dictionary { + for entry in &dictionary { let key = base64::encode(entry.1.as_slice()); let line = format!("{},{}\n", entry.0, key); fout.write(&line.into_bytes()).unwrap();