summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBenedict <benedict@0xb8000.de>2016-08-13 17:57:51 +0200
committerBenedict <benedict@0xb8000.de>2017-02-21 13:00:25 +0100
commitcb990c73c478c1bb40d749d0f4e52c10a9ac80fd (patch)
treeb64dfa39694fdd80cf08eeeb1ad02247f510ca79 /lib
parentf48cae2dcd5ff60c678484cd213881cc90722d41 (diff)
set3, challenge 24 completed
Diffstat (limited to 'lib')
-rw-r--r--lib/lib3.c78
-rw-r--r--lib/lib3.h6
2 files changed, 84 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;
+}
diff --git a/lib/lib3.h b/lib/lib3.h
index b37021d..2c65b97 100644
--- a/lib/lib3.h
+++ b/lib/lib3.h
@@ -33,4 +33,10 @@ unsigned int mt_19937_timestamp_orcale(struct mt_19937_state *mt_state);
void mt_19937_brute_force_timestamp();
int unshift_left_xor(int number, int shifts, unsigned int mask);
int unshift_right_xor(int number, int shifts);
+int mt_19937_stream_cipher(char *in, int length_in, char *out, int seed);
+int mt_19937_stream_cipher_oracle(char *in, int length_in, char *out);
+int crack_mt_19937_stream_cipher_16_bit_seed(char *ciphertext, int length_ciphertext,
+ char *plaintext, char *match);
+unsigned int mt_19937_password_token();
+int mt_19937_password_token_time_based(unsigned int password_token, int time_window);
#endif