
- •«Мордовский государственный университет им. Н. П. Огарёва»
- •Курсовая работа Программа на языке с
- •«Мордовский государственный университет им. Н. П. Огарёва»
- •Задание на курсовую работу
- •4.6 Исходный код
- •4.7 Пример выполнения
- •4.8 Пример выполнения
- •Алгоритмы, основанные на операции «исключающее или» (xor).
- •Алгоритмы, основанные на алфавитных перестановках.
- •Постановка задачи
- •Описание алгоритма
- •Исходный код
- •Пример выполнения
Алгоритмы, основанные на операции «исключающее или» (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 используют случайные числа, различные сдвиги, зависимость шифрования последующих символов от предыдущих и т.д. Но в любом случае, подобные приемы не применимы на практике в современном мире из-за легкости их взлома. Тем не менее, они дают базовые знания о методах шифрования.