From b490b67d55544534df1456f267b91a1187b8b521 Mon Sep 17 00:00:00 2001 From: Felix Martin Date: Sat, 26 Mar 2022 13:40:28 -0400 Subject: [PATCH] Implement Base64 read. --- data/6.txt | 64 +++++++++++++++++++++++++++++++++++++++++++++ src/bytes.rs | 3 ++- src/bytes_base64.rs | 20 ++++++++++++++ src/main.rs | 10 +++---- src/set1.rs | 48 +++++++++++++++++++++++++--------- 5 files changed, 126 insertions(+), 19 deletions(-) create mode 100644 data/6.txt diff --git a/data/6.txt b/data/6.txt new file mode 100644 index 0000000..cecdb81 --- /dev/null +++ b/data/6.txt @@ -0,0 +1,64 @@ +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 diff --git a/src/bytes.rs b/src/bytes.rs index 591dd4f..7ef71f1 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -1,3 +1,4 @@ +#![allow(dead_code)] use std::fmt::Write; // need to import this trait #[derive(PartialEq, PartialOrd, Debug)] @@ -34,7 +35,7 @@ impl Bytes { let Bytes(v) = self; let mut r = String::new(); for e in v.iter() { - write!(r, "{:02x}", e); + write!(r, "{:02x}", e).unwrap(); } r } diff --git a/src/bytes_base64.rs b/src/bytes_base64.rs index aab2173..c535294 100644 --- a/src/bytes_base64.rs +++ b/src/bytes_base64.rs @@ -1,3 +1,4 @@ +#![allow(dead_code)] use crate::bytes::Bytes; use std::str; @@ -33,6 +34,25 @@ impl BytesBase64 { ) } + pub fn to_bytes(&self) -> Bytes { + Bytes(vec![]) + } + + pub fn from_base64(s: &str) -> BytesBase64 { + let mut r: Vec = Vec::with_capacity(s.len()); + for c in s.chars() { + match c { + 'A'..='Z' => r.push((c as u8) - ('A' as u8)), + 'a'..='z' => r.push((c as u8) - ('a' as u8) + 26), + '0'..='9' => r.push((c as u8) - ('0' as u8) + 52), + '+' => r.push(62), + '/' => r.push(63), + _ => (), + } + } + BytesBase64(r) + } + pub fn to_string(&self) -> String { let BytesBase64(digits) = self; let mut r: Vec = digits diff --git a/src/main.rs b/src/main.rs index 1539d9e..8b7aef6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,10 +3,10 @@ mod bytes_base64; mod set1; fn main() { - set1::challenge1(); - set1::challenge2(); - set1::challenge3(); - set1::challenge4(); - set1::challenge5(); + // set1::challenge1(); + // set1::challenge2(); + // set1::challenge3(); + // set1::challenge4(); + // set1::challenge5(); set1::challenge6(); } diff --git a/src/set1.rs b/src/set1.rs index b895225..23cf0f5 100644 --- a/src/set1.rs +++ b/src/set1.rs @@ -1,7 +1,7 @@ +#![allow(dead_code)] use crate::bytes::Bytes; use crate::bytes_base64::BytesBase64; -use std::fs::File; -use std::io::{BufRead, BufReader}; +use std::io::{BufRead, BufReader, Write}; use std::str; pub fn challenge1() { @@ -37,24 +37,24 @@ pub fn challenge3() { } pub fn challenge4() { - pub fn read_to_vector(path: &str) -> Vec { - let file = File::open(path).unwrap(); + fn read(path: &str) -> Vec { + let file = std::fs::File::open(path).unwrap(); let br = BufReader::new(file); br.lines() .map(|line| Bytes::from_hex(&line.unwrap())) .collect() } - let bs = read_to_vector("data/4.txt"); - let mut h: Vec = vec![]; + let bytes_vector = read("data/4.txt"); + let mut xored_bytes_vector: Vec = vec![]; for i in 32..=127 { - for b in bs.iter() { - h.push(Bytes::xor_byte(b, i)); + for bytes in bytes_vector.iter() { + xored_bytes_vector.push(Bytes::xor_byte(bytes, i)); } } - h.sort_by(|a, b| a.ascii_score().partial_cmp(&b.ascii_score()).unwrap()); - let r = h[h.len() - 1].to_utf8(); - println!("[okay] Challenge 4: {}", r.trim()); + xored_bytes_vector.sort_by(|a, b| a.ascii_score().partial_cmp(&b.ascii_score()).unwrap()); + let result = xored_bytes_vector.last().unwrap().to_utf8(); + println!("[okay] Challenge 4: {}", result.trim()); } pub fn challenge5() { @@ -72,6 +72,28 @@ pub fn challenge5() { } pub fn challenge6() { - // next: base64bytes to hexbytes - println!("[open] Challenge 6: xxx"); + fn read(path: &str) -> BytesBase64 { + let s = std::fs::read_to_string(path).unwrap(); + BytesBase64::from_base64(&s) + } + + fn write(path: &str, bytes_base64: &BytesBase64) { + let width = 60; + let bytes = bytes_base64.to_string(); + let mut output_vec = vec![]; + + for e in Iterator::zip(bytes.as_bytes().iter(), 0..bytes.len()) { + if e.1 % width == 0 && e.1 > 0 { + output_vec.push('\n' as u8) + } + output_vec.push(*e.0); + } + + let mut f = std::fs::File::create(path).unwrap(); + f.write(&output_vec).unwrap(); + } + + let bytes_base64 = read("data/6.txt"); + write("data/6_out.txt", &bytes_base64); + println!("[open] Challenge 6"); }