Алгоритм шифрования DES
DES – блочный алгоритм, то есть при шифровании исходное сообщение переводится в двоичный код, а затем разбивается на блоки и каждый блок отдельно зашифровывается (расшифровывается). По стандарту (принят в 1977 году) размер блока DES равен 64 бита, то есть используя 8-ми битовую кодировку ASCII, применяемую в те времена, получим в одном блоке – 8 символов.
Теперь же в основном используется 16-ти битная кодировка Юникода (UTF-16), поэтому, чтобы сохранить длину блока равную 8-ми символам, увеличим размер блока DES до 128 бит.
Итак, для того, чтобы зашифровать сообщение алгоритмом DES, необходимо выполнить следующую последовательность шагов:
довести исходное сообщение до такого размера (в битах), чтобы оно нацело делилось на размер блока (sizeOfBlock = 128 бит);
разделить исходное сообщение на блоки;
довести длину ключа до длины половины блока;
перевести ключ в бинарный формат (в нули и единицы);
провести над каждым блоком прямое преобразование сетью Фейстеля в течении 16-ти раундов. После каждого раунда необходимо выполнять циклический сдвиг ключа на заданное количество символов;
соединить все блоки вместе; таким образом получим сообщение, зашифрованное алгоритмом DES.
shiftKey (при расшифровке key i-1 = key i Прямое преобразование сетью Фейстеля " width="640"
Алгоритм DES
Чтобы вам было понятнее, давайте рассмотрим один раунд прямого преобразования сетью Фейстеля.
На i-й итерации исходный блок делится пополам – левая часть обозначается L, правая R. Над R и ключом k i вычисляется какая-либо выбранная логическая функция f (мы будем использовать XOR). Затем выполняется вычисление логической операции “исключающее или” над L и вычисленным ранее значением функции (L xor f). Старое значение R переносится в левую часть блока, а в правую часть заносится значение L xor f. И последняя операция раунда – нужно выполнить циклический сдвиг ключа: key i+1 = key i shiftKey (при расшифровке key i-1 = key i
Прямое преобразование сетью Фейстеля
Алгоритм DES
Обратное преобразование сетью Фейстеля
Форма приложения шифрования
textBoxEncodeKeyWord
textBoxDecodeKeyWord
buttonEncrypt
buttonDecipher
private const int sizeOfBlock = 128; //в DES размер блока 64 бит, но поскольку в unicode символ в два раза длинее, то увеличим блок тоже в два раза
private const int sizeOfChar = 16; //размер одного символа (in Unicode 16 bit)
private const int shiftKey = 2; //сдвиг ключа
private const int quantityOfRounds = 16; //количество раундов
string[] Blocks; //сами блоки в двоичном формате
in.txt
out1.txt
out2.txt

Реализация алгоритма DES на C# (467.74 KB)

