From 110fb61e187b6e6ee299a18e38d1172387a6bf17 Mon Sep 17 00:00:00 2001 From: Felix Martin Date: Sun, 27 Mar 2022 10:13:23 -0400 Subject: [PATCH] Solve challenge 6. --- src/set1.rs | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/set1.rs b/src/set1.rs index 9583601..8c5adea 100644 --- a/src/set1.rs +++ b/src/set1.rs @@ -31,8 +31,8 @@ pub fn challenge3() { let a = Bytes::from_hex("1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736"); let mut h: Vec = (0..=255).map(|i| Bytes::xor_byte(&a, i)).collect(); h.sort_by(|a, b| a.ascii_score().partial_cmp(&b.ascii_score()).unwrap()); - let h: Vec = h.into_iter().filter(|b| b.is_ascii()).collect(); - let r = h[h.len() - 1].to_utf8(); + // let h: Vec = h.into_iter().filter(|b| b.is_ascii()).collect(); + let r = h.last().unwrap().to_utf8(); println!("[okay] Challenge 3: {}", r); } @@ -125,8 +125,34 @@ pub fn challenge6() { lowest_size } + fn transpose(Bytes(v): &Bytes, size: usize) -> Vec { + let mut result = vec![]; + for i in 0..size { + let mut column = vec![]; + for j in (i..v.len()).step_by(size) { + column.push(v[j]); + } + result.push(Bytes(column)); + } + result + } + + fn guess_key(bytes: &Bytes) -> u8 { + let mut h: Vec<(Bytes, u8)> = (0..=255).map(|i| (Bytes::xor_byte(bytes, i), i)).collect(); + h.sort_by(|a, b| a.0.ascii_score().partial_cmp(&b.0.ascii_score()).unwrap()); + h.last().unwrap().1 + } + _test_roundtrip(); let bytes = read("data/6.txt"); let key_size = guess_key_size(&bytes); - println!("[open] Challenge 6: guessed_key_size={}", key_size); + let bytes_tranposed = transpose(&bytes, key_size); + let key = Bytes(bytes_tranposed.iter().map(|b| guess_key(&b)).collect()); + let msg = Bytes::xor_cycle(&bytes, &key); + + let partial_msg = Bytes(msg.0[..20].to_vec()).to_utf8(); + println!( + "[okay] Challenge 6: size={} msg={}...", + key_size, partial_msg + ); }