Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет_END.doc
Скачиваний:
6
Добавлен:
24.09.2019
Размер:
173.06 Кб
Скачать

Алгоритмы, основанные на операции «исключающее или» (xor).

Побитовая операция XOR (в Си обозначается знаком ^), как известно, дает следующий результат:

– 0^0 = 1^1 = 0

– 0^1 = 1^0 = 1

Замечательное свойство операции XOR:

,

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

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

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

– каждый символ заменяем на .

Алгоритм дешифрования:

– каждый символ заменяем на .

Как видим, алгоритмы шифрования и дешифрования совпадают.

Поскольку ключ состоит лишь из единственного символа, то его очень просто подобрать. Более того, даже если взять ключ из N символов и последовательно применять их к каждому символу текста:

Это будет эквивалентно применению 1 операции :

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

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

Например, имея ключ длиной 10 символов, каждый десятый символ текста шифруем первым символом ключа, следующий каждый десятый символ текста – вторым символом ключа и т.д.

Покажем данный алгоритм на примере. Пусть ключом является слово «ключ» и необходимо зашифровать фразу «Мама мыла раму.»:

XOR

М

а

м

а

м

ы

л

а

р

а

м

у

.

к

л

ю

ч

к

л

ю

ч

к

л

ю

ч

к

л

ю

Результат:

&

К

0x0D

0x0A

Л

Р

Реализация данного алгоритма на языке Си довольно проста:

char* xorcode(const char *s, const char *key)

{

int i;

int n = strlen(s);

int m = strlen(key);

char *result = strdup(s);

for(i = 0; i < n; ++i) result[i] ^= key[i % m];

return result;

}

Ключевым моментом, в котором и происходит шифрование, является операция:

result[i] ^= key[i % m];

При помощи которой исходный ый символ заменяется на него же, но «сксоренного» с ым символом ключа. Обратим внимание на применение операции взятия остатка от деления при вычислении номера символа в ключе. В нашем тестовом случае (длина ключа). Тогда операция i%4 будет выдавать результат:

0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, ...

Что собственно и необходимо. Т.е. с помощью остатка от деления мы циклически проходим по ключу.

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