From 1c663ca4e0cf4584e941e18d967d38ee628c9e0d Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 18 Apr 2019 04:24:54 -0400 Subject: problem 35 --- src/crack.rs | 111 ++++++++++++++++++++++++++++++++++++++++++++--------------- src/dh.rs | 4 +-- 2 files changed, 84 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/crack.rs b/src/crack.rs index a4e7005..e65ea35 100644 --- a/src/crack.rs +++ b/src/crack.rs @@ -785,29 +785,87 @@ pub struct ParameterInjectionDiffieHellmanMessageExchanger { } impl ParameterInjectionDiffieHellmanMessageExchanger { - pub fn new() -> ParameterInjectionDiffieHellmanMessageExchanger { + pub fn new( + inject_pg: F, + inject_pubkey: G, + generate_s: H, + ) -> ParameterInjectionDiffieHellmanMessageExchanger + where + F: 'static + + Send + + Fn( + num_bigint::BigUint, + num_bigint::BigUint, + ) -> (num_bigint::BigUint, num_bigint::BigUint), + G: 'static + + Send + + Fn( + num_bigint::BigUint, + num_bigint::BigUint, + num_bigint::BigUint, + ) -> num_bigint::BigUint, + H: 'static + + Send + + Fn( + num_bigint::BigUint, + num_bigint::BigUint, + ) -> Vec, + { 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 p_bytes: Vec = ma_recver.recv().unwrap(); + let p: num_bigint::BigUint = + serde_json::from_slice(&p_bytes).unwrap(); + let g_bytes: Vec = ma_recver.recv().unwrap(); + let g: num_bigint::BigUint = + serde_json::from_slice(&g_bytes).unwrap(); + + let (modified_p, modified_g) = inject_pg(p.clone(), g.clone()); + ma_sender + .send(serde_json::to_vec(&modified_p).unwrap()) + .unwrap(); + ma_sender + .send(serde_json::to_vec(&modified_g).unwrap()) + .unwrap(); + + let p_bytes: Vec = mb_recver.recv().unwrap(); + let p: num_bigint::BigUint = + serde_json::from_slice(&p_bytes).unwrap(); + let g_bytes: Vec = mb_recver.recv().unwrap(); + let g: num_bigint::BigUint = + serde_json::from_slice(&g_bytes).unwrap(); + mb_sender + .send(serde_json::to_vec(&modified_p).unwrap()) + .unwrap(); + mb_sender + .send(serde_json::to_vec(&modified_g).unwrap()) + .unwrap(); + + let possible_s = + generate_s(modified_p.clone(), modified_g.clone()); + let a_bytes: Vec = ma_recver.recv().unwrap(); - let a: crate::dh::DHKeyPair = + let a_pubkey: num_bigint::BigUint = serde_json::from_slice(&a_bytes).unwrap(); - let mut modified_a = a.clone(); - modified_a.pubkey = modified_a.p.clone(); + + let modified_pubkey_a = + inject_pubkey(p.clone(), g.clone(), a_pubkey); ma_sender - .send(serde_json::to_vec(&modified_a).unwrap()) + .send(serde_json::to_vec(&modified_pubkey_a).unwrap()) .unwrap(); let b_bytes: Vec = mb_recver.recv().unwrap(); - let b: crate::dh::DHKeyPair = + let b_pubkey: num_bigint::BigUint = serde_json::from_slice(&b_bytes).unwrap(); - let mut modified_b = b.clone(); - modified_b.pubkey = modified_b.p.clone(); + + let modified_pubkey_b = + inject_pubkey(p.clone(), g.clone(), b_pubkey); mb_sender - .send(serde_json::to_vec(&modified_b).unwrap()) + .send(serde_json::to_vec(&modified_pubkey_b).unwrap()) .unwrap(); let a_ciphertext = ma_recver.recv().unwrap(); @@ -820,25 +878,22 @@ impl ParameterInjectionDiffieHellmanMessageExchanger { 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 + for s in possible_s { + 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, + ); + if let Some(a_plaintext) = a_plaintext { + return a_plaintext; + } + } + + unreachable!() }); ParameterInjectionDiffieHellmanMessageExchanger { diff --git a/src/dh.rs b/src/dh.rs index 0db0bb2..5e368d9 100644 --- a/src/dh.rs +++ b/src/dh.rs @@ -1,12 +1,10 @@ use num_bigint::RandBigInt; -use serde_derive::{Deserialize, Serialize}; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug)] pub struct DHKeyPair { pub p: num_bigint::BigUint, pub g: num_bigint::BigUint, pub pubkey: num_bigint::BigUint, - #[serde(skip)] privkey: Option, } -- cgit v1.2.3-54-g00ecf