Pre set 2 refactors

This commit is contained in:
Pyrex 2023-04-27 18:37:59 -07:00
parent e5edf80da4
commit 15ae77b719
5 changed files with 110 additions and 11 deletions

View File

@ -3,7 +3,7 @@ use cryptopals::{prelude::*, bvec};
fn main() {
let input = Vec::from_text(
"Burning 'em, if you ain't quick and nimble
I go crazy when I hear a cymbal");
I go crazy when I hear a cymbal").unwrap();
let output = bvec!("output.txt");
assert_eq!(input.xor_repeating(&b"ICE".to_vec()).unwrap(), output);

View File

@ -1,17 +1,13 @@
#![feature(array_chunks)]
use aes::{cipher::{KeyInit, generic_array::GenericArray, Key, BlockEncrypt, BlockDecrypt}, Aes128, Block};
use cryptopals::{prelude::*, bvec, bvec64};
use cryptopals::{prelude::*, bvec, bvec64, friendly::aes128};
fn main() {
let key: Key<Aes128> = GenericArray::from(*b"YELLOW SUBMARINE");
let aes = aes::Aes128::new(&key);
let key = *b"YELLOW SUBMARINE";
let input = bvec64!("input.txt");
let mut output = Vec::new();
for chunk in input.array_chunks::<16>() {
let mut block: Block = GenericArray::from(*chunk);
aes.decrypt_block(&mut block);
output.extend(<[u8; 16]>::from(block));
output.extend(aes128::decrypt(key, *chunk));
}
dbg!(output.to_text().unwrap());

21
src/friendly.rs Normal file
View File

@ -0,0 +1,21 @@
pub mod aes128 {
use aes::cipher::{generic_array::GenericArray, KeyInit, BlockEncrypt, BlockDecrypt};
pub fn encrypt(key: [u8; 16], block: [u8; 16]) -> [u8; 16] {
let key = GenericArray::from(key);
let aes = aes::Aes128::new(&key);
let mut block = GenericArray::from(block);
aes.encrypt_block(&mut block);
<[u8; 16]>::from(block)
}
pub fn decrypt(key: [u8; 16], block: [u8; 16]) -> [u8; 16] {
let key = GenericArray::from(key);
let aes = aes::Aes128::new(&key);
let mut block = GenericArray::from(block);
aes.decrypt_block(&mut block);
<[u8; 16]>::from(block)
}
}

View File

@ -1,2 +1,4 @@
#![feature(array_chunks)]
pub mod friendly;
pub mod english;
pub mod prelude;

View File

@ -25,6 +25,7 @@ macro_rules! bvecs {
#[derive(Debug)]
pub enum PreludeError {
WrongLength(usize),
B64Err(base64::DecodeError),
FHErr(hex::FromHexError),
Utf8Err(std::str::Utf8Error),
@ -40,13 +41,16 @@ pub trait ByteBased: Sized {
fn from_b64(b: &str) -> CPals<Self>;
fn to_b64(&self) -> String;
fn from_text(t: &str) -> Self;
fn from_text(t: &str) -> CPals<Self>;
fn to_text(&self) -> CPals<&str>;
fn xor_with(&self, other: &Self) -> CPals<Self>;
fn xor_repeating(&self, other: &Self) -> CPals<Self>;
fn hamming(&self, other: &Self) -> CPals<u64>;
fn to_fixed_len<const N: usize>(&self) -> CPals<[u8; N]>;
fn to_variable_len(&self) -> Vec<u8>;
}
impl ByteBased for Vec<u8> {
@ -66,8 +70,8 @@ impl ByteBased for Vec<u8> {
base64::engine::general_purpose::STANDARD.encode(self)
}
fn from_text(tx: &str) -> Self {
tx.as_bytes().to_vec()
fn from_text(tx: &str) -> CPals<Self> {
Ok(tx.as_bytes().to_vec())
}
fn to_text(&self) -> CPals<&str> {
@ -102,8 +106,84 @@ impl ByteBased for Vec<u8> {
}
Ok(bdist)
}
fn to_fixed_len<const N: usize>(&self) -> CPals<[u8; N]> {
if self.len() != N {
return Err(PreludeError::WrongLength(self.len()))
}
// avoid the owned requirement for [u8; N]
Ok(*self.array_chunks().next().unwrap())
}
fn to_variable_len(&self) -> Vec<u8> {
self.clone()
}
}
impl<const N: usize> ByteBased for [u8; N] {
fn from_hex(h: &str) -> CPals<Self> {
let v = <Vec<u8>>::from_hex(h)?;
v.to_fixed_len()
}
fn to_hex(&self) -> String {
self.to_variable_len().to_hex()
}
fn from_b64(b: &str) -> CPals<Self> {
let v = <Vec<u8>>::from_b64(b)?;
v.to_fixed_len()
}
fn to_b64(&self) -> String {
self.to_variable_len().to_b64()
}
fn from_text(t: &str) -> CPals<Self> {
let v = <Vec<u8>>::from_text(t)?;
v.to_fixed_len()
}
fn to_text(&self) -> CPals<&str> {
std::str::from_utf8(self).map_err(PreludeError::Utf8Err)
}
fn xor_with(&self, other: &Self) -> CPals<Self> {
let mut result = [0; N];
for i in 0..N {
result[i] = self[i] ^ other[i];
}
Ok(result)
}
fn xor_repeating(&self, other: &Self) -> CPals<Self> {
self.xor_with(other) // they necessarily have the same length
}
fn hamming(&self, other: &Self) -> CPals<u64> {
let mut count: u64 = 0;
for i in 0..N {
count += (self[i] ^ other[i]).count_ones() as u64;
}
Ok(count)
}
fn to_fixed_len<const N2: usize>(&self) -> CPals<[u8; N2]> {
let slice: &[u8] = self;
if let Ok(x) = <&[u8; N2]>::try_from(slice) {
return Ok(*x)
}
return Err(PreludeError::WrongLength(self.len()))
}
fn to_variable_len(&self) -> Vec<u8> {
self.to_vec()
}
}
pub fn remove_ws(s: &str) -> String {
let mut new = String::with_capacity(s.len());
for c in s.chars() {