Solve challenge 6.

This commit is contained in:
2022-03-27 10:13:23 -04:00
parent f69fea769f
commit 110fb61e18

View File

@@ -31,8 +31,8 @@ pub fn challenge3() {
let a = Bytes::from_hex("1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736"); let a = Bytes::from_hex("1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736");
let mut h: Vec<Bytes> = (0..=255).map(|i| Bytes::xor_byte(&a, i)).collect(); let mut h: Vec<Bytes> = (0..=255).map(|i| Bytes::xor_byte(&a, i)).collect();
h.sort_by(|a, b| a.ascii_score().partial_cmp(&b.ascii_score()).unwrap()); h.sort_by(|a, b| a.ascii_score().partial_cmp(&b.ascii_score()).unwrap());
let h: Vec<Bytes> = h.into_iter().filter(|b| b.is_ascii()).collect(); // let h: Vec<Bytes> = h.into_iter().filter(|b| b.is_ascii()).collect();
let r = h[h.len() - 1].to_utf8(); let r = h.last().unwrap().to_utf8();
println!("[okay] Challenge 3: {}", r); println!("[okay] Challenge 3: {}", r);
} }
@@ -125,8 +125,34 @@ pub fn challenge6() {
lowest_size lowest_size
} }
fn transpose(Bytes(v): &Bytes, size: usize) -> Vec<Bytes> {
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(); _test_roundtrip();
let bytes = read("data/6.txt"); let bytes = read("data/6.txt");
let key_size = guess_key_size(&bytes); 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
);
} }