int main() { const char * input = "Burning 'em, if you ain't quick and nimble\n" "I go crazy when I hear a cymbal"; size_t input_size = strlen(input); const char * key = "ICE"; size_t key_size = strlen(key); size_t output_max_size = 148; char output[output_max_size]; size_t output_used_size = repeating_key_xor(input, input_size, key, key_size, output, output_max_size); if (output_used_size != 0) { for (size_t i = 0; i < output_used_size; ++i) { printf("%c", output[i]); } printf("\n"); return 0; } else { return 1; } }
void break_repeating_key_xor(const unsigned char *in, size_t in_len, unsigned char *key, size_t key_max_len, unsigned int *key_len, unsigned char *out) { unsigned int i, j; unsigned int base_limit, limit, leftover; unsigned char *buf; *key_len = get_key_len(in, in_len, key_max_len); base_limit = in_len / *key_len; leftover = in_len % *key_len; buf = malloc(base_limit + !!leftover); if (!buf) exit(1); for (i = 0; i < *key_len; i++) { limit = base_limit + (leftover > i); for (j = 0; j < limit; j++) out[j] = in[j * *key_len + i]; key[i] = crack_single_byte_xor(out, limit, buf); } free(buf); repeating_key_xor(in, in_len, key, *key_len, out); }