Finish challenge 23.
This commit is contained in:
@@ -10,7 +10,7 @@ mod set2;
|
|||||||
mod set3;
|
mod set3;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
const RUN_ALL: bool = false;
|
const RUN_ALL: bool = true;
|
||||||
if RUN_ALL {
|
if RUN_ALL {
|
||||||
set1::challenge1();
|
set1::challenge1();
|
||||||
set1::challenge2();
|
set1::challenge2();
|
||||||
@@ -35,7 +35,8 @@ fn main() {
|
|||||||
set3::challenge21();
|
set3::challenge21();
|
||||||
set3::challenge22();
|
set3::challenge22();
|
||||||
set3::challenge23();
|
set3::challenge23();
|
||||||
|
set3::challenge24();
|
||||||
} else {
|
} else {
|
||||||
set3::challenge23();
|
set3::challenge24();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
98
src/set3.rs
98
src/set3.rs
@@ -304,7 +304,6 @@ pub fn challenge20() {
|
|||||||
|
|
||||||
pub fn challenge21() {
|
pub fn challenge21() {
|
||||||
// Implement the MT19937 Mersenne Twister RNG
|
// Implement the MT19937 Mersenne Twister RNG
|
||||||
|
|
||||||
let expected: Vec<u32> = vec![
|
let expected: Vec<u32> = vec![
|
||||||
0xD091BB5C, 0x22AE9EF6, 0xE7E1FAEE, 0xD5C31F79, 0x2082352C, 0xF807B7DF, 0xE9D30005,
|
0xD091BB5C, 0x22AE9EF6, 0xE7E1FAEE, 0xD5C31F79, 0x2082352C, 0xF807B7DF, 0xE9D30005,
|
||||||
0x3895AFE1, 0xA1E24BBA, 0x4EE4092B,
|
0x3895AFE1, 0xA1E24BBA, 0x4EE4092B,
|
||||||
@@ -314,7 +313,7 @@ pub fn challenge21() {
|
|||||||
for i in 0..expected.len() {
|
for i in 0..expected.len() {
|
||||||
assert_eq!(mt.extract_number(), expected[i]);
|
assert_eq!(mt.extract_number(), expected[i]);
|
||||||
}
|
}
|
||||||
println!("[okay] Challenge 21: Implemented MT19937");
|
println!("[okay] Challenge 21: implemented MT19937");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn challenge22() {
|
pub fn challenge22() {
|
||||||
@@ -355,64 +354,78 @@ pub fn challenge22() {
|
|||||||
let found_seed = find_seed(rngout);
|
let found_seed = find_seed(rngout);
|
||||||
assert_eq!(seed, found_seed.unwrap());
|
assert_eq!(seed, found_seed.unwrap());
|
||||||
|
|
||||||
println!("[done] Challenge 22: cracked MT19937 seed.");
|
println!("[okay] Challenge 22: cracked MT19937 seed");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn challenge23() {
|
pub fn challenge23() {
|
||||||
fn temper(x: u32) -> u32 {
|
fn _temper(x: u32) -> u32 {
|
||||||
const S: u32 = 7;
|
const S: u32 = 7;
|
||||||
// const T: u32 = 15;
|
const T: u32 = 15;
|
||||||
// const U: u32 = 11;
|
const U: u32 = 11;
|
||||||
const B: u32 = 0x9D2C5680;
|
const B: u32 = 0x9D2C5680;
|
||||||
// const C: u32 = 0xEFC60000;
|
const C: u32 = 0xEFC60000;
|
||||||
// const L: u32 = 18;
|
const L: u32 = 18;
|
||||||
|
|
||||||
let mut y = x;
|
let mut y = x;
|
||||||
// y = y ^ (y >> U);
|
y = y ^ (y >> U);
|
||||||
y = y ^ ((y << S) & B);
|
y = y ^ ((y << S) & B);
|
||||||
// y = y ^ ((y << T) & C);
|
y = y ^ ((y << T) & C);
|
||||||
// y = y ^ (y >> L);
|
y = y ^ (y >> L);
|
||||||
y
|
y
|
||||||
}
|
}
|
||||||
|
|
||||||
fn untemper(x: u32) -> u32 {
|
fn untemper(x: u32) -> u32 {
|
||||||
//const S: u32 = 7;
|
const B: u32 = 0x9D2C5680;
|
||||||
//const T: u32 = 15;
|
const C: u32 = 0xEFC60000;
|
||||||
//const B: u32 = 0x9D2C5680;
|
|
||||||
//const C: u32 = 0xEFC60000;
|
|
||||||
const M: u32 = 32;
|
|
||||||
|
|
||||||
let mut y = x;
|
let mut y = x;
|
||||||
|
|
||||||
// reverse y = y ^ (y >> L); L = 18;
|
// reverse y = y ^ (y >> L); L = 18;
|
||||||
// const UPPER_18_BITS: u32 = u32::MAX << (M - 18);
|
const UPPER_18_BITS: u32 = u32::MAX << 14;
|
||||||
// const LOWER_14_BITS: u32 = u32::MAX >> 18;
|
const LOWER_14_BITS: u32 = u32::MAX >> 18;
|
||||||
// let mut o = y & UPPER_18_BITS; // upper 18 bits are correct
|
let mut o = y & UPPER_18_BITS; // upper 18 bits are correct
|
||||||
// o |= ((o & UPPER_18_BITS) >> 18) ^ (y & LOWER_14_BITS); // all 32 bits are correct
|
o |= ((o & UPPER_18_BITS) >> 18) ^ (y & LOWER_14_BITS); // all 32 bits are correct
|
||||||
// y = o;
|
y = o;
|
||||||
|
|
||||||
// reverse y = y ^ ((y << T) & C);
|
// reverse y = y ^ ((y << T) & C); T = 15;
|
||||||
|
const LOWER_15_BITS: u32 = u32::MAX >> 17;
|
||||||
|
const MID_15_BITS: u32 = LOWER_15_BITS << 15;
|
||||||
|
const UPPER_2_BITS: u32 = u32::MAX << 30;
|
||||||
|
let mut o = y & LOWER_15_BITS; // lower 15 bits are correct
|
||||||
|
o |= ((o << 15) & C) ^ (y & MID_15_BITS); // lower 30 bits are correct
|
||||||
|
o |= (((o << 15) & C) & UPPER_2_BITS) ^ (y & UPPER_2_BITS); // all 32 bits are correct
|
||||||
|
y = o;
|
||||||
|
|
||||||
// reverse y = y ^ ((y << S) & B);
|
// reverse y = y ^ ((y << S) & B); S = 7
|
||||||
|
const LOWER_7_BITS: u32 = u32::MAX >> 25;
|
||||||
|
const SECOND_7_BITS: u32 = LOWER_7_BITS << 7;
|
||||||
|
const THIRD_7_BITS: u32 = SECOND_7_BITS << 7;
|
||||||
|
const FOURTH_7_BITS: u32 = THIRD_7_BITS << 7;
|
||||||
|
const UPPER_4_BITS: u32 = u32::MAX << 28;
|
||||||
|
let mut o = y & LOWER_7_BITS; // lower 7 bits are correct
|
||||||
|
o |= ((o << 7) & B) ^ (y & SECOND_7_BITS); // lower 14 bits are correct
|
||||||
|
o |= (((o << 7) & B) & THIRD_7_BITS) ^ (y & THIRD_7_BITS); // lower 21 bits are correct
|
||||||
|
o |= (((o << 7) & B) & FOURTH_7_BITS) ^ (y & FOURTH_7_BITS); // lower 28 bits are correct
|
||||||
|
o |= (((o << 7) & B) & UPPER_4_BITS) ^ (y & UPPER_4_BITS); // all 32 bits are correct
|
||||||
|
y = o;
|
||||||
|
|
||||||
// reverse y = y ^ (y >> U); U = 11;
|
// reverse y = y ^ (y >> U); U = 11;
|
||||||
// const UPPER_11_BITS: u32 = u32::MAX << (M - 11);
|
const UPPER_11_BITS: u32 = u32::MAX << 21;
|
||||||
// const SECOND_11_BITS: u32 = UPPER_11_BITS >> 11;
|
const SECOND_11_BITS: u32 = UPPER_11_BITS >> 11;
|
||||||
// const LOWER_10_BITS: u32 = u32::MAX >> (M - 10);
|
const LOWER_10_BITS: u32 = u32::MAX >> 22;
|
||||||
// let mut o = y & UPPER_11_BITS; // upper 11 bits are correct
|
let mut o = y & UPPER_11_BITS; // upper 11 bits are correct
|
||||||
// o |= ((o & UPPER_11_BITS) >> 11) ^ (y & SECOND_11_BITS); // upper 22 bits are correct
|
o |= ((o & UPPER_11_BITS) >> 11) ^ (y & SECOND_11_BITS); // upper 22 bits are correct
|
||||||
// o |= ((o & SECOND_11_BITS) >> 11) ^ (y & LOWER_10_BITS); // all 32 bits are correct
|
o |= ((o & SECOND_11_BITS) >> 11) ^ (y & LOWER_10_BITS); // all 32 bits are correct
|
||||||
// y = o;
|
y = o;
|
||||||
|
|
||||||
y
|
y
|
||||||
}
|
}
|
||||||
|
|
||||||
let a: u32 = 0x12345678;
|
// untemper test code
|
||||||
let b = temper(a);
|
// let a: u32 = 0x12345678;
|
||||||
let c = untemper(b);
|
// let b = _temper(a);
|
||||||
println!("{:#010x} -> {:#010x} -> {:#010x}", a, b, c);
|
// let c = untemper(b);
|
||||||
|
// println!("{:#010x} -> {:#010x} -> {:#010x}", a, b, c);
|
||||||
|
|
||||||
/*
|
|
||||||
// Once you have "untemper" working, create a new MT19937 generator, tap it for 624 outputs,
|
// Once you have "untemper" working, create a new MT19937 generator, tap it for 624 outputs,
|
||||||
let mut mt = mt19937::MT19937::new();
|
let mut mt = mt19937::MT19937::new();
|
||||||
let seed: u32 = rand::thread_rng().gen::<u32>();
|
let seed: u32 = rand::thread_rng().gen::<u32>();
|
||||||
@@ -425,8 +438,15 @@ pub fn challenge23() {
|
|||||||
// and splice that state into a new instance of the MT19937 generator.
|
// and splice that state into a new instance of the MT19937 generator.
|
||||||
let mut spliced_mt = mt19937::MT19937::new();
|
let mut spliced_mt = mt19937::MT19937::new();
|
||||||
spliced_mt.splice(outputs);
|
spliced_mt.splice(outputs);
|
||||||
println!("{} {}", mt.extract_number(), spliced_mt.extract_number());
|
|
||||||
*/
|
|
||||||
|
|
||||||
println!("[xxxx] Challenge 23: wip");
|
// The new "spliced" generator should predict the values of the original.
|
||||||
|
for _ in 0..2000 {
|
||||||
|
assert_eq!(mt.extract_number(), spliced_mt.extract_number());
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("[okay] Challenge 23: MT19937 RNG successfully cloned from output");
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn challenge24() {
|
||||||
|
println!("[xxxx] Challenge 24: xxx");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user