From db35b25063a2fbf5e471ac1c30fb16826023c8a3 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 5 Apr 2015 23:15:06 -0400 Subject: implement a stream cipher based on mersenne twister --- src/lib.rs | 1 + src/random.rs | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 31a9aeb..089250c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,6 +23,7 @@ pub use primitives::pad_pkcs7; pub use primitives::unpad_pkcs7; pub use primitives::repeating_key_xor; pub use random::MersenneTwister; +pub use random::mt19937_stream_cipher; pub use crack::BlockCipherMode; pub use crack::find_aes_128_ecb_encrypted_string; pub use crack::detect_ecb_cbc; diff --git a/src/random.rs b/src/random.rs index e99b085..af0bc43 100644 --- a/src/random.rs +++ b/src/random.rs @@ -92,3 +92,21 @@ impl std::fmt::Debug for MersenneTwister { write!(f, " }}") } } + +pub fn mt19937_stream_cipher (ciphertext: &[u8], key: u32) -> Vec { + let mut mt = MersenneTwister::from_seed(key); + let keystream: Vec = mt.gen_iter().take(ciphertext.len()).collect(); + return ::primitives::fixed_xor(ciphertext, &keystream[..]); +} + +#[test] +fn test_mt19937_stream_cipher () { + let key = ::rand::thread_rng().gen(); + let plaintext = b"Summertime and the wind is blowing outside in lower \ + Chelsea and I don't know what I'm doing in the city, the \ + sun is always in my eyes"; + let ciphertext = mt19937_stream_cipher(&plaintext[..], key); + assert!(&plaintext[..] != &ciphertext[..]); + let plaintext2 = mt19937_stream_cipher(&ciphertext[..], key); + assert_eq!(&plaintext[..], &plaintext2[..]); +} -- cgit v1.2.3-54-g00ecf