Купить дедик, RDP, сервер

Авторская статья Шифр XOR

F

FRANKENSTEIN

Обзор

Что Такое Шифр 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 (сгенерированную с www.random.org ). Теперь мы 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] Поскольку мы используем статистику, для работы этого подхода необходима большая выборка.
 

iw9asd92

Новичок
Регистрация
25 Июн 2021
Сообщения
1
Реакции
0
Депозит
0 BTC
Xor decoder in javascript.zip
 

Вложения

  • xordecoder.html.zip
    1.9 KB · Просмотры: 2