summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/crack.rs156
-rw-r--r--src/dh.rs9
-rw-r--r--src/lib.rs3
3 files changed, 165 insertions, 3 deletions
diff --git a/src/crack.rs b/src/crack.rs
index 49507f4..a4e7005 100644
--- a/src/crack.rs
+++ b/src/crack.rs
@@ -721,6 +721,162 @@ where
key.to_vec()
}
+pub trait DiffieHellmanMessageExchanger {
+ fn a_channel(
+ &self,
+ ) -> (
+ &crossbeam::channel::Sender<Vec<u8>>,
+ &crossbeam::channel::Receiver<Vec<u8>>,
+ );
+ fn b_channel(
+ &self,
+ ) -> (
+ &crossbeam::channel::Sender<Vec<u8>>,
+ &crossbeam::channel::Receiver<Vec<u8>>,
+ );
+}
+
+pub struct NullDiffieHellmanMessageExchanger {
+ a_sender: crossbeam::channel::Sender<Vec<u8>>,
+ a_recver: crossbeam::channel::Receiver<Vec<u8>>,
+ b_sender: crossbeam::channel::Sender<Vec<u8>>,
+ b_recver: crossbeam::channel::Receiver<Vec<u8>>,
+}
+
+impl NullDiffieHellmanMessageExchanger {
+ pub fn new() -> NullDiffieHellmanMessageExchanger {
+ let (a_sender, b_recver) = crossbeam::channel::unbounded();
+ let (b_sender, a_recver) = crossbeam::channel::unbounded();
+ NullDiffieHellmanMessageExchanger {
+ a_sender,
+ a_recver,
+ b_sender,
+ b_recver,
+ }
+ }
+}
+
+impl DiffieHellmanMessageExchanger for NullDiffieHellmanMessageExchanger {
+ fn a_channel(
+ &self,
+ ) -> (
+ &crossbeam::channel::Sender<Vec<u8>>,
+ &crossbeam::channel::Receiver<Vec<u8>>,
+ ) {
+ (&self.a_sender, &self.a_recver)
+ }
+
+ fn b_channel(
+ &self,
+ ) -> (
+ &crossbeam::channel::Sender<Vec<u8>>,
+ &crossbeam::channel::Receiver<Vec<u8>>,
+ ) {
+ (&self.b_sender, &self.b_recver)
+ }
+}
+
+pub struct ParameterInjectionDiffieHellmanMessageExchanger {
+ a_sender: crossbeam::channel::Sender<Vec<u8>>,
+ a_recver: crossbeam::channel::Receiver<Vec<u8>>,
+ b_sender: crossbeam::channel::Sender<Vec<u8>>,
+ b_recver: crossbeam::channel::Receiver<Vec<u8>>,
+ thread: std::thread::JoinHandle<Vec<u8>>,
+}
+
+impl ParameterInjectionDiffieHellmanMessageExchanger {
+ pub fn new() -> ParameterInjectionDiffieHellmanMessageExchanger {
+ let (a_sender, ma_recver) = crossbeam::channel::unbounded();
+ let (ma_sender, b_recver) = crossbeam::channel::unbounded();
+ let (b_sender, mb_recver) = crossbeam::channel::unbounded();
+ let (mb_sender, a_recver) = crossbeam::channel::unbounded();
+
+ let thread = std::thread::spawn(move || {
+ let a_bytes: Vec<u8> = ma_recver.recv().unwrap();
+ let a: crate::dh::DHKeyPair =
+ serde_json::from_slice(&a_bytes).unwrap();
+ let mut modified_a = a.clone();
+ modified_a.pubkey = modified_a.p.clone();
+ ma_sender
+ .send(serde_json::to_vec(&modified_a).unwrap())
+ .unwrap();
+
+ let b_bytes: Vec<u8> = mb_recver.recv().unwrap();
+ let b: crate::dh::DHKeyPair =
+ serde_json::from_slice(&b_bytes).unwrap();
+ let mut modified_b = b.clone();
+ modified_b.pubkey = modified_b.p.clone();
+ mb_sender
+ .send(serde_json::to_vec(&modified_b).unwrap())
+ .unwrap();
+
+ let a_ciphertext = ma_recver.recv().unwrap();
+ ma_sender.send(a_ciphertext.clone()).unwrap();
+ let a_iv = ma_recver.recv().unwrap();
+ ma_sender.send(a_iv.clone()).unwrap();
+
+ let b_ciphertext = mb_recver.recv().unwrap();
+ mb_sender.send(b_ciphertext.clone()).unwrap();
+ let b_iv = mb_recver.recv().unwrap();
+ mb_sender.send(b_iv.clone()).unwrap();
+
+ let s = num_bigint::BigUint::from(0 as u8);
+ let mut aes_key = crate::sha1::sha1(&s.to_bytes_le()).to_vec();
+ aes_key.truncate(16);
+
+ let a_plaintext = crate::aes::decrypt_aes_128_cbc(
+ &a_ciphertext,
+ &aes_key,
+ &a_iv,
+ )
+ .unwrap();
+ let b_plaintext = crate::aes::decrypt_aes_128_cbc(
+ &b_ciphertext,
+ &aes_key,
+ &b_iv,
+ )
+ .unwrap();
+ assert_eq!(a_plaintext, b_plaintext);
+
+ a_plaintext
+ });
+
+ ParameterInjectionDiffieHellmanMessageExchanger {
+ a_sender,
+ a_recver,
+ b_sender,
+ b_recver,
+ thread,
+ }
+ }
+
+ pub fn retrieve_plaintext(self) -> Vec<u8> {
+ self.thread.join().unwrap()
+ }
+}
+
+impl DiffieHellmanMessageExchanger
+ for ParameterInjectionDiffieHellmanMessageExchanger
+{
+ fn a_channel(
+ &self,
+ ) -> (
+ &crossbeam::channel::Sender<Vec<u8>>,
+ &crossbeam::channel::Receiver<Vec<u8>>,
+ ) {
+ (&self.a_sender, &self.a_recver)
+ }
+
+ fn b_channel(
+ &self,
+ ) -> (
+ &crossbeam::channel::Sender<Vec<u8>>,
+ &crossbeam::channel::Receiver<Vec<u8>>,
+ ) {
+ (&self.b_sender, &self.b_recver)
+ }
+}
+
fn crack_single_byte_xor_with_confidence(input: &[u8]) -> (u8, f64) {
let mut min_diff = 100.0;
let mut best_key = 0;
diff --git a/src/dh.rs b/src/dh.rs
index 24c2277..0db0bb2 100644
--- a/src/dh.rs
+++ b/src/dh.rs
@@ -1,10 +1,13 @@
use num_bigint::RandBigInt;
+use serde_derive::{Deserialize, Serialize};
+#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DHKeyPair {
pub p: num_bigint::BigUint,
pub g: num_bigint::BigUint,
pub pubkey: num_bigint::BigUint,
- privkey: num_bigint::BigUint,
+ #[serde(skip)]
+ privkey: Option<num_bigint::BigUint>,
}
impl DHKeyPair {
@@ -15,7 +18,7 @@ impl DHKeyPair {
p,
g,
pubkey,
- privkey,
+ privkey: Some(privkey),
}
}
@@ -23,6 +26,6 @@ impl DHKeyPair {
&self,
other_pubkey: &num_bigint::BigUint,
) -> num_bigint::BigUint {
- other_pubkey.modpow(&self.privkey, &self.p)
+ other_pubkey.modpow(self.privkey.as_ref().unwrap(), &self.p)
}
}
diff --git a/src/lib.rs b/src/lib.rs
index 7c1dc82..8f98763 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -37,6 +37,9 @@ pub use crack::recover_16_bit_mt19937_key;
pub use crack::recover_mersenne_twister_seed_from_time;
pub use crack::recover_mt19937_key_from_time;
pub use crack::BlockCipherMode;
+pub use crack::DiffieHellmanMessageExchanger;
+pub use crack::NullDiffieHellmanMessageExchanger;
+pub use crack::ParameterInjectionDiffieHellmanMessageExchanger;
pub use dh::DHKeyPair;
pub use http::create_query_string;
pub use http::parse_query_string;