From 07b711c7736dcf0a7f25ec7a59ae4bffa2c3df9d Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 17 Mar 2015 07:46:55 -0400 Subject: problem 11 --- src/aes.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'src/aes.rs') diff --git a/src/aes.rs b/src/aes.rs index 9baf595..e4a7184 100644 --- a/src/aes.rs +++ b/src/aes.rs @@ -1,8 +1,16 @@ -use openssl; +use std; use std::collections::HashSet; +use openssl; + use primitives::{fixed_xor, pad_pkcs7, unpad_pkcs7}; +#[derive(PartialEq,Eq,Debug)] +pub enum BlockCipherMode { + ECB, + CBC, +} + pub fn decrypt_aes_128_ecb (bytes: &[u8], key: &[u8]) -> Vec { return openssl::crypto::symm::decrypt( openssl::crypto::symm::Type::AES_128_ECB, @@ -65,6 +73,22 @@ pub fn find_aes_128_ecb_encrypted_string (inputs: &[Vec]) -> Vec { return found; } +pub fn detect_ecb_cbc (f: F) -> BlockCipherMode where F: Fn(&[u8]) -> Vec { + let plaintext: Vec = (0..16) + .cycle() + .take(32) + .flat_map(|n| std::iter::repeat(n).take(17)) + .collect(); + let ciphertext = f(&plaintext[..]); + + if count_duplicate_blocks(&ciphertext[..]) >= 16 { + return BlockCipherMode::ECB; + } + else { + return BlockCipherMode::CBC; + } +} + fn count_duplicate_blocks (input: &[u8]) -> usize { let mut set = HashSet::new(); let mut dups = 0; -- cgit v1.2.3-54-g00ecf