Start work on challenge 12.

This commit is contained in:
2022-04-27 11:23:08 -04:00
parent 994da471c4
commit eb0f8c4ede
3 changed files with 33 additions and 11 deletions

View File

@@ -1,4 +1,5 @@
#![allow(dead_code)]
use rand::Rng;
use std::fmt::Write; // need to import this trait
#[derive(PartialEq, PartialOrd, Debug)]
@@ -15,6 +16,19 @@ impl Bytes {
String::from(std::str::from_utf8(&v).unwrap())
}
pub fn random(length: usize) -> Bytes {
Bytes(
(0..length)
.map(|_| rand::thread_rng().gen_range(0..255))
.collect(),
)
}
pub fn random_range(lower: usize, upper: usize) -> Bytes {
let length: usize = rand::thread_rng().gen_range(lower..upper);
Bytes::random(length)
}
pub fn from_hex(s: &str) -> Bytes {
if s.len() % 2 != 0 {
panic!("Input string has uneven number of characters");

View File

@@ -17,4 +17,5 @@ fn main() {
set2::challenge9();
set2::challenge10();
set2::challenge11();
set2::challenge12();
}

View File

@@ -37,17 +37,10 @@ pub fn challenge11() {
CBC,
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);
let mut pre_pad = Bytes::random_range(5, 10).0;
let mut post_pad = Bytes::random_range(5, 10).0;
pre_pad.append(&mut v);
pre_pad.append(&mut post_pad);
Bytes(pre_pad)
@@ -56,7 +49,7 @@ pub fn challenge11() {
fn encryption_oracle(Bytes(data): &Bytes) -> (Bytes, EncryptionType) {
// Write a function that encrypts data under an unknown key --- that is, a
// function that generates a random key and encrypts under it.
let key = Bytes(random_bytes(16));
let key = Bytes::random(16);
// Under the hood, have the function append 5-10 bytes (count chosen randomly)
// before the plaintext and 5-10 bytes after the plaintext.
let padded_data = pad_data(data.to_vec());
@@ -67,7 +60,7 @@ pub fn challenge11() {
let (data, encryption_type) = if zero_or_one == 1 {
(ecb::encrypt(&key, &padded_data), EncryptionType::ECB)
} else {
let iv = Bytes(random_bytes(16));
let iv = Bytes::random(16);
(cbc::encrypt(&key, &iv, &padded_data), EncryptionType::CBC)
};
(data, encryption_type)
@@ -107,3 +100,17 @@ pub fn challenge11() {
}
run_oracle(10);
}
pub fn challenge12() {
let key = Bytes::random(16);
fn encrypt(Bytes(data): &Bytes, key: &Bytes) -> Bytes {
let mut data = data.to_vec();
let mut b = Bytes::from_utf8("Um9sbGluJyBpbiBteSA1LjAKV2l0aCBteSByYWctdG9wIGRvd24gc28gbXkgaGFpciBjYW4gYmxvdwpUaGUgZ2lybGllcyBvbiBzdGFuZGJ5IHdhdmluZyBqdXN0IHRvIHNheSBoaQpEaWQgeW91IHN0b3A/IE5vLCBJIGp1c3QgZHJvdmUgYnkK");
data.append(&mut b.0);
let cipher = ecb::encrypt(&key, &Bytes(data));
cipher
}
let text = Bytes::from_utf8("aaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccdddd");
let cipher = encrypt(&text, &key);
println!("[xxxx] Challenge 12: {}", cipher.0.len());
}