какое свойство операции исключающее или позволяет использовать ее для простейшего шифрования
Практика применения XOR в программировании
В данной статье я расскажу о битовой операции XOR (исключающее ИЛИ) и приведу наиболее интересные примеры ее применения на JAVA.
Итак, XOR – операция, которая принимает значение «истина» только если всего один из аргументов имеет значение «истина».
XOR обладает следующими свойствами:
a XOR 0 = a
a XOR a = 0
a XOR b = b XOR a
(a XOR b) XOR b = a
В языке JAVA (а также в С, С++, C#, Ruby, PHP, JavaScript) операция обозначается символом «^».
Обмен значений переменных без использования дополнительной переменной
С использованием операции XOR можно реализовать обмен значений однотипных пременных без использования дополнительной переменной:
или в более короткой записи:
Таким образом можно, например, реализовать реверс текстовой строки:
Следует, однако, заметить, что такой код не дает выигрыша в скорости по сравнению с кодом использующим временную переменную.
Шифрование
Шифрование на основе операций XOR использует свойство:
(a XOR k) XOR k = a
где k – выступает в роли ключа
Простая реализация шифрования строки:
Попробуем зашифровать строку “Съешь ещё этих мягких французских булок, да выпей чаю.” И в качестве ключа возьмем слово “хабра”:
Узким местом такого шифрования является то, что зная часть зашифрованного текста можно с легкостью восстановить ключ и, соответственно, разшифровать весь текст. Поэтому в чистом виде он редко используется на практике, хотя его применяют как часть более сложных алгоритмов шифрования.
Интересно, что в свое время данный алгоритм использовался Microsoft для шифрования содержимого документов в Office 95.
Генератор случайных чисел XORShift
В 2003 году Джордж Марсаглия представил миру быстрый алгоритм генерации случайных чисел с использованием XOR – XORShift.
Одна из возможных его рализаций:
39462749392662495
4596835458788324745
-7932128052244037525
-2502212788642280052
3288035714308340525
-8561046377475020727
-812160615072319265
-3869866974339671508
-7329504029400927428
3890915262874757420
В заключение просьба тем, у кого есть другие красивые примеры применения XOR, не вошедшие в статью, рассказать о них.
Введение в основы современных шифров с симметричным ключом
Исключающее или
Свойства. Пять свойств операции ИСКЛЮЧАЮЩЕЕ ИЛИ в поле GF(2 n ) делают эту операцию очень удобной для использования в блочном шифре.
2. Ассоциативность. Это свойство позволяет нам использовать больше чем одно ИСКЛЮЧАЮЩЕЕ ИЛИ, которые можно вычислять в любом порядке.
3. Коммутативность. Это свойство позволяет нам менять местами операторы ( входную информацию ), не изменяя результат ( выходную информацию ).
Мы используем это свойство в шифре Файстеля, который рассмотрим позже в этой лекции.
5. Существование инверсии. В поле GF(2 n ) каждое слово есть аддитивная инверсия самого себя. Это подразумевает, что проведение операции ИСКЛЮЧАЮЩЕЕ ИЛИ слова с самим собой приводит к нулевому элементу:
Мы также используем это свойство в шифре Файстеля, который рассмотрим позже в этой лекции.
и
Мы также используем эти свойства позже в этой лекции, когда будем обсуждать безопасность некоторых шифров.
На рисунке 7.9 свойство аддитивной инверсии подразумевает, что
Циклический сдвиг
Циклическая операция сдвига смешивает биты в слове и помогает скрыть образцы в первоначальном слове. Хотя число позиций, на которые биты будут сдвинуты, может использоваться как ключ, циклическая операция сдвига обычно – без ключа; значение k устанавливается и задается заранее.
Обратимость. Циклическая операция левого сдвига – инверсия операции правого сдвига. Если одна из них используется для шифрования, другая может применяться для дешифрования.
Свойства. Операция циклического сдвига имеет два свойства, которые нам надо знать.
Замена
Операция замены — специальный случай операции циклического сдвига, где k = n/2 означает, что эта операция возможна, только если n — четный номер. Поскольку сдвиг влево n/2 — то же самое, что сдвиг n/2 вправо, эта операция является обратимой. Операция замены для шифрования может быть полностью раскрыта операцией замены для дешифрации. Рисунок 7.11 иллюстрируетт операцию замены для слова на 8 битов.
Разбиение и объединение
Введение в основы современных шифров с симметричным ключом
Исключающее или
Свойства. Пять свойств операции ИСКЛЮЧАЮЩЕЕ ИЛИ в поле GF(2 n ) делают эту операцию очень удобной для использования в блочном шифре.
2. Ассоциативность. Это свойство позволяет нам использовать больше чем одно ИСКЛЮЧАЮЩЕЕ ИЛИ, которые можно вычислять в любом порядке.
3. Коммутативность. Это свойство позволяет нам менять местами операторы ( входную информацию ), не изменяя результат ( выходную информацию ).
Мы используем это свойство в шифре Файстеля, который рассмотрим позже в этой лекции.
5. Существование инверсии. В поле GF(2 n ) каждое слово есть аддитивная инверсия самого себя. Это подразумевает, что проведение операции ИСКЛЮЧАЮЩЕЕ ИЛИ слова с самим собой приводит к нулевому элементу:
Мы также используем это свойство в шифре Файстеля, который рассмотрим позже в этой лекции.
и
Мы также используем эти свойства позже в этой лекции, когда будем обсуждать безопасность некоторых шифров.
На рисунке 7.9 свойство аддитивной инверсии подразумевает, что
Циклический сдвиг
Циклическая операция сдвига смешивает биты в слове и помогает скрыть образцы в первоначальном слове. Хотя число позиций, на которые биты будут сдвинуты, может использоваться как ключ, циклическая операция сдвига обычно – без ключа; значение k устанавливается и задается заранее.
Обратимость. Циклическая операция левого сдвига – инверсия операции правого сдвига. Если одна из них используется для шифрования, другая может применяться для дешифрования.
Свойства. Операция циклического сдвига имеет два свойства, которые нам надо знать.
Замена
Операция замены — специальный случай операции циклического сдвига, где k = n/2 означает, что эта операция возможна, только если n — четный номер. Поскольку сдвиг влево n/2 — то же самое, что сдвиг n/2 вправо, эта операция является обратимой. Операция замены для шифрования может быть полностью раскрыта операцией замены для дешифрации. Рисунок 7.11 иллюстрируетт операцию замены для слова на 8 битов.
Разбиение и объединение
Шифрование с помощью логической операции исключающее или. Алгоритм XOR-шифрования. Слот обработчик для выполнения шифрации
Поточный шифр выполняет операции над битами или символами (например 8-, 16- или 32-битовыми). Поточный шифр преобразует один и тот же символ открытого текста в разные символы шифртекста, например в зависимости от того, сколько и каких символов было обработано ранее.
Xor-шифрование
Во многих поточных шифрах зашифровывание производится следующим образом. Генератор псевдослучайных чисел выдает последовательность битов (гамму). Эта гамма накладывается на открытый текст с помощью побитовой операции XOR. В результате получается шифртекст. Для расшифровывания необходимо выполнить в точности ту же процедуру, только наложить гамму, полученную с использованием идентичного генератора с точно таким же начальным состоянием, на шифртекст.
Он восприимчив к шаблонам, но эту слабость можно избежать, предварительно сжимая файл. Исключительное или шифрование требует, чтобы шифровальщик и дешифратор имели доступ к ключу шифрования, но алгоритм шифрования, хотя и чрезвычайно простой, почти не поддается разрушению.
Базовые понятия шифрования
Если у вас нет ключа, невозможно его расшифровать без создания случайных ключей и попыток каждого из них до тех пор, пока вывод программы расшифровки не станет чем-то вроде читаемого текста. Чем дольше вы делаете ключ шифрования, тем сложнее его сломать.
Рассмотрим идею этого наипростейшего метода. Как известно из булевой алгебры, операция логического сложения «⊕» по модулю 2 (или логического исключающего ИЛИ – XOR, eXclusive OR) имеет следующую семантику:
Таблица истинности для XOR:
Выход будет эквивалентом полностью случайной программы, так как ключ генерируется случайным образом. Когда второй человек имеет доступ к ключу, этот человек может расшифровать файлы, но без него дешифрование практически невозможно. Для каждого бита, добавленного к длине ключа, вы удваиваете количество попыток, необходимых для разрыва шифрования с помощью грубой силы.
Слот обработчик для выполнения шифрации
Теперь что мы будем делать, если ключ меньше ввода? Это имеет место в большинстве ситуаций. Если ключ был такой же длины, как и вход, это было бы неинтересно, потому что вам также нужно было бы передать ключ тому человеку, которого вы хотите прочитать на входе. Напротив, когда ключ и вход имеют одинаковую длину, невозможно, чтобы кто-то взломал шифр. Так что, когда ключ меньше ввода, вы просто повторно применяете его, пока не дойдете до конца ввода.
Вы можете видеть, что мы просто повторяем ключ. Чем меньше ключ, тем проще будет взломать ваш шифр. Неудивительно, что вредоносное ПО пытается скрыть использование множества методов, которые легко реализовать. Как видно из приведенной выше таблицы, входные значения должны отличаться для того, чтобы результат был истинным. Если они совпадают, результат будет ложным.
Байт равен 8 битам, а шестнадцатеричное число равно 4 битам, поэтому два шестнадцатеричных числа равны байту. Теперь, если вы смотрите на диаграмму и сбиты с толку по всем номерам, вам может понадобиться раскручиваться в разных системах нумерации. Цифры, соответствующие этим значениям, на самом деле имеют одинаковое число, только что представленное по-разному.
Ну, по сравнению с криптографией, побитовые операции и вращения намного проще реализовать во время программирования. Эти обфускационные образцы были найдены в дикой природе и все они были идентифицированы как некоторая форма вредоносного ПО. Одним умением, которое полезно при попытке расшифровать файл, является распознавание образов. Каков шаблон, который вы видите на изображении выше? В некоторых случаях, зная, какой байт должен быть в его де-зафузированной форме, может быть разница в нахождении надежного шаблона или нет.
В свете последних рассуждений приходим к мысли, что напрямую кодировать простой текст нельзя. Во-первых, число, представляющее пробел, будет по-прежнему разделять слова и в шифротексте. Выделив это часто встречающееся одно и то же число, пользователь догадается, что это закодированный пробел. Во-вторых, короткие часто встречающиеся предлоги и союзы также помогут взломщику в определении ключа. Поэтому самым эффективным способом является использование длинного ключа, покрывающего несколько букв, а лучше равного по длине самому сообщению. Так, если мы кодируем достаточно длинное сообщение (не менее 5-10 предложений) с помощью случайного ключа такой же длины, то такое сообщение очень сложно расшифровать. Еще более высоких результатов по надежности можно достичь, если перед шифрованием произвести, например, сжатие текста каким-либо архиватором. Плюс к тому же, если сообщение имеет малую длину, можно добавить в начало и конец сообщения случайные последовательности символов.
Сценарий 2. Этот следующий сценарий будет немного сложнее первого. В отличие от большинства веб-эксплойтов, этот файл записывался на диск в зашифрованном виде. Когда мы впервые посмотрим, мы сразу увидим, что это не что-то похожее на первый пример. Каждый байт запутан, и здесь нет очевидных шаблонов.
Таким образом, стойкость алгоритма зависит исключительно от характеристик гаммы, выдаваемой генератором. Если гамма состоит из одних нулей (вырожденный случай), то данные при шифровании вообще не изменяются. Если гамма имеет короткий период (например 32 бита), то шифрование сводится к операции XOR с 32-битовой константой. Если же гамма представляет собой случайный набор битов, не подчиняющийся никакой закономерности, получается аналог одноразового шифровального блокнота, который обеспечивает абсолютную защиту. Разумеется, детерминированный алгоритм, используемый в генераторе гаммы, не может выдавать истинно случайную последовательность. Если последовательность не удастся повторить, то не удастся и расшифровать сообщение.
Как видно из изображения, эта картина встречается много раз. Теперь нам просто нужно написать скрипт и использовать наш 128-байтовый шаблон для декодирования нашего файла. Этот образец был немного более сложным, но все же не слишком сложным. Наш последний образец будет самым жестким до сих пор, так что давайте продолжим и посмотрим, что ждет.
Сценарий 3: для последнего сценария у нас есть нечто более уникальное, чем наши предыдущие образцы. Помните, полезно знать, какие значения должны быть дефисами. Вот что мне удалось выяснить после небольшой работы. Используя этот шаблон и немного проб и ошибок, мне удалось заполнить остальную часть таблицы и успешно де-обфускать файл другим скриптом.
Если два сообщения были зашифрованы с использованием одной и той же гаммы и для одного из сообщений (более длинного) удалось каким-нибудь образом получить открытый текст, то легко получить открытый текст и для другого сообщения. Применив операцию XOR К открытому тексту и шифртексту первого сообщения, мы получим фрагмент гаммы. А наложив гамму на шифртекст второго сообщения, мы получим его открытый текст. Именно поэтому нельзя допускать, чтобы одна и та же гамма использовалась при шифровании двух разных потоков или сообщений.
Но многие стандарты медиа-контейнеров и программное обеспечение для воспроизведения достаточно сложны, чтобы пропускать поврежденные блоки или восстанавливать недостающую информацию, анализируя остальную часть данных. Программное обеспечение безопасности для мобильных телефонов продолжает оставаться.
Если гамма генерируется независимо от содержимого сообщения, то такой потоковый алгоритм называется синхронным. Как правило, в синхронных потоковых шифрах ключ шифрования используется для установки начального внутреннего состояния генератора гаммы.
Базовые понятия шифрования
Операция повторяется со вторым битом открытого текста и вторым битом ключа. В конце ключа опустите назад к первому биту. Симметричное шифрование использует один и тот же ключ для шифрования и дешифрования данных. Недостатком этого шифрования является то, что ключ должен оставаться секретным, и необходимо обеспечить, чтобы получатель зашифрованных данных или сообщений получал ключ безопасно и тайно, чтобы снова расшифровать данные.
Ключ становится во много раз более безопасным, так как длина ключа увеличивается. 192-битный ключ имеет около 18 триллионов опций, чем 128-битный ключ. Симметричные методы включают в себя, для. Разница между асимметричным и симметричным шифрованием заключается в том, что для шифрования и дешифрования используются Асимметричные 2 разных ключа. Создается пара ключей, которая имеет общую математическую основу. Несмотря на математическую основу, никакой ключ не может быть получен из другого. Таким образом, ключ к шифрованию может свободно распространяться и даже публиковаться в каталогах или серверах.
Говорит также открытый ключ. Ключом к расшифровке данных является закрытый ключ, который остается под опекой получателя и в основном защищен снова. Недостатком этого метода является то, что он намного медленнее, чем симметричное шифрование, и из-за математической зависимости требуются даже более высокие длины ключей.
Асимметричные методы включают в себя, для. Этот метод сочетает в себе как вышеупомянутые преимущества, так и скорость и безопасность. Шифрование фактических данных выполняется с помощью симметричного шифрования. Однако для каждой передачи данных создается новый ключ, который передается получателю с помощью асимметричного шифрования. Поскольку этот ключ является лишь очень малой длиной ключа, недостаток медленного асимметричного шифрования устраняется.
Шифры подразделяются на теоретически не дешифруемые и практически не дешифруемые, а по структуре ключей на симметричные и асимметричные в зависимости от того, совпадает ли ключ зашифрования с ключом расшифрования. Симметричные шифры в свою очередь подразделяются на блочные и потоковые.
Блокированное шифрование является одним из двух способов шифрования данных. В отличие от шифрования потока, при блочном шифровании данные открытого текста делятся на фиксированные блоки и «зашифровываются» вместе. Например, с четким текстом из 20 символов строка делится на 5 равных блоков, которые затем зашифровываются независимо. Длина зашифрованных блоков может быть как фиксированной, так и переменной.
Как работает блочный шифр?
Как работает шифрование потоков
Здесь случайная последовательность генерируется из одноразового ключа. Это самый простой подход к шифрованию данных, он математически менее сложный, чем криптография с открытым ключом и используется в течение нескольких столетий. При изучении симметричных шифров часто используется следующая терминология.
В принципе, все блок-шифры могут быть записаны в виде «битовой резки», но операции, такие как сложение и умножение, могут стать очень медленными. С другой стороны, перестановки почти бесплатны, так что им нужно снова называть записи, и это можно сделать на уровне кода. Это делает его особенно эффективным в современных архитектурах со многими записями.
Многие широко используемые шифры являются блочными шифрами. Блок-шифры преобразуют блок фиксированного размера данных в другой блок данных фиксированного размера с помощью функции, выбранной ключом. Если один и тот же блок дважды зашифровывается одним и тем же ключом, полученный зашифрованный текст также будет таким же. Эта информация может быть полезна для злоумышленника. Чтобы заставить идентичные плоские тексты быть зашифрованы для разных блочных шифров, обычно используются три стандартных режима.
Это шифрование очень просто: требуется бит-поток, содержащий сообщение в виде обычного текста, и поток случайных и секретных битов той же длины, что и обычный текст, который считается ключевым. Если ключ действительно случайный, можно доказать, что злоумышленник не может решить, что предположительно плоский текст является более точным, чем любой другой, когда доступен только зашифрованный текст, и нет информации об открытом тексте.
Практическая проблема заключается в том, что ключ не имеет небольшого и постоянного размера, но имеет тот же размер сообщения, и часть ключа никогда не должна использоваться дважды. Таким образом, мы переместили проблему обмена секретными данными на предмет обмена секретными случайными ключами одинаковой длины. Тем не менее, это шифрование, предположительно, широко используется с момента его изобретения и многое другое после теста безопасности Клода Шеннона. Хотя правда заключается в том, что безопасность этого шифрования была высказана ранее, именно Шеннон нашел, как доказать это формально.
Пожалуй, самым простым и примитивным алгоритмом шифрования является XOR-шифрование. Алгоритм XOR-шифрования может быть усложнен некоторыми методами, что может позволить достичь весьма неплохих результатов. Но в базовой реализации алгоритм крайне не стоек.
Алгоритм XOR-шифрования основан на применении бинарной логической операции исключающего или. В табличном представлении функция выглядит следующим образом:
На вход алгоритму подается исходный текст (в общем случае, любой набор байт, т.е. произвольный файл) и строка пароля.
Идея алгоритма заключается в том, что к каждому символу исходного текста и очередному символу строки пароля применяется побитовая логическая операция XOR. Результат записывается в файл.
Операция XOR обладает симметричностью. Это значит, что если зашифровать один и тот же файл 2 раза с одним и тем же паролем, то на выходе получим сам этот файл без изменений. Из этого факта становится ясно, что для шифрования и расшифровывания будет использоваться одна и та же функция, что существенно упрощает реализацию алгоритма. При этом, если при расшифровывании используется тот же пароль, что и при шифровании, то на выходе будет получен исходный файл. Если же пароли различаются, то на выходе будет получен файл, который будет содержать некорректные данные.
Рассмотрим алгоритм XOR-шифрования более подробно:
Если пароль короче исходного файла (а в подавляющем большинстве случаев так и будет), то пароль используется циклически, т.е. после последнего символа пароля вновь переходим к первому.
Необходимо реализовать процедуру:
procedure XOR_CoDec (const SourceFile, DestFile, Password: string);
Введение в основы современных шифров с симметричным ключом
Исключающее или
Свойства. Пять свойств операции ИСКЛЮЧАЮЩЕЕ ИЛИ в поле GF(2 n ) делают эту операцию очень удобной для использования в блочном шифре.
2. Ассоциативность. Это свойство позволяет нам использовать больше чем одно ИСКЛЮЧАЮЩЕЕ ИЛИ, которые можно вычислять в любом порядке.
3. Коммутативность. Это свойство позволяет нам менять местами операторы ( входную информацию ), не изменяя результат ( выходную информацию ).
Мы используем это свойство в шифре Файстеля, который рассмотрим позже в этой лекции.
5. Существование инверсии. В поле GF(2 n ) каждое слово есть аддитивная инверсия самого себя. Это подразумевает, что проведение операции ИСКЛЮЧАЮЩЕЕ ИЛИ слова с самим собой приводит к нулевому элементу:
Мы также используем это свойство в шифре Файстеля, который рассмотрим позже в этой лекции.
и
Мы также используем эти свойства позже в этой лекции, когда будем обсуждать безопасность некоторых шифров.
На рисунке 7.9 свойство аддитивной инверсии подразумевает, что
Циклический сдвиг
Циклическая операция сдвига смешивает биты в слове и помогает скрыть образцы в первоначальном слове. Хотя число позиций, на которые биты будут сдвинуты, может использоваться как ключ, циклическая операция сдвига обычно – без ключа; значение k устанавливается и задается заранее.
Обратимость. Циклическая операция левого сдвига – инверсия операции правого сдвига. Если одна из них используется для шифрования, другая может применяться для дешифрования.
Свойства. Операция циклического сдвига имеет два свойства, которые нам надо знать.
Замена
Операция замены — специальный случай операции циклического сдвига, где k = n/2 означает, что эта операция возможна, только если n — четный номер. Поскольку сдвиг влево n/2 — то же самое, что сдвиг n/2 вправо, эта операция является обратимой. Операция замены для шифрования может быть полностью раскрыта операцией замены для дешифрации. Рисунок 7.11 иллюстрируетт операцию замены для слова на 8 битов.