summaryrefslogtreecommitdiff
path: root/lib/lib3.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lib3.c')
-rw-r--r--lib/lib3.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/lib/lib3.c b/lib/lib3.c
index e976fd1..150c6ea 100644
--- a/lib/lib3.c
+++ b/lib/lib3.c
@@ -203,3 +203,81 @@ int unshift_left_xor(int number, int shifts, unsigned int mask)
return restore;
}
+
+int mt_19937_stream_cipher(char *in, int length_in, char *out, int seed)
+{
+ struct mt_19937_state mt_state;
+ char keystream;
+ int i, tmp;
+
+ mt_19937_seed(seed, &mt_state);
+
+ for(i=0;i<length_in;i++) {
+ tmp = mt_19937(&mt_state);
+ keystream = tmp & 0xFF;
+ out[i] = in[i] ^ keystream;
+ }
+}
+
+int mt_19937_stream_cipher_oracle(char *in, int length_in, char *out)
+{
+ int prefix_length = random_number_between(0,50);
+ // only 16 bit seed, 0 would not be a good seed, since the keystream
+ // would allways be 0
+ int seed = random_number_between(1,65536);
+ char *plaintext_full = malloc(length_in + prefix_length);
+
+ printf("use seed: %i\n", seed);
+ // generate random number of random bytes
+ generate_random_bytes(plaintext_full, prefix_length);
+ memcpy(&plaintext_full[prefix_length], in, length_in);
+
+ mt_19937_stream_cipher(plaintext_full, (length_in+prefix_length),
+ out, seed);
+
+ return (length_in + prefix_length);
+}
+
+
+int crack_mt_19937_stream_cipher_16_bit_seed(char *ciphertext, int length_ciphertext,
+ char *plaintext, char *match)
+{
+ int i;
+ int seed;
+ int match_len = strlen(match);
+ for(seed=1;seed<65536;seed++) {
+ mt_19937_stream_cipher(ciphertext, length_ciphertext, plaintext, seed);
+ for(i=1;i<match_len;i++) {
+ if(plaintext[length_ciphertext-i] != match[match_len-i]) {
+ break;
+ }
+ else if (i == (match_len-1))
+ goto out;
+ }
+ }
+out:
+ printf("found seed: %i\n", seed);
+}
+
+unsigned int mt_19937_password_token()
+{
+ int seed = time(NULL);
+ struct mt_19937_state mt_state;
+ printf("password token seed: %i\n", seed);
+ mt_19937_seed(seed, &mt_state);
+
+ return mt_19937(&mt_state);
+}
+
+int mt_19937_password_token_time_based(unsigned int password_token, int time_window)
+{
+ int start_time = time(NULL);
+ struct mt_19937_state mt_state;
+ int seed;
+ for(seed=start_time-(time_window*60);seed<start_time+(time_window*60);seed++) {
+ mt_19937_seed(seed, &mt_state);
+ if(password_token == mt_19937(&mt_state))
+ return 1;
+ }
+ return 0;
+}