Расшифровка кода
Вас наняла террористическая группа для взлома зашифрованных сообщений. Единственная информация, которую они смогли предоставить, заключается в том, что для шифрования использовался алгоритм с фиксированной длиной ключа XOR. После небольшого исследования вы находите следующее описание шифрования XOR:
Предположим, у нас есть символ u[i] из исходного сообщения и ключ k длиной l, состоящий из символов k[j], где 0 ≤ j < l. Тогда зашифрованный символ e[i] вычисляется как:
e[i] = u[i] XOR k[i MOD l]
где MOD — это операция взятия остатка от деления (оператор % в C, C++ и Java), а XOR — это побитовая операция XOR, применяемая к 8-битному символу (оператор ^ в C, C++ и Java). Шифрование XOR является симметричным, поэтому сообщение можно расшифровать, зашифровав его снова тем же ключом:
u[i] = e[i] XOR k[i MOD l]
Вам даны четыре зашифрованных потока по 30000 символов каждый (всего 120000 символов). Ваша задача — вывести четыре расшифрованных потока без добавления лишних символов. Потоки были зашифрованы с использованием шифрования XOR с ключами длиной менее 30 символов. Каждый символ в ключе уникален и выбран из множества a..z и 0..9.
Ваша задача — определить правильную длину ключа и расшифровать зашифрованный поток.
Ваши наниматели предоставили дополнительную информацию: "Расшифрованное сообщение будет на английском языке."
Рекомендуется сначала написать программу шифрования XOR для тестирования вашего решения.
Входные данные
Вывод алгоритма шифрования XOR обычно не подлежит печати, так как может содержать ASCII-коды больше 127. Поэтому пример зашифрованного сообщения ниже представлен в виде числовых значений ASCII (в десятичной системе) — фактический входной файл содержит ASCII-символы.
Если сообщение "the quick brown fox jumps over the lazy dog" зашифровано с использованием ключа "12" (буквальные символы "1" и "2"), получается следующий (бинарный) файл.
69 90 84 18 64 71 88 81 90 18 83 64 94 69 95 18 87 93 73 18 91 71 92 66 66 18 94 68 84 64 17 70 89 87 17 94 80 72 72 18 85 93 86
Если эти значения преобразовать в ASCII-символы и сохранить в файл (длина файла должна составлять ровно 43 байта), его можно использовать в качестве входных данных для вашей программы. Рекомендуется сначала написать алгоритм шифрования.
Выходные данные
Ваша программа должна определить длину ключа как 2 (вы не должны выводить это значение) и расшифровать сообщение, чтобы получить:
the quick brown fox jumps over the lazy dog
Замечание
Поскольку неудобно считывать двоичный ввод из текстового потока, я преобразовал исходные данные в числа, то есть в ASCII-значения соответствующих символов. Таким образом, вы получите 120000 строк чисел, по одному на строку! Это не имеет значения для вывода, так как они должны стать печатными символами, если вы справитесь с этой задачей.