1
0
This commit is contained in:
2025-06-20 11:23:21 +08:00
commit b5601aef8c
47 changed files with 1829 additions and 0 deletions

7
problems/p11/Cargo.toml Normal file
View File

@@ -0,0 +1,7 @@
[package]
name = "p11"
version = "0.1.0"
edition = "2024"
[dependencies]
rand = "0.9.1"

49
problems/p11/src/main.rs Normal file
View 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.");
}
}