Шифрование с помощью операции исключающее или сообщение

Обновлено: 30.06.2024

"Я хочу, чтобы меня услышали в России. Абсолютно все. Тысячи жертв, сотни пленных, которые просто не могут понять ради чего их отправили в Украину.
Отправили в Украину умирать. Убивать других. Чем скорее вы скажете своей власти, что войну нужно немедленно остановить – тем больше ваших людей останутся живыми.
Мы видим, что действительно есть выступления ваших граждан против войны. И мы знаем, что многие в России сейчас просто шокированы подлостью и жестокостью власти. И это очень правильная реакция. Я благодарю вас за эту реакцию! Спасибо Леониду Парфёнову, Дмитрию Муратову, Юрию Дудю, Лие Ахеджаковой, Валерию Меладзе – ну, и тысячам. Тысячам достойных других россиян, чья совесть звучит – звучит громко.
Просто остановите тех, кто лжет вам. Лжет нам. Лжет всему миру.
Нужно закончить эту войну. Мы можем жить в мире. В мире глобальном. В мире человечества".

Шифр XOR – это алгоритм шифрования данных с использованием исключительной дизъюнкции.

Описание алгоритма

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

Формула для получения закодированного текста: Cn = Mn xor Kn.

Ключ шифрования можно получить двумя способами:

Реализация XOR шифрования

Россияне ваши войска ведут ужасную войну против Украины, убивают мирное население, не щадя женщин и детей! Мы отстаиваем свою родину, потери войск РФ за несколько дней войны превысили потери в Чеченской войне!
Заберите с Украины своих отцов, мужей, сыновей пока они живы!

Результат работы программы:

Для большей криптостойкости, можно генерировать гамма-последовательность с использованием псевдослучайных чисел, используя целочисленный ключ, как параметр конструктора класса Random(это обеспечивает повторяемость последовательности случайных чисел):

Россияне ваши войска ведут ужасную войну против Украины, убивают мирное население, не щадя женщин и детей! Мы отстаиваем свою родину, потери войск РФ за несколько дней войны превысили потери в Чеченской войне!
Заберите с Украины своих отцов, мужей, сыновей пока они живы!

Xor-шифрование

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

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

Базовые понятия шифрования

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

Таблица истинности для XOR:

x i ⊕ y i

x = 10011 101

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

Слот обработчик для выполнения шифрации

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

y = 01001 100

z = 11010 001

То есть, операция z = xy по сути поразрядная (побитовая – результат не зависит от соседних битов). Если только один из соответствующих битов равен 1, то результат 1. А если оба 0 или оба 1, то результат 0. Если внимательно посмотреть на результат применения XOR к двум двоичным числам, то можно заметить, что мы можем восстановить одно из слагаемых при помощи второго: x = zy или y = zx .

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

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

Отсюда можно сделать следующие выводы: зная число y и применяя XOR к x , мы получим z . Затем, мы, опять же используя y , получим из z обратно число x . Таким образом мы можем преобразовать последовательность чисел (x ) i в последовательность (z ) i . Теперь мы можем назвать число y кодирующим (или шифрующим) ключом. Если человек не знает ключа, то он не сможет восстановить исходную последовательность чисел (x ) i . Но если (x ) i являются байтовым представлением букв текста, то опытный пользователь сможет вскрыть зашифрованный текст. Поскольку каждая буква будет представлена в шифротексте одним и тем же кодом z , то воспользовавшись частотным словарем взломщик сможет вычислить шифрующий ключ y , если у него будет в распоряжениии достаточно длинный шифротекст.

Ну, по сравнению с криптографией, побитовые операции и вращения намного проще реализовать во время программирования. Эти обфускационные образцы были найдены в дикой природе и все они были идентифицированы как некоторая форма вредоносного ПО. Одним умением, которое полезно при попытке расшифровать файл, является распознавание образов. Каков шаблон, который вы видите на изображении выше? В некоторых случаях, зная, какой байт должен быть в его де-зафузированной форме, может быть разница в нахождении надежного шаблона или нет.

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

Если бы это было так, мы увидели бы, что значение повторяется много раз подряд. Давайте подумаем об этих байтах с нулевым значением в течение минуты. Если мы посмотрим на наш декодированный файл из первого сценария, мы увидим, что третья строка - это всего лишь нули. Давайте перейдем к поиску всего файла для этой 16-байтовой последовательности и посмотрим, что мы найдем.

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

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

Базовые понятия шифрования

Шифрова́ние - способ преобразования открытой информации в закрытую и обратно. Применяется для хранения важной информации в ненадёжных источниках или передачи её по незащищённым каналам связи. Согласно ГОСТ 28147-89, шифрование подразделяется на процесс зашифрования и расшифрования.

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

Говорит также открытый ключ. Ключом к расшифровке данных является закрытый ключ, который остается под опекой получателя и в основном защищен снова. Недостатком этого метода является то, что он намного медленнее, чем симметричное шифрование, и из-за математической зависимости требуются даже более высокие длины ключей.

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

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

Криптогра́фия - наука о методах обеспечения конфиденциальности (невозможности прочтения информации посторонним) и аутентичности (целостности и подлинности авторства, а также невозможности отказа от авторства) информации.

Как работает блочный шифр?

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

Как работает шифрование потоков

Синхронные потоковые шифры часто строятся с использованием линейных сдвиговых регистров с обратной связью.

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

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

Криптография - одна из старейших наук, ее история насчитывает несколько тысяч лет.

Открытый (исходный) текст - данные (не обязательно текстовые), передаваемые без использования криптографии.

Шифрованный (закрытый) текст - данные, полученные после применения криптосистемы с указанным ключом.

Криптосистема - семейство обратимых преобразований открытого текста в шифрованный.

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

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

Ключ - параметр шифра, определяющий выбор конкретного преобразования данного текста. В современных шифрах алгоритм шифрования известен, и криптографическая стойкость шифра целиком определяется секретностью ключа (Принцип Керкгоффса).

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

Расшифровывание - процесс нормального применения криптографического преобразования шифрованного текста в открытый.

Криптоанализ - наука, изучающая математические методы нарушения конфиденциальности и целостности информации.

Криптографическая атака - попытка криптоаналитика вызвать отклонения в атакуемой защищенной системе обмена информацией. Успешную криптографическую атаку называют взлом или вскрытие .

Криптографическая стойкость - способность криптографического алгоритма противостоять криптоанализу.

Алгоритм XOR-шифрования

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

Алгоритм XOR-шифрования основан на применении бинарной логической операции исключающего или. В табличном представлении функция выглядит следующим образом:

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

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

Операция XOR обладает симметричностью. Это значит, что если зашифровать один и тот же файл 2 раза с одним и тем же паролем, то на выходе получим сам этот файл без изменений. Из этого факта становится ясно, что для шифрования и расшифровывания будет использоваться одна и та же функция, что существенно упрощает реализацию алгоритма. При этом, если при расшифровывании используется тот же пароль, что и при шифровании, то на выходе будет получен исходный файл. Если же пароли различаются, то на выходе будет получен файл, который будет содержать некорректные данные.

Рассмотрим алгоритм XOR-шифрования более подробно:

  1. На входе получаем указатели на исходный и результирующий файлы и строку пароля (которая не должна быть пустой).
  2. Читаем очередной символ (байт) из исходного файла.
  3. Применяем операцию XOR к прочитанному байту и очередному символу пароля.
  4. Результат операции записываем в результирующий файл.
  5. Если не достигнут конец исходного файла, переходим на шаг 2.

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

Необходимо реализовать процедуру:

procedure XOR_CoDec (const SourceFile, DestFile, Password: string);

Важный компонент в большинстве блоков шифрования — операция ИСКЛЮЧАЮЩЕЕ ИЛИ: Как мы уже обсуждали в "Введение в основы современных шифров с симметричным ключом" , операции сложения и вычитания в GF(2 n ) выполняется с помощью одной и той же операции, называемой ИСКЛЮЧАЮЩЕЕ ИЛИ или ( XOR ):

Свойства. Пять свойств операции ИСКЛЮЧАЮЩЕЕ ИЛИ в поле GF(2 n ) делают эту операцию очень удобной для использования в блочном шифре.

1. Замкнутость. Это свойство гарантирует, что в результате этой операции два n -битовых слова дают другое n -битовое слово.

2. Ассоциативность. Это свойство позволяет нам использовать больше чем одно ИСКЛЮЧАЮЩЕЕ ИЛИ, которые можно вычислять в любом порядке.

x \oplus (y \oplus z) \leftrightarrow (x \oplus y) \oplus z

3. Коммутативность. Это свойство позволяет нам менять местами операторы ( входную информацию ), не изменяя результат ( выходную информацию ).

x \oplus y \leftrightarrow y \oplus x

4. Существование нулевого (тождественного) элемента. Нулевой элемент для операции ИСКЛЮЧАЮЩЕЕ ИЛИ – слово, которое состоит из всех нулей, или (00. 0) . Это подразумевает, что существует слово с нейтральными элементами, которое при проведении операции не изменяет слово.

x \oplus (00….00) = x

Мы используем это свойство в шифре Файстеля, который рассмотрим позже в этой лекции.

5. Существование инверсии. В поле GF(2 n ) каждое слово есть аддитивная инверсия самого себя. Это подразумевает, что проведение операции ИСКЛЮЧАЮЩЕЕ ИЛИ слова с самим собой приводит к нулевому элементу:

x \oplus x = (00\dots 0)

Мы также используем это свойство в шифре Файстеля, который рассмотрим позже в этой лекции.

\bar x

Дополнение. Операция дополнения — одноместная операция (один информационный вход и один информационный выход), которая инвертирует каждый бит в слове. 0 -вой бит меняет на 1 (единичный) бит; 1 (единичный) бит меняет на 0 -вой бит. Нас интересует операции с дополнением относительно операции ИСКЛЮЧАЮЩЕЕ ИЛИ. Если — дополнение "x" , тогда верны следующие два соотношения:

и

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

Инверсия. Инверсия компонента в шифре имеет смысл, если компонент представляет одноместную операцию (один вход и один выход). Например, P -блок без ключа или S -блок без ключа могут быть обратимыми, потому что они имеют один вход и один выход. Операция ИСКЛЮЧАЮЩЕЕ ИЛИ — бинарная операция . Инверсия операции ИСКЛЮЧАЮЩЕЕ ИЛИ может иметь смысл, только если один из входов зафиксирован (один и тот же при шифровании и дешифровании). Например, если один из входов — ключ, который обычно является одним и тем же в шифровании и дешифровании, тогда операция ИСКЛЮЧАЮЩЕЕ ИЛИ является обратимой, как показано на рис. 7.9.

На рисунке 7.9 свойство аддитивной инверсии подразумевает, что

y = x \oplus k x = k \oplus y

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

Циклический сдвиг

Другой компонент, применяемый в некоторых современных блочных шифрах , – операция циклического сдвига. Смещение может быть влево или вправо. Круговая операция левого сдвига сдвигает каждый бит в n -битовом слове на k позиции влево; крайние левые k -биты удаляются слева и становятся самыми правыми битами. Круговая операция правого сдвига сдвигает каждый бит в n -битовом слове на k позиций вправо; самые правые k -биты справа удаляются и становятся крайними левыми битами. Рисунок 7.10 показывает и левые и правые операции в случае, где n = 8 и k = 3 .

Циклическая операция сдвига смешивает биты в слове и помогает скрыть образцы в первоначальном слове. Хотя число позиций, на которые биты будут сдвинуты, может использоваться как ключ, циклическая операция сдвига обычно – без ключа; значение k устанавливается и задается заранее.

Обратимость. Циклическая операция левого сдвига – инверсия операции правого сдвига. Если одна из них используется для шифрования, другая может применяться для дешифрования.

Свойства. Операция циклического сдвига имеет два свойства, которые нам надо знать.

Первая — это смещение по модулю n . Другими словами, если k = 0 или k = n , никакого смещения не происходит. Если k является большим, чем n , тогда входная информация сдвинута на k mod n бит. Второе свойство, операция циклического сдвига над соединением операций - есть группа. Это означает, что если смещение делается неоднократно, то одно и то же значение может появиться несколько раз..

Замена

Операция замены — специальный случай операции циклического сдвига, где k = n/2 означает, что эта операция возможна, только если n — четный номер. Поскольку сдвиг влево n/2 — то же самое, что сдвиг n/2 вправо, эта операция является обратимой. Операция замены для шифрования может быть полностью раскрыта операцией замены для дешифрации. Рисунок 7.11 иллюстрируетт операцию замены для слова на 8 битов.

Разбиение и объединение

Две других операции, применяемые в некоторых блочных шифрах , — разбиение и объединение. Разбиение обычно разделяет n -битовое слово в середине, создавая два слова равной длины. Объединение связывает два слова равной длины, чтобы создать n -битовое слово. Эти две операции инверсны друг другу и могут использоваться как пара, чтобы уравновесить друг друга. Если одна используется для шифрования, то другая — для дешифрования. Рисунок 7.12 показывает эти две операции для случая n = 8 .

В данной статье я расскажу о битовой операции XOR (исключающее ИЛИ) и приведу наиболее интересные примеры ее применения на JAVA.

image

XOR обладает следующими свойствами:

a XOR 0 = a
a XOR a = 0
a XOR b = b XOR a
(a XOR b) XOR b = a

Обмен значений переменных без использования дополнительной переменной

С использованием операции XOR можно реализовать обмен значений однотипных пременных без использования дополнительной переменной:

или в более короткой записи:


Таким образом можно, например, реализовать реверс текстовой строки:



Следует, однако, заметить, что такой код не дает выигрыша в скорости по сравнению с кодом использующим временную переменную.

Шифрование

Шифрование на основе операций XOR использует свойство:
(a XOR k) XOR k = a
где k – выступает в роли ключа

Простая реализация шифрования строки:


Попробуем зашифровать строку “Съешь ещё этих мягких французских булок, да выпей чаю.” И в качестве ключа возьмем слово “хабра”:


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

Генератор случайных чисел XORShift

В 2003 году Джордж Марсаглия представил миру быстрый алгоритм генерации случайных чисел с использованием XOR – XORShift.

Одна из возможных его рализаций:


Тут “магические“ числа 21, 35 и 4 подобраны для генерации лучшей последовательности (полный период равен 2 64 -1).
Проинициализировав генератор числом 1111111111, получим такую последовательность для первых 10 чисел:

39462749392662495
4596835458788324745
-7932128052244037525
-2502212788642280052
3288035714308340525
-8561046377475020727
-812160615072319265
-3869866974339671508
-7329504029400927428
3890915262874757420

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

Читайте также: