Implement encryption oracle for challenge 11.

This commit is contained in:
2022-04-22 18:56:39 -04:00
parent 9f3eb1356c
commit b757f359ff
5 changed files with 74 additions and 14 deletions

View File

@@ -1,7 +1,8 @@
#![allow(dead_code)]
use crate::bytes::Bytes;
use crate::bytes_base64::BytesBase64;
use crate::cbs;
use crate::ecb;
use rand::Rng;
pub fn challenge9() {
let mut bytes = Bytes::from_utf8("YELLOW SUBMARINE");
@@ -31,5 +32,36 @@ pub fn challenge10() {
}
pub fn challenge11() {
println!("[tbd] Challenge 11: TBD!");
enum EncryptionType {
CBS,
ECB,
}
fn random_bytes(count: usize) -> Vec<u8> {
(0..count)
.map(|_| rand::thread_rng().gen_range(0..255))
.collect()
}
fn pad_data(mut v: Vec<u8>) -> Bytes {
let pre_count: usize = rand::thread_rng().gen_range(5..10);
let post_count: usize = rand::thread_rng().gen_range(5..10);
let mut pre_pad = random_bytes(pre_count);
let mut post_pad = random_bytes(post_count);
pre_pad.append(&mut v);
pre_pad.append(&mut post_pad);
Bytes(pre_pad)
}
fn encryption_oracle(Bytes(data): &Bytes) -> (Bytes, EncryptionType) {
let zero_or_one: u32 = rand::thread_rng().gen_range(0..2);
let padded_data = pad_data(data.to_vec());
let key = Bytes(random_bytes(16));
let (data, encryption_type) = if zero_or_one == 1 {
(ecb::encrypt(&key, &padded_data), EncryptionType::ECB)
} else {
let iv = Bytes(random_bytes(16));
(cbs::encrypt(&key, &iv, &padded_data), EncryptionType::CBS)
};
(data, encryption_type)
}
}