Start to implement challenge 19 in Rust which requires some learning.

This commit is contained in:
2022-07-20 20:27:51 -04:00
parent 467c3bdbef
commit b8fa60cb05
2 changed files with 32 additions and 2 deletions

View File

@@ -9,7 +9,7 @@ mod set2;
mod set3;
fn main() {
const RUN_ALL: bool = true;
const RUN_ALL: bool = false;
if RUN_ALL {
set1::challenge1();
set1::challenge2();
@@ -32,6 +32,6 @@ fn main() {
set3::challenge19();
set3::challenge20();
} else {
set3::challenge20();
set3::challenge19();
}
}

View File

@@ -3,6 +3,9 @@ use crate::bytes_base64::BytesBase64;
use crate::cbc;
use crate::ctr;
use rand::Rng;
use std::cell::RefCell;
use std::collections::HashMap;
use std::collections::HashSet;
use std::fs;
use std::io::{BufRead, BufReader};
@@ -133,6 +136,33 @@ pub fn challenge19() {
data.push_str("\n");
}
fn xor_to_char_set(letters: &Vec<u8>) -> HashMap<u8, RefCell<HashSet<u8>>> {
let mut h = HashMap::new();
for i in 0..255_u8 {
h.insert(i, RefCell::new(HashSet::new()));
}
for c1 in letters {
for c2 in letters {
let xored = c1 ^ c2;
if let Some(h) = h.get(&xored) {
let mut h_mut = h.borrow_mut();
h_mut.insert(*c1);
h_mut.insert(*c2);
};
}
}
h
}
fn _attack(_ciphers: Vec<Bytes>) -> Vec<Vec<u8>> {
vec![vec![]]
}
let mut letters: Vec<u8> = (0..255_u8).filter(u8::is_ascii_alphabetic).collect();
letters.append(&mut vec![b'_', b'-', b'.']);
let lookup = xor_to_char_set(&letters);
println!("{:?}", lookup);
fs::write("data/19_enc.txt", data).expect("Unable to write file");
println!("[okay] Challenge 19: encrypted to data/19_enc.txt, attack in set3c19.py.");
}