Что не так с шифрованием XOR? - PullRequest
49 голосов
/ 16 июля 2009

Я написал короткую программу на C ++ для XOR-шифрования файла, которую я могу использовать для некоторых личных файлов (если он взломан, это не проблема - я просто защищаю от случайного просмотра) Обычно я беру пароль ASCII и повторно XOR пароль с данными в файле.

Теперь мне любопытно: если бы кто-то хотел взломать это, как бы они это сделали? Это займет много времени? Зависит ли это от длины пароля (т.е. что такое big-O)?

Ответы [ 12 ]

114 голосов
/ 16 июля 2009

Проблема с шифрованием XOR заключается в том, что для длинных запусков одних и тех же символов очень легко увидеть пароль. Такие длинные прогоны чаще всего являются пробелами в текстовых файлах. Допустим, ваш пароль состоит из 8 символов, а текстовый файл содержит 16 пробелов в одной строке (например, в середине таблицы ASCII-графики). Если вы просто сделаете XOR с вашим паролем, вы увидите, что на выходе будут повторяться последовательности символов. Злоумышленник будет просто искать любое из них, пытаться угадать символ в исходном файле (пробел будет первым кандидатом, который попробует) и вычислять длину пароля из длины повторяющихся групп.

Двоичные файлы могут быть еще хуже, поскольку они часто содержат повторяющиеся последовательности 0x00 байтов. Очевидно, что XORing с ними не работает, поэтому ваш пароль будет виден в виде простого текста в выводе! Примером очень распространенного двоичного формата с длинными последовательностями нулей является .doc.

67 голосов
/ 16 июля 2009

Я согласен с Павлом Минаевым объяснением слабостей XOR. Для тех, кто интересуется, вот основной обзор стандартного алгоритма, используемого для прерывания тривиального шифрования XOR за несколько минут:

  1. Определите, как долго ключ. Это делается путем XORing зашифрованных данных с собой сдвинули различные номера мест, и исследуя, сколько байты одинаковые.

  2. Если байты равны больше определенного процента (6% от Брюса Шнайера Прикладная криптография вторая издание ), то вы сдвинули данные, кратные длине ключа. Найдя наименьшее количество сдвиг, что приводит к большому количество равных байтов, вы найдете Длина ключа.

  3. Сместить зашифрованный текст на длина ключа и XOR против себя. Это удаляет ключ и оставляет вас с открытым текстом XORed с открытым текстом сместил длину ключ. Там должно быть достаточно открытый текст для определения сообщения содержание.

Подробнее на Вопросы шифрования, часть 1

22 голосов
/ 16 июля 2009

XOR-шифрование может быть достаточно * сильным, если выполняются следующие условия:

  • Обычный текст и пароль примерно одинаковой длины.
  • Пароль не используется повторно для шифрования более одного сообщения.
  • Пароль не может быть угадан, т.е. по словарю или другими математическими средствами. На практике это означает, что биты рандомизированы.

* Достаточно сильное значение, которое не может быть нарушено тривиальными математическими средствами, как в посте GeneQ. Он по-прежнему не надежнее вашего пароля.

12 голосов
/ 16 июля 2009

В дополнение к уже упомянутым пунктам шифрование XOR полностью уязвимо для атак с использованием открытого текста:

cryptotext = plaintext XOR key
key = cryptotext XOR plaintext = plaintext XOR key XOR plaintext

, где XORring текстовые сообщения взаимно уничтожаются, оставляя только ключ.

Отсутствие уязвимости для атак с использованием открытого текста является обязательным, но недостаточным свойством для любого «безопасного» метода шифрования, когда один и тот же ключ используется для нескольких блоков открытого текста (т. Е. Одноразовая клавиатура по-прежнему защищена).

6 голосов
/ 14 октября 2011

Способы заставить XOR работать:

Используйте несколько ключей, каждая длина которых равна простому числу, но никогда не бывает одинаковой длины для ключей. Используйте исходное имя файла в качестве другого ключа, но не забудьте создать механизм для получения имени файла. Затем создайте новое имя файла с расширением, которое позволит вам знать, что это зашифрованный файл. Причина использования нескольких ключей длины простого числа состоит в том, что они приводят к тому, что результирующий ключ XOR будет иметь длину ключа A TIMES Key B до его повторения. Сожмите все повторяющиеся шаблоны из файла до его шифрования. Сгенерируйте случайное число и XOR это число при каждом смещении X (Помните, что это число также должно быть восстановлено. Вы можете использовать СЛУЧАЙНОЕ СЕМЯ длины файла.

После всего этого, если вы используете 5 клавиш длиной 31 и больше, вы получите длину ключа примерно сто мегабайт!

Для ключей, имя файла равно одному (включая полный путь), STR (Размер файла) + STR (Filedate) + STR (Дата) + STR (Время), Случайный ключ генерации, Ваше полное имя, Закрытый ключ, созданный один раз .

База данных для хранения ключей, используемых для каждого зашифрованного файла, но хранит файл DAT на карте памяти USB, а НЕ на компьютере.

Это должно предотвратить повторение шаблона для файлов, таких как «Изображения» и «Музыка», но фильмы, длина которых составляет четыре гигабайта или более, могут быть уязвимы, поэтому может потребоваться шестой ключ.

У меня лично файл данных зашифрован на карте памяти (файл DAT для использования с Microsoft Access). Я использовал метод 3-Key для его шифрования, потому что он никогда не будет таким большим, будучи каталогом файлов со связанными ключами.

Причина, по которой несколько ключей вместо генерации одного очень большого ключа случайным образом заключаются в том, что простые числа быстро увеличиваются, и у меня есть некоторый контроль над созданием ключа, и вы ЗНАЕТЕ, что действительно нет такой вещи, как действительно случайное число , Если бы я создал одно большое случайное число, кто-то другой может сгенерировать это же число.

Способ использования ключей: зашифруйте файл одним ключом, затем следующим, затем следующим, пока все ключи не будут использованы. Каждый ключ используется снова и снова, пока весь файл не будет зашифрован этим ключом.

Поскольку ключи имеют разную длину, перекрытие повтора различно для каждого ключа и поэтому создает производный ключ длиной Ключ один раз Ключ два. Эта логика повторяется для остальных клавиш. Причина простых чисел состоит в том, что повторение будет происходить при делении длины ключа, поэтому вы хотите, чтобы деление было равно 1 или длине ключа, hense, prime.

Да, конечно, это больше, чем просто XOR в файле, но концепция та же.

Lance

3 голосов
/ 16 июля 2009

Я просто защищаю от случайных зрителей

Пока это предположение верно, ваша схема шифрования в порядке. Люди, которые думают, что Internet Explorer - это «интернет», не способны его взломать.

Если нет, просто используйте некоторую криптографическую библиотеку. Уже есть много хороших алгоритмов, таких как Blowfish или AES для симметричного шифрования.

2 голосов
/ 27 ноября 2010

Другой трюк - сгенерировать хеш md5 () для вашего пароля. Вы можете сделать его еще более уникальным, используя длину защищенного текста в качестве смещения или комбинируя его с вашим паролем, чтобы обеспечить лучшее распространение коротких фраз. А для длинных фраз развивайте свой хеш md5 (), комбинируя каждый 16-байтовый блок с предыдущим хешем - делая весь ключ XOR «случайным» и неповторяющимся.

2 голосов
/ 16 июля 2009

Антивирус Нортона использовал технику использования предыдущей незашифрованной буквы в качестве ключа для следующей буквы. Мне потребовались дополнительные полчаса, чтобы понять, если я правильно помню.

Если вы просто хотите остановить случайного зрителя, этого достаточно; Я использовал, чтобы скрыть строки в исполняемых файлах. Однако это не выдержит 10 минут тому, кто действительно попытается.

Тем не менее, в наши дни стали доступны гораздо лучшие методы шифрования, так почему бы не воспользоваться чем-то лучшим. Если вы пытаетесь просто спрятаться от «случайного» пользователя, даже что-то вроде gzip сделает эту работу лучше.

2 голосов
/ 16 июля 2009

Цель хорошего шифрования - сделать его математически трудным для расшифровки без ключа.
Это включает в себя желание защитить сам ключ.
Техника XOR в основном представляет собой очень простой шифр, который легко взломать, как описано здесь.

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

1 голос
/ 08 июня 2010

То, что упоминает «> 6%» GeneQ, является индексом совпадения для английского телеграфного текста - 26 букв с пунктуацией и цифрами. Фактическое значение для длинных текстов составляет 0,0665.

<4% - это индекс совпадения для случайного текста в алфавите из 26 символов, который равен 1/26 или 0,385. </p>

Если вы используете другой язык или другой алфавит, конкретные значения будут другими. Если вы используете набор символов ASCII, Unicode или двоичные байты, конкретные значения будут сильно отличаться. Но разница между IC открытого текста и случайного текста обычно будет присутствовать. (Сжатые двоичные файлы могут иметь интегральные микросхемы, очень близкие к случайным, и любой файл, зашифрованный любым современным компьютерным шифром, будет иметь микросхему, точно такую ​​же, что и случайный текст.)

После того, как вы XOR отредактировали текст против себя, то, что вы оставили, эквивалентно шифру автоключа. В Википедии есть хороший пример взлома такого шифра

http://en.wikipedia.org/wiki/Autokey_cipher

...