Алгоритм 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 )