Optimized aes/cfb8

This commit is contained in:
Kyler 2024-06-02 22:46:09 -06:00
parent 6a58dbf184
commit 196592ae78
1 changed files with 13 additions and 31 deletions

View File

@ -9,8 +9,8 @@ use aes::cipher::{BlockEncrypt, BlockDecrypt, generic_array::GenericArray};
#[derive(Clone)] #[derive(Clone)]
pub struct McCipher { pub struct McCipher {
pub(crate) key: [u8; 16], pub(crate) key: [u8; 16],
state_en: [u8; 16], state_en: u128,
state_de: [u8; 16], state_de: u128,
} }
impl McCipher { impl McCipher {
@ -19,8 +19,8 @@ impl McCipher {
let aes_key: [u8; 16] = rng.gen(); let aes_key: [u8; 16] = rng.gen();
Self { Self {
key: aes_key.clone(), key: aes_key.clone(),
state_en: aes_key.clone(), state_en: u128::from_be_bytes(aes_key),
state_de: aes_key.clone(), state_de: u128::from_be_bytes(aes_key),
} }
} }
@ -37,19 +37,10 @@ impl McCipher {
) -> Result<Self> { ) -> Result<Self> {
let aes_key: [u8; 16] = decrypt_rsa(private_key, data)? let aes_key: [u8; 16] = decrypt_rsa(private_key, data)?
.as_slice()[0..16].try_into().unwrap(); .as_slice()[0..16].try_into().unwrap();
let mut key: [u8; 16] =
vec![0;16].as_slice()[0..16].try_into().unwrap();
key.copy_from_slice(&aes_key);
let mut state_en: [u8; 16] =
vec![0;16].as_slice()[0..16].try_into().unwrap();
state_en.copy_from_slice(&aes_key);
let mut state_de: [u8; 16] =
vec![0;16].as_slice()[0..16].try_into().unwrap();
state_de.copy_from_slice(&aes_key);
Ok(Self { Ok(Self {
key, key: aes_key.clone(),
state_en, state_en: u128::from_be_bytes(aes_key),
state_de, state_de: u128::from_be_bytes(aes_key),
}) })
} }
@ -69,31 +60,22 @@ impl McCipher {
out_data out_data
} }
fn shift_left(arr: [u8; 16], new: u8) -> [u8; 16] {
let mut arr = arr;
for i in 0..arr.len() - 1 {
arr[i] = arr[i + 1];
}
arr[15] = new;
arr
}
fn encrypt_block(&mut self, data: u8) -> u8 { fn encrypt_block(&mut self, data: u8) -> u8 {
let cipher = Aes128::new(GenericArray::from_slice(&self.key)); let cipher = Aes128::new(GenericArray::from_slice(&self.key));
let mut block = GenericArray::clone_from_slice(&self.state_en); let mut block = GenericArray::clone_from_slice(
&self.state_en.to_be_bytes());
cipher.encrypt_block(&mut block); cipher.encrypt_block(&mut block);
let data = data ^ block[0]; let data = data ^ block[0];
self.state_en = Self::shift_left(self.state_en, data); self.state_en = (self.state_en << 8) + (data as u128);
assert_ne!(self.state_en, self.key);
assert_ne!(self.state_en, self.state_de);
data data
} }
fn decrypt_block(&mut self, data: u8) -> u8 { fn decrypt_block(&mut self, data: u8) -> u8 {
let cipher = Aes128::new(GenericArray::from_slice(&self.key)); let cipher = Aes128::new(GenericArray::from_slice(&self.key));
let mut block = GenericArray::clone_from_slice(&self.state_de); let mut block = GenericArray::clone_from_slice(
&self.state_de.to_be_bytes());
cipher.decrypt_block(&mut block); cipher.decrypt_block(&mut block);
self.state_de = Self::shift_left(self.state_de, data); self.state_de = (self.state_de << 8) + (data as u128);
let data = data ^ block[0]; let data = data ^ block[0];
data data
} }