diff options
author | Jesse Luehrs <doy@tozt.net> | 2015-04-05 23:15:06 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2015-04-05 23:15:06 -0400 |
commit | db35b25063a2fbf5e471ac1c30fb16826023c8a3 (patch) | |
tree | 567928b40966b385693653d4b1641a715631b681 | |
parent | 6eff17d9c28541dc594cb5cf084eb9fcd27b49ec (diff) | |
download | matasano-db35b25063a2fbf5e471ac1c30fb16826023c8a3.tar.gz matasano-db35b25063a2fbf5e471ac1c30fb16826023c8a3.zip |
implement a stream cipher based on mersenne twister
-rw-r--r-- | src/lib.rs | 1 | ||||
-rw-r--r-- | src/random.rs | 18 |
2 files changed, 19 insertions, 0 deletions
@@ -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<u8> { + let mut mt = MersenneTwister::from_seed(key); + let keystream: Vec<u8> = 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[..]); +} |