Что не так с шифрованием XOR?
Я написал короткую C++ программу для шифрования XOR файла, которую я могу использовать для некоторых личных файлов (если он взломан, это не проблема - я просто защищаю от случайных зрителей). По сути, я беру пароль ASCII и повторно XOR пароль с данными в файле.
Теперь мне любопытно: если бы кто-то хотел взломать это, как бы они это сделали? Это займет много времени? Зависит ли это от длины пароля (то есть что такое big-O)?
14 ответов
Проблема с шифрованием XOR состоит в том, что для длинных запусков одних и тех же символов очень легко увидеть пароль. Такие длинные прогоны чаще всего являются пробелами в текстовых файлах. Допустим, ваш пароль состоит из 8 символов, а текстовый файл содержит 16 пробелов в одной строке (например, в середине таблицы ASCII-графики). Если вы просто сделаете XOR с вашим паролем, вы увидите, что на выходе будут повторяться последовательности символов. Злоумышленник будет просто искать любое из них, пытаться угадать символ в исходном файле (пробел будет первым кандидатом, который попробует) и вычислять длину пароля из длины повторяющихся групп.
Двоичные файлы могут быть еще хуже, так как они часто содержат повторяющиеся последовательности 0x00
байт. Очевидно, что XORing с ними не работает, поэтому ваш пароль будет виден в виде простого текста в выводе! Пример очень распространенного двоичного формата, который имеет длинные последовательности нулей: .doc
,
Я согласен с объяснениями Pavel Minaev о слабостях XOR. Для тех, кто интересуется, вот основной обзор стандартного алгоритма, используемого для прерывания тривиального шифрования XOR за несколько минут:
Определите, как долго ключ. Это делается путем XOR зашифрованных данных с самим собой, смещенных на различное количество мест, и изучения количества одинаковых байтов.
Если равные байты превышают определенный процент (6% по сравнению со вторым изданием Брюса Шнайера "Прикладная криптография"), то вы сместили данные на кратность длины ключа.Найдя наименьшую величину сдвига, которая приводит к большому количеству равных байтов, вы найдете длину ключа.
Сдвиньте зашифрованный текст на длину ключа и введите XOR против себя.Это удаляет ключ и оставляет вас с открытым текстом XOR с открытым текстом, смещенным на длину ключа. Там должно быть достаточно открытого текста, чтобы определить содержание сообщения.
Узнайте больше на вопросы шифрования, часть 1
Шифрование XOR может быть достаточно * сильным, если выполняются следующие условия:
- Обычный текст и пароль примерно одинаковой длины.
- Пароль не используется повторно для шифрования более одного сообщения.
- Пароль не может быть угадан, т.е. с помощью словаря или других математических средств. На практике это означает, что биты рандомизированы.
* Достаточно сильное значение, которое не может быть нарушено тривиальными математическими средствами, как в сообщении GeneQ. Это все еще не сильнее, чем ваш пароль.
В дополнение к уже упомянутым пунктам, шифрование XOR полностью уязвимо для атак с использованием открытого текста:
cryptotext = plaintext XOR key
key = cryptotext XOR plaintext = plaintext XOR key XOR plaintext
где XORring открытые тексты отменяют друг друга, оставляя только ключ.
Отсутствие уязвимости для атак с использованием открытого текста является обязательным, но недостаточным свойством для любого "безопасного" метода шифрования, когда один и тот же ключ используется для нескольких блоков открытого текста (т. Е. Одноразовая клавиатура по-прежнему защищена).
Способы заставить XOR работать:
Используйте несколько ключей, каждая длина ключа которых равна простому числу, но никогда не бывает одинаковой длины для ключей. Используйте исходное имя файла в качестве другого ключа, но не забудьте создать механизм для получения имени файла. Затем создайте новое имя файла с расширением, которое позволит вам знать, что это зашифрованный файл. Причиной использования нескольких ключей длины простого числа является то, что они приводят к тому, что результирующий ключ XOR будет иметь длину ключа A A TIMES и B до его повторения. Сожмите все повторяющиеся шаблоны из файла до его шифрования. Создайте случайное число и XOR это число при каждом смещении X (Помните, что это число также должно быть восстановимо. Вы можете использовать СЛУЧАЙНОЕ СЕМЯ длины файла.
После всего этого, если вы используете 5 клавиш длиной 31 и больше, вы получите длину ключа примерно сто мегабайт!
Для ключей имя файла равно единице (включая полный путь), STR(Размер файла) + STR(Filedate) + STR(Дата) + STR (Время), Случайный ключ генерации, Ваше полное имя, Закрытый ключ, созданный один раз.
База данных для хранения ключей, используемых для каждого зашифрованного файла, но хранит файл DAT на карте памяти USB, а НЕ на компьютере.
Это должно предотвратить повторяющийся рисунок на файлах, таких как "Изображения" и "Музыка", но фильмы длиной в четыре гигабайта и более могут быть уязвимы, поэтому может потребоваться шестой ключ.
У меня лично файл dat зашифрован на карте памяти (файл Dat для использования с Microsoft Access). Я использовал метод 3-Key для его шифрования, потому что он никогда не будет таким большим, будучи каталогом файлов со связанными ключами.
Причина для нескольких ключей, а не для случайной генерации одного очень большого ключа, заключается в том, что простые числа быстро увеличиваются, и я имею некоторый контроль над созданием ключа, и вы ЗНАЕТЕ, что действительно нет такого понятия, как действительно случайное число. Если бы я создал одно большое случайное число, кто-то другой может сгенерировать это же число.
Способ использования ключей: зашифруйте файл одним ключом, затем следующим, затем следующим, пока все ключи не будут использованы. Каждый ключ используется снова и снова, пока весь файл не будет зашифрован этим ключом.
Поскольку ключи имеют разную длину, перекрытие повторения отличается для каждого ключа и, следовательно, создает производный ключ длиной Ключ один раз Ключ два. Эта логика повторяется для остальных клавиш. Причина простых чисел заключается в том, что повторение будет происходить при делении длины ключа, поэтому вы хотите, чтобы деление было равно 1 или длине ключа, hense, prime.
Да, конечно, это больше, чем просто XOR в файле, но концепция та же.
копье
Я просто защищаю от случайных зрителей
Пока это предположение верно, ваша схема шифрования в порядке. Люди, которые думают, что Internet Explorer - это "интернет", не способны его взломать.
Если нет, просто используйте некоторую криптографическую библиотеку. Уже есть много хороших алгоритмов, таких как Blowfish или AES для симметричного шифрования.
Цель хорошего шифрования - сделать математически сложным дешифрование без ключа.
Это включает в себя желание защитить сам ключ.
Техника XOR - это в основном очень простой шифр, который легко взломать, как описано здесь.
Важно отметить, что XOR используется в криптографических алгоритмах.
Эти алгоритмы работают над введением математической сложности вокруг него.
Другой трюк заключается в создании хеша md5() для вашего пароля. Вы можете сделать его еще более уникальным, используя длину защищенного текста в качестве смещения или комбинируя его с паролем, чтобы обеспечить лучшее распространение коротких фраз. А для длинных фраз развивайте свой хэш md5(), комбинируя каждый 16-байтовый блок с предыдущим хешем - делая весь ключ XOR "случайным" и неповторяющимся.
Антивирус Нортона использовал технику использования предыдущего незашифрованного письма в качестве ключа для следующего письма. Мне потребовались дополнительные полчаса, чтобы понять, если я правильно помню.
Если вы просто хотите остановить случайного зрителя, этого достаточно; Я использовал, чтобы скрыть строки в исполняемых файлах. Однако это не выдержит 10 минут тому, кто на самом деле пытается.
Тем не менее, в наши дни стали доступны гораздо лучшие методы шифрования, так почему бы не воспользоваться чем-то лучшим. Если вы пытаетесь просто спрятаться от "случайного" пользователя, даже что-то вроде gzip сделает эту работу лучше.
RC4 по сути является XOR-шифрованием! Как и многие потоковые шифры, ключ - это ключ (не каламбур!), Вы НИКОГДА не должны повторно использовать ключ. КОГДА-ЛИБО!
Я немного опаздываю с ответом, но так как никто еще не упомянул об этом: это называется шифром Vigenère.
Википедия дает множество атак криптоанализа, чтобы сломать его; еще проще, хотя, поскольку большинство форматов файлов имеют фиксированный заголовок, будет XOR обычный текстовый заголовок с зашифрованным заголовком, который даст вам ключ.
То, что ">6%" упоминает GeneQ, является индексом совпадения для английского телеграфного текста - 26 букв с пунктуацией и цифрами. Фактическое значение для длинных текстов составляет 0,0665.
<4% - это индекс совпадения случайного текста в алфавите из 26 символов, который равен 1/26 или 0,385.
Если вы используете другой язык или другой алфавит, конкретные значения будут другими. Если вы используете набор символов ASCII, Unicode или двоичные байты, конкретные значения будут очень разными. Но разница между IC открытого текста и случайного текста обычно будет присутствовать. (Сжатые двоичные файлы могут иметь интегральные микросхемы, очень близкие к случайным, и любой файл, зашифрованный любым современным компьютерным шифром, будет иметь микросхему, точно такую же, что и случайный текст.)
После того, как вы XOR отредактировали текст против себя, то, что вы оставили, эквивалентно автошифровому шифру. В Википедии есть хороший пример взлома такого шифра
Если вы хотите продолжать использовать XOR, вы можете легко хешировать пароль с помощью нескольких разных солей (строка, которую вы добавляете к паролю перед хешированием), а затем объединять их, чтобы получить больший ключ. Например, используйте sha3-512 с 64 уникальными солями, затем хешируйте свой пароль с каждой солью, чтобы получить 32768-битный ключ, который вы можете использовать для шифрования файла размером 32 КБ (Килибит) (4 КиБ (килибайт)) или меньшего размера. Такое многократное хеширование должно занимать менее секунды на современном процессоре. для чего-то более безопасного вы можете попробовать манипулировать своим ключом во время шифрования, например AES (Rijndael). AES фактически выполняет XOR раз и изменяет ключ при каждом повторении ключа, используя таблицу переключения. Он стал международным стандартом, поэтому его довольно безопасно.
Подглавная()
Дим, я тусклый
dim strOutput dim strResult
dim strMessage dim strPassword
dim strRand dim strMsg
тусклый SwitchIO
strMessage = InputBox("", "Входное сообщение") strPassword = inputBox("", "Введите пароль")
м = 1
для i = 1 до Len(strMessage)
для a = 1 до Len(strPassword)
Randomize(Timer)
strRand = strRand & Int(a * Rnd + 1)
следующий
strMsg = strRand 'IV
стрРанд = ""
для a = 1 до Len(strPassword)
strOutput = Chr(Asc(Mid(strMessage, i, 1)) xor asc(mid(strPassword, mid(strMsg, a, 1), 1)))
strResult = strResult & strOutput
exit for
Следующий
Следующий
strMsg = InputBox("","Result",strResult)
Конец субтитра
Основной()