summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2015-04-05 23:15:06 -0400
committerJesse Luehrs <doy@tozt.net>2015-04-05 23:15:06 -0400
commitdb35b25063a2fbf5e471ac1c30fb16826023c8a3 (patch)
tree567928b40966b385693653d4b1641a715631b681
parent6eff17d9c28541dc594cb5cf084eb9fcd27b49ec (diff)
downloadmatasano-db35b25063a2fbf5e471ac1c30fb16826023c8a3.tar.gz
matasano-db35b25063a2fbf5e471ac1c30fb16826023c8a3.zip
implement a stream cipher based on mersenne twister
-rw-r--r--src/lib.rs1
-rw-r--r--src/random.rs18
2 files changed, 19 insertions, 0 deletions
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<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[..]);
+}