diff options
| author | Benedict <benedict@0xb8000.de> | 2016-08-13 17:57:51 +0200 |
|---|---|---|
| committer | Benedict <benedict@0xb8000.de> | 2017-02-21 13:00:25 +0100 |
| commit | cb990c73c478c1bb40d749d0f4e52c10a9ac80fd (patch) | |
| tree | b64dfa39694fdd80cf08eeeb1ad02247f510ca79 /lib/lib3.c | |
| parent | f48cae2dcd5ff60c678484cd213881cc90722d41 (diff) | |
set3, challenge 24 completed
Diffstat (limited to 'lib/lib3.c')
| -rw-r--r-- | lib/lib3.c | 78 |
1 files changed, 78 insertions, 0 deletions
@@ -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; +} |
