summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2015-04-06 01:46:11 -0400
committerJesse Luehrs <doy@tozt.net>2015-04-06 01:46:11 -0400
commitcf5f54073a9494fbd0c44c54f2b1a29b1b87e642 (patch)
tree5ba6ce04e58d19fe179cb04e02d4bb7fc25bf301
parent82fde31b637e72d381857e3e2cb669298073edd1 (diff)
downloadmatasano-cf5f54073a9494fbd0c44c54f2b1a29b1b87e642.tar.gz
matasano-cf5f54073a9494fbd0c44c54f2b1a29b1b87e642.zip
problem 24 part 2
-rw-r--r--src/crack.rs13
-rw-r--r--src/lib.rs1
-rw-r--r--tests/lib.rs9
3 files changed, 23 insertions, 0 deletions
diff --git a/src/crack.rs b/src/crack.rs
index 396eb6b..39a8e1a 100644
--- a/src/crack.rs
+++ b/src/crack.rs
@@ -414,6 +414,19 @@ pub fn recover_16_bit_mt19937_key (ciphertext: &[u8], suffix: &[u8]) -> Option<u
return None;
}
+pub fn recover_mt19937_key_from_time (token: &[u8]) -> Option<u32> {
+ let now = ::time::now().to_timespec().sec as u32;
+ for i in -500..500i32 {
+ let seed = (now as i32).wrapping_add(i) as u32;
+ let mut mt = MersenneTwister::from_seed(seed);
+ let test_token: Vec<u8> = mt.gen_iter().take(16).collect();
+ if &test_token[..] == token {
+ return Some(seed);
+ }
+ }
+ return None;
+}
+
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/lib.rs b/src/lib.rs
index 21bac75..eeb3278 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -40,3 +40,4 @@ pub use crack::crack_fixed_nonce_ctr_statistically;
pub use crack::recover_mersenne_twister_seed_from_time;
pub use crack::clone_mersenne_twister_from_output;
pub use crack::recover_16_bit_mt19937_key;
+pub use crack::recover_mt19937_key_from_time;
diff --git a/tests/lib.rs b/tests/lib.rs
index d38e3e3..3961b84 100644
--- a/tests/lib.rs
+++ b/tests/lib.rs
@@ -512,3 +512,12 @@ fn problem_24 () {
).unwrap();
assert_eq!(got, key);
}
+
+#[test]
+fn problem_24_part_2 () {
+ let seed = time::now().to_timespec().sec as u32;
+ let mut mt = matasano::MersenneTwister::from_seed(seed);
+ let token: Vec<u8> = mt.gen_iter().take(16).collect();
+ let got = matasano::recover_mt19937_key_from_time(&token[..]).unwrap();
+ assert_eq!(got, seed);
+}