Алгоритм DES
Уроки програмування, алгоритми, статті, вихідники, приклади програм та корисні поради
Алгоритм DES
Поговоримо знову про шифрування. На цей раз розглянемо алгоритм DES. DES – алгоритм блокового шифрування на основі мережі Фейстеля, яка проходить 16 разів. DES може використовуватись у кількох режимах; ми розглянемо режим "електронної кодової книги" - ECB (electronic code book). Розробку будемо вести мовою програмування C#.
Алгоритм DES. Опис
DES – блоковий алгоритм, тобто при шифруванні вихідне повідомлення перетворюється на двійковий код, а потім розбивається на блоки і кожен блок окремо зашифровується (розшифровується). За стандартом (прийнятий у 1977 році) розмір блоку DES дорівнює 64 біти, тобто використовуючи 8-ми бітове кодування ASCII, що застосовується в ті часи, отримаємо в одному блоці – 8 символів.
Тепер же в основному використовується 16-бітове кодування Юнікоду (UTF-16), тому, щоб зберегти довжину блоку рівну 8-ми символам, збільшимо розмір блоку DES до 128 біт.
Алгоритм DES. Кроки
Отже, для того щоб зашифрувати повідомлення алгоритмом DES, необхідно виконати наступну послідовність кроків:
- довести вихідне повідомлення до такого розміру (у бітах), щоб воно ділилося на розмір блоку (sizeOfBlock = 128 біт);
- поділити вихідне повідомлення на блоки;
- довести довжину ключа до половини блоку;
- перевести ключ у бінарний формат (у нулі та одиниці);
- провести над кожним блоком пряме перетворення мережею Фейстеля на протязі 16 раундів. Після кожного раунду необхідно виконувати циклічне зрушення ключа на задану кількість символів;
- з'єднати всі блоки разом; таким чином отримаємо повідомлення,зашифроване алгоритмом DES.
Розшифровка DES здійснюється за аналогією. Використовується зворотне перетворення мережею Фейстеля.
Алгоритм DES. Мережа Фейстеля
Мережа Фейстеля використовується в алгоритмі DES для зашифрування (пряме перетворення мережею) та розшифрування (зворотне перетворення). Ці перетворення зображені на рисунках 1 та 2 відповідно.

Малюнок 1. Пряме перетворення мережею Фейстеля

Рисунок 2. Зворотне перетворення мережею Фейстеля
Щоб вам було зрозуміліше, розгляньмо один раунд прямого перетворення мережею Фейстеля.
На i-й ітерації вихідний блок ділиться навпіл - ліва частина позначається L, права R. Над R і ключем ki обчислюється якась обрана логічна функція f (ми будемо використовувати XOR). Потім виконується обчислення логічної операції "виключає або" над L і раніше обчисленим значенням функції (L xor f). Старе значення R переноситься у ліву частину блоку, а праву частину заноситься значення L xor f. І остання операція раунду – потрібно виконати циклічне зрушення ключа: keyi+1 = keyi >> shiftKey (при розшифровці keyi-1 = keyi lengthKey )