Авторская статья Шифр XOR | DedicateT.com

Регистрация
18.12.2017
Сообщения
411
Симпатии
173
Баллы
106
#1
Обзор

Что Такое Шифр XOR ?

В криптографии простой шифр XOR является типом аддитивного шифра, алгоритма шифрования, который работает в соответствии с принципами:

A ⊕0 = A,

A ⊕ A = 0,

(A ⊕ B ) = C = A ⊕ (B ⊕ C),

(B ⊕ A) ⊕ A = B ⊕ 0 = B,

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

XOR-это логическая операция, произносится как исключительное или. Его можно использовать для того чтобы зашифровать сообщения просто и быстро.
Код:
#!/usr/bin/env python

from itertools import izip, cycle

def xor_crypt_string(data, key):
    return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(data, cycle(key)))

my_data = "Hello. This is a secret message! How fun."
my_key= "firefly"

# Do the actual encryption
encrypted = xor_crypt_string(my_data, key=my_key)

print encrypted
print '---->'

# This will obtain the original data from the encrypted
original = xor_crypt_string(encrypted, key=my_key)

print original
Выход :
Код:
.     BY2F
FRR
DF$IB
---->
Hello.  is a secret message! How fun.
Как ?

Как XOR Используется Для Шифрования ?

Упоминание " XOR " довольно часто встречается в криптографии. Это тот же XOR, что и побитовый оператор? Если да, то как он используется для шифрования большого объема данных, а не только целого числа? Разве вам не нужно, чтобы "пароль" был такой же длины, как данные, которые вы шифруете?

Да, это тот же XOR. Он используется в большинстве алгоритмов или просто для объединения потокового шифра и открытого текста.

Все это просто биты, даже текст. Слово "hello" находится в ASCII 01101000 01100101 01101100 01101100 01101111. Просто обычные биты, сгруппированные в 5 байт. Теперь вы можете зашифровать эту строку со случайной строкой 5 байт, как одноразовую площадку. Допустим, мы получили случайно сгенерированную строку 10001001 10000010 00001011 01001101 11101101 (сгенерированную с
У вас нет разрешения на просмотр ссылки! Войти или зарегистрироваться
). Теперь мы XOR обе строки, получая 11100001 11100111 01100111 00100001 10000010. Если вы никогда не будете повторно использовать или раскрывать ключ, никто не сможет взломать этот шифр. (Ну, я показал ключ, так что это больше не безопасно.)

Многие блочные шифры используют XOR. Возьмем AES: расширенный стандарт шифрования использует xor на одиночных байтах (некоторые другие алгоритмы используют блоки 16 или 32 бит; нет проблем с размерами, отличными от 8 бит). Круглый ключ будет закреплен с промежуточным результатом, а затем перестановлен и заменен. XOR также используется в ключевом расписании.

IDEA также использует XOR в качестве одной из трех своих основных функций: XOR, сложение и умножение.

XOR имеет (inter alias) эти преимущества при использовании для криптографии:

Очень быстро вычисляется, особенно в аппаратных средствах.
Не делая разницы между правым и левым местом. (Будучи коммутативным.)
Не имеет значения, сколько и в каком порядке значений XOR. (Будучи ассоциативным.)
Легко понять и проанализировать.

Конечно, некоторые из этих "преимуществ" могут быть недостатками, в зависимости от контекста. Быстрая скорость делает его возможным использовать XOR часто без огромных падений представления. Безопасность Threefish, другого блочного шифра, зависит от нелинейности поочередного использования сложения по модулю и XOR. Несмотря на использование 72 раундов (в качестве базы хеш-функции Skein), это все еще довольно быстро.

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

Как Зашифровать С Помощью XOR Шифра ?

Шифрование использует оператор XOR (Exclusive Or, symbol:⊕) с простым текстом и ключом в качестве операнда (который должен быть закодирован в двоичном формате).

Пусть простое сообщение 1001 и ключ 10

Один взять первый бит (0 или 1) простого текста и первый бит ключа и один умножить с XOR, чтобы получить зашифрованный бит.

1 ⊕ 1 = 0

Операция выполняется со вторым битом открытого текста и вторым битом ключа. Если мы доберемся до конца ключа, то заберем Первый БИТ.

0 ⊕ 0 = 0, puis 0 ⊕ 1 = 1 puis 1 ⊕ 0 = 1. Зашифрованное сообщение 0011.

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

Расшифровка Простого Шифрования XOR

В XOR расшифровка является точно такой же операцией, как и шифрование. Запустите зашифрованную строку через метод xor_encrypt снова тот же ключ), и у вас есть простой текст обратно.

Предупреждение 1: символы null


Одна вещь, чтобы следить за: если символ в строке соответствует соответствующему символу в ключе, ваш результат будет "\0". Это будет интерпретировано вашим текущим кодом как "конец строки" и остановит расшифровку. Чтобы обойти это, необходимо передать длину" фактической " строки в качестве параметра функции.

Предупреждение 2: короткие ключи


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

Вот полный пример, который показывает эти методы :
Код:
#include <stdio.h>
#include <string.h>

void xor_encrypt(char *key, char *string, int n)
{
    int i;
    int keyLength = strlen(key);
    for( i = 0 ; i < n ; i++ )
    {
        string[add letter "i" here, i removed the i to noparse]=string[add letter "i" here, i removed the i to noparse]^key[i%keyLength];
    }
}

int main(void) {
  char plain[] = "This is plain text";
  char key[] = "Abcdabcdabciabcdabcd";
  int n = strlen(plain);
  // encrypt:
  xor_encrypt(key, plain, n);
  printf("encrypted string: \n");
  for(int ii = 0; ii < n; ii++) {
    if(plain[ii] > 0x32 && plain[ii] < 0x7F ) printf("%c", plain[ii]);
   else printf(" 0x%02x ", plain[ii]);
  }
  printf("\n");
  // **** if you include this next line, things go wrong!
  n = strlen(plain);
  xor_encrypt(key, plain, n);
  printf("after round trip, plain string is '%s'\n", plain);
}
Это (не понимая проблему со строкой kay==) приводит к усеченной расшифровке (i в plain соответствует той же букве в ключе) :
Код:
encrypted string:
 0x15  0x0a  0x0a  0x17 A 0x0b  0x10 D 0x11  0x0e  0x02  0x00  0x0f B 0x17  0x01  0x19  0x16
after round trip, plain string  'This is pla'
Опуская строку выше (т. е. сохраняя значение n в качестве исходной длины строки), вы получаете :
Код:
encrypted string:
 0x15  0x0a  0x0a  0x17 A 0x0b  0x10 D 0x11  0x0e  0x02  0x00  0x0f B 0x17  0x01  0x19  0x16
after round trip, plain string  'This is plain text'
именно так, как вы и ожидали.

Как Взломать Шифр XOR С Помощью Повторяющегося Ключа ?

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

Вы можете попробовать некоторые общие слова и комбинации букв и искать места, где XORing слово с шифртекстом дает строку, похожую на английский (который был бы соответствующее слово или сочетание букв в другом тексте). Кроме того, зашифрованный текст, вероятно, будет иметь множество 0 значений, соответствующих местам, где оба сообщения имеют одну и ту же букву. Такие совпадения с большей вероятностью будут парой E или парой пространств, чем парой Q или X.

Сказав Все это, я не знаю, где вы можете найти инструмент, чтобы сделать это для вас, и если вы найдете его, он будет очень чувствителен к конкретной кодировке. Гораздо интереснее сделать это самому.

Как Решить Шифр XOR, Не Зная Ключа ?

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

[1] вы собираете различную статистику частоты букв и попарно статистику появления для языка.
[2] Попробуйте разные ключи и проверьте "качество" каждого декодированного текста на основе качества соответствия стандартной статистике.
[3] мы должны запустить некоторый алгоритм, который максимизирует качество этого декодированного текста. Одним из возможных кандидатов является генетический алгоритм
но возможны и многие другие.
[4] Поскольку мы используем статистику, для работы этого подхода необходима большая выборка.
 

Пользователи, которые просматривали тему (Всего: 0)

Тема долгое время не просматривалась.