stage
This commit is contained in:
49
problems/p11/src/main.rs
Normal file
49
problems/p11/src/main.rs
Normal file
@@ -0,0 +1,49 @@
|
||||
use rand::{Rng, seq::IndexedRandom};
|
||||
|
||||
fn gen_random_key() -> [u8; 16] {
|
||||
let mut rng = rand::rng();
|
||||
let mut key = [0u8; 16];
|
||||
rng.fill(&mut key);
|
||||
key
|
||||
}
|
||||
|
||||
fn encryption_oracle(plaintext: &[u8]) -> Vec<u8> {
|
||||
let key = gen_random_key();
|
||||
let mut rng = rand::rng();
|
||||
let enc_mode = rng.random_range(0..2); // 0 for ECB, 1 for CBC
|
||||
let plaintext = plaintext.to_vec();
|
||||
let random_prefix_len = rng.random_range(5..11);
|
||||
let random_suffix_len = rng.random_range(5..11);
|
||||
let mut random_padding = [0u8; 20];
|
||||
rng.fill(&mut random_padding);
|
||||
let random_prefix = random_padding[..random_prefix_len].to_vec();
|
||||
let random_suffix = random_padding[random_padding.len() - random_suffix_len..].to_vec();
|
||||
|
||||
let mut data = Vec::new();
|
||||
data.extend(random_prefix);
|
||||
data.extend(plaintext);
|
||||
data.extend(random_suffix);
|
||||
|
||||
pkcs7_padding(&mut data, 16); // in p9
|
||||
|
||||
if enc_mode == 0 {
|
||||
// ECB mode in p7
|
||||
ecb_encrypt(&data, &key)
|
||||
} else {
|
||||
// CBC mode in p10
|
||||
let iv = [0u8; 16];
|
||||
cbc_encrypt(&data, &key, &iv)
|
||||
}
|
||||
data
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let plaintext = b"YELLOW SUBMARINE";
|
||||
let encrypted_data = encryption_oracle(plaintext);
|
||||
// in p8
|
||||
if is_ecb(&encrypted_data) {
|
||||
println!("ECB mode detected.");
|
||||
} else {
|
||||
println!("CBC mode detected.");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user