У меня есть этот псевдокод:
for i = 0 ... P.length
C[i] = P[i] XOR K[i%K];
K[i%k] = ( K[i%k] +P[i] ) mod 64;
Где P - простой текст, C - зашифрованный текст, K - ключ, а k обозначает длину ключа K (обратите внимание, что заглавные буквы различны для k и K).
Обратите внимание, что это домашняя работа, но она не моя, мне просто любопытно, как ее решить, поскольку мне всегда нравились темы шифрования.
Задача здесь состоит в том, чтобы вывести простой текст P, если вы получили C и знаете следующее о ключе.
Ключ выбирается как случайное слово из этого списка слов TWL . Случайное число от 0 до 999 добавляется в конец выбранного слова. С вероятностью 0,5 первый символ был написан заглавными буквами. Нижний регистр «о» затем преобразуется в «0» (ноль) с вероятностью 0,5 для каждого «о». Аналогично, каждая строчная буква «l» (ell) преобразуется в «1» (один), каждый «e» в «3», каждый «s» в «5» и каждый «t» в «7», все с вероятность 0,5.
Программа должна занимать менее 10 секунд и занимать менее 1 ГБ памяти. В классе, где есть эта проблема, есть ноутбуки среднего класса, поэтому я отнесусь к этим 10 секундам серьезно (хотя, поскольку я не решаю домашнее задание, у меня нет временных ограничений).
Что было бы хорошим способом решения этой проблемы? Потому что не похоже, что грубая сила будет здесь полезна.
P.S. IF"%" - это модульное деление ... тогда что делает "мод"?
Edit:
Простой текст P - это случайный текст, взятый из Википедии, в котором все символы, не являющиеся буквами или цифрами, удалены (включая пробелы). Я почти уверен, что каждый символ сопоставляется с [a-zA-Z0-9] и удаляется, если не совпадает.
Редактировать 2:
Этот .pdf , вероятно, поможет уточнить. Там вы найдете примеры выходов P и Ключ.