Implement encryption oracle for challenge 11.
This commit is contained in:
36
src/set2.rs
36
src/set2.rs
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user