summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);
+}