Рейтинг:2

Использование пробелов для взлома потокового шифра с многократным блокнотом

флаг th

У меня есть вопрос о первом задании по программированию в курсе криптографии Дэна Боне на Coursera. Вам дано 10 зашифрованных текстов, зашифрованных одним и тем же ключом, и вы можете предположить, что открытый текст состоит только из букв и пробелов.

Подсказка дает вам понять, что происходит, когда пробел подвергается операции xor с буквой. Идея состоит в том, чтобы проверить, соответствуют ли подвергнутые xor-обработке части комбинаций зашифрованного текста букве, что должно позволить нам вычислить ключ.

Если мы найдем букву, я думаю, мы сможем восстановить ту часть ключа, которая соответствует букве, которую мы сейчас обрабатываем, выполнив следующие действия:

Позволять c_sub1 и c_sub2 быть частями зашифрованных текстов с1 и с2 что мы сейчас проверяем и позволяем m_sub1 и m_sub2 быть соответствующими частями открытых текстов. Один из m_sub1 или же m_sub2 должен быть пробел. Чтобы выяснить, какой из них, мы попробуем следующее: Предполагая m_sub1 является пробелом, получить соответствующую часть ключа (k_sub) с помощью xor-ing c_sub1 с 00100000 (двоичное представление пробельного символа), k_sub = xor(c_sub1,00100000), и проверьте, шифруется ли буква с перевернутым регистром (поскольку xor-ing с пробелом переворачивает регистр буквы) с помощью k_sub урожаи c_sub2, если это так, мы должны знать, что k_sub является правильной частью ключа. Если нет, попробуйте то же самое, предполагая, что m_sub2 является пробелом.

Я не могу найти никакой логической ошибки в этом рассуждении, но моя реализация дает неверное решение, и я почти уверен, что устранил все другие возможные ошибки. Может ли кто-нибудь сказать мне, является ли этот подход неправильным, пожалуйста?

Рейтинг:1
флаг in

проверьте, дает ли шифрование буквы с инвертированным регистром (поскольку xor с пробелом переворачивает регистр буквы) с помощью k_sub c_sub2, если это так, мы должны знать, что k_sub является правильной частью ключа. Если нет, попробуйте то же самое, предположив, что m_sub2 является пробелом.

В настоящее время вы соединяете два потока зашифрованных текстов, а у вас их 10. Вы должны выбрать один поток из 10, а затем выполнить XOR со всеми остальными 9 в той же позиции. Если большинство этих потоков возвращают буквы (и нет недопустимых комбинаций XOR, но это сложнее проверить), то вы можете быть уверены, что зашифрованный символ является пробелом, и вы можете найти ключ с помощью XOR, который вы выполняете в своем ответе. .

Я думаю, что это может иметь место в задании Боне, но остерегайтесь, что вы можете столкнуться с комбинациями открытого текста, которые вместе могут также дать букву. Таким образом, вы не можете просто выполнить XOR с двумя потоками и таким образом подтвердить свою догадку. Чем больше у вас потоков, тем больше вы уверены; в конце концов, вы, конечно, можете проверить, просматривая сообщения в виде открытого текста и/или используя свои языковые навыки, чтобы заполнить пробелы.


Если мне не изменяет память, я немного по-другому к этому относился. Я взял один поток, перебрал все символы алфавита (примечание: возможные входные символы здесь называются «алфавитом», я не имею в виду ABC) для каждой позиции, а затем объединил все три вместе. Если все потоки давали результаты в алфавите, значит, я попал в нужный символ. Это позволяет вам обрабатывать только символы алфавита, а не странные комбинации XOR.

Если найдено несколько символов, используйте тот, который производит наиболее часто используемые символы во всех потоках вместе (частотный анализ).

Если это по-прежнему не дает результатов, вы можете попробовать и другие потоки (конечно, вам нужно будет сравнить только поток 2 с 8 потоками, поскольку вы уже сравнили № 1 и № 2).


Итак, допустим, у нас есть первая позиция (в именах переменных позиции не указаны) и набор потоков. Теперь давайте начнем с первого потока и совершим операцию XOR со всеми остальными потоками, обозначенными $у$ куда $у != 1$.

У вас есть пара из двух значений зашифрованного текста, которые состоят из $c_1 = p_1 \oplus k$ и $c_y = p_y \oplus k$. Таким образом, XOR вместе дает вам $r = c_1 \oplus c_y = p_1 \oplus p_y$ (здесь ничего нового). Теперь, если вы угадаете $p_1$ и назови это $p'_1$ вы бы получили $p'_1 \oplus p_1 \oplus p_y = p'_y$. Сейчас если $p'_y$ является недопустимым символом, тогда очевидно $p'_1$ было ошибочным предположением. Если вам не повезло, вам нужно провести частотный анализ всех полученных результатов. $p'_y$. Но помните, что вы можете сделать это с помощью все $\бином{n+1}2$ пары прежде чем прибегать к этому.

Как только у вас есть $p'_1 = p_1$ тогда, очевидно, ключ - это просто XOR с символом зашифрованного текста: $c_1 \oplus p_1 = k$. Это означает, что вам нужно перебирать только алфавит, а не все клавиши, и вы действительно можете быстро отбросить неудачные попытки.

eager2learn avatar
флаг th
Спасибо за Ваш ответ. У меня есть несколько вопросов:
eager2learn avatar
флаг th
«остерегайтесь, что вы можете столкнуться с комбинациями открытого текста, которые вместе могут также давать букву. Таким образом, вы не можете просто выполнить XOR с двумя потоками и проверить таким образом свое предположение». Я думал об этом, но не понимаю, как вы можете проверить это с помощью нескольких потоков. Должны ли вы просто подсчитать для каждой позиции в ключе, какой ключ получен в результате операции xor двух пар зашифрованного текста, а затем выбрать наиболее часто встречающуюся подпоследовательность ключей?
eager2learn avatar
флаг th
Я взял один поток, перебрал все символы алфавита (примечание: возможные входные символы здесь называются «алфавитом», я не имею в виду ABC) для каждой позиции, а затем объединил все три вместе с помощью XOR. Если все потоки давали результаты в алфавите, тогда я нажимал правильный символ». Почему вы используете xor три последовательности здесь, в цитате упоминается только один поток, а затем символ в каждой итерации? Также я не понимаю, почему xor-ing элемент в алфавите с подпоследовательностью зашифрованных текстов должен привести к букве
Maarten Bodewes avatar
флаг in
Добавлено объяснение фактического XOR.
eager2learn avatar
флаг th
У меня есть еще один вопрос: как в вашем подходе узнать, соответствует ли элемент из алфавита, который я правильно угадал ($p'_1=p_1$), соответствует $c_1$ или $c_y$?
Maarten Bodewes avatar
флаг in
Вы этого не сделаете, но это становится более вероятным, когда другие потоки возвращают ожидаемые результаты. Это всегда так, конечно. Представьте, что все потоки имеют одинаковый характер в определенном месте...Это было бы сразу видно из зашифрованного текста, но *какой* символ остается неизвестным - вы можете только догадываться об этом по остальным открытым текстовым сообщениям, которые вы *можете* восстановить.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.