350 Алгоритми та структури даних

Конспекти лекцій та Лабораторні роботи з дисципліни "Алгоритми та структури даних" для III курсу спеціальності 121 "Інженерія програмного забезпечення" ОКР "Фаховий молодший бакалавр" Херсонського політехнічного фахового коледжу Державного університету "Одеська політехніка"

View the Project on GitHub solidol/nmk-asd

Перелік лекцій

Hash-функція

Розрізняють декілька способів ідентіфікації: контрольні суми, контроль CRC, хешування и цифровий підпис - Такі базові засоби аутентіфікації при ціфровій передачі Даних.

Контрольні суми - найбільш простий способ Перевірки цілісності Даних, что передаються в цифровому виде, при якому обчіслюється контрольна сума ПОВІДОМЛЕННЯ (певне значення, Пожалуйста и ідентіфікує цифрову інформацію).

Поняття хеш-функції

Хеш-функцією (hash function) називається математична чи інша функція, яка для рядка довільної довжини обчислює деяке ціле значення або деякий інший рядок фіксованої довжини. Математично це можна записати так:

h = H (M),

де М - вихідне повідомлення, зване іноді прообразом , а h - результат, званий значенням хеш-функції (а також хеш-кодом або дайджестом повідомлення).

Сенс хеш-функції полягає у визначенні характерного ознаки прообразу - значення хеш-функції. цезначення зазвичай має певний фіксований розмір, наприклад, 64 або 128біт. Хеш-код може бути в подальшому проаналізовано для вирішення будь-якої задачі. Так наприклад,хешування може застосовуватися для порівняння даних: якщо у двох масивів даних хеш-коди різні, масиви гарантовано розрізняються; якщо однакові - масиви, швидше за все, однакові. У загальному випадку однозначної відповідності між вихідними даними і хеш-кодом немає через те, що кількість значень хеш-функцій завжди менше, ніж варіантів вхідних даних. Отже, існує безліч вхідних повідомлень, що дають однакові хеш-коди (такі ситуації називаються колізіями). Імовірність виникнення колізій відіграє важливу роль в оцінці якості хеш-функцій.

Хеш-функції широко застосовуються в сучасній криптографії.

найпростіша хешфункція може бути складена з використаннямоперації “сума по модулю 2” в такий спосіб: отримуємо вхідні рядок, складаємо все байти по модулю 2 і байт -результат повертаємо в якості значення хеш-фукнции. Довжина значення хеш-функції складе в цьому випадку 8 біт незалежно від розміру вхідного повідомлення.

Наприклад, нехай вихідне повідомлення, перекладене в цифровий вигляд, було наступним (у шістнадцятковому форматі):

3E 54 A0 1F B4

Переведемо повідомлення в двійковий вигляд, запишемо байти один під одним і складемо біти в кожному стовпчику по модулю 2:

0011 1110
0101 0100
1010 0000
0001 1111
1101 0100
----------
0110 0101

Результат ( 0110 0101 (2) або 65 (16) ) і буде значенням хеш-функції.

Однак таку хеш-функцію можна використовувати для криптографічних цілей, наприклад для формування електронного підпису, так як досить легко змінити зміст підписаного повідомлення, не змінюючи значення контрольної суми.

Тому розглянута хеш функція не годиться для криптографічних застосувань. У криптографії хеш функція вважається хорошою, якщо важко створити два прообразу з однаковим значенням хеш-функції, а також, якщо у виходу функції немає явної залежності від входу.

Сформулюємо основні вимоги, що пред’являються до криптографічних хеш-функцій:

Колізії хеш-функції

Створити хеш-функцію, яка задовольняє всім перерахованим вимогам - завдання непросте. Необхідно також пам’ятати, що на вхід функції надходять дані довільного розміру, а хеш-результат не повинен виходити однаковим для даних різного розміру.

В даний час на практиці в якості хеш-функцій застосовуються функції, що обробляють вхідний повідомлення блок за блоком і обчислюють хеш значення h i для кожного блоку M i вхідного повідомлення по залежностям виду

h i = H (M i , h i-1 ),

де h i-1 - результат, отриманий при обчисленні хеш-функції для попереднього блоку вхідних даних.

В результаті вихід хеш-функції h n є функцією від всіх n блоків вхідного повідомлення.

Розробка хеш-функцій, что задовольняють всім вимоги, - складне завдання. Практично відповідають ЦІМ вимоги хеш-функції з групи алгоритмів MD и SHA.

Алгоритм Рік створення Роки популярності Автор/Компанія Основне призначення Довжина хешу (біти) Приклад хешу Особливості
CRC 1961 1960–1990 W. Wesley Peterson Цілісність даних 16–32 4C1D (CRC-16), FEE8A6E1 (CRC-32) Перевірка помилок у передачі даних.
Adler-32 1975 1980–2000 Марк Адлер Цілісність даних 32 1E60382E Швидший за CRC-32, але менш надійний.
MD2 1989 1990–2000 Рон Рівест, MIT Хешування паролів 128 8350E5A3E24C153DF2275C9F80692773 Перший алгоритм серії MD, призначений для 8-бітних систем.
GOST R 34.11-89 1989 1990–2010 Радянський Союз Криптографія 256 981E5F3CA125DA3995204D46D1C5F60B7C725A284CCFE19E99DB48B5F59AB1B8 Стандартний у Росії, стійкий до певних атак.
MD4 1990 1990–1995 Рон Рівест, MIT Хешування файлів 128 A4D55A8D778E5022FAB701977C5D840BBC486D0F Попередник MD5, використовується для перевірки цілісності файлів.
MD5 1991 1995–2005 Рон Рівест, MIT Хешування файлів 128 5D41402ABC4B2A76B9719D911017C592 Швидкий, але небезпечний через колізії.
FNV 1991 2000–дотепер Гленн Фаулер, Landon Curt Noll, К. Vo Хешування текстів 32–64 E150687C (FNV-1a 32-bit), AF63BD4C8601B7BE (FNV-1a 64-bit) Простий і ефективний.
SHA-0 1993 1993–1995 NIST Криптографія 160 F96CEA198AD1DD5617AC084A3D92C6107708C0EF Перший алгоритм серії SHA, швидко замінений через вразливість.
Snefru 1993 1993–2000 Ральф Меркле Криптографія 128–256 F45D7F1D2D1F0517CB4BBAF3536B9994 (Snefru-128) Один із перших криптографічних хешів.
SHA-1 1993 2000–2010 NIST Криптографія 160 DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 Вразливий до атак, замінений SHA-2.
Haval 1993 1995–2005 Yuliang Zheng et al. Хешування файлів 128–256 C68F39913F901F3DDFF118940094A5CC (Haval-128) Багаторівневий алгоритм з варіантами довжини хеша.
Tiger 1995 1995–2005 Росс Андерсон, Eli Biham Хешування файлів 192 6D12E66614D2DBB29770972E3370C1E9E51A527DC216F7E6 Призначений для 64-бітних платформ.
RIPEMD 1996 1996–2005 COSIC, KU Leuven Криптографія 128–160 3F45EF194732C2DBB2C4A2C769795FA3 (RIPEMD-128) Використовується як альтернатива MD5 і SHA-1.
bcrypt 1999 2005–дотепер Niels Provos, David Mazieres Хешування паролів 192 2410D58F1EEACD04C7F1CC9D2D2CC027 Створений спеціально для зберігання паролів. Підтримує вбудовану “сіль”.
SHA-256 2001 2010–дотепер NSA/NIST Криптографія, хешування файлів 256 E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 Стандарт для цілісності файлів та криптографічної стійкості.
scrypt 2009 2010–дотепер Colin Percival Хешування паролів Змінна 7023D28F3E885E00... Висока стійкість до атак через оптимізоване використання пам’яті.
Blake2 2012 2015–дотепер Jean-Philippe Aumasson et al. Хешування файлів, паролів 256 BA80A53F981C4D0D6A2797B9B8AB60F6A0D79067C5B5BE06E4C23FD536F53E5C Поліпшення Blake, використовується для сучасних систем.
Blake3 2020 2020–дотепер Samuel Neves et al. Хешування файлів 256 AF1349B9A3E05FAD2D... Сучасний алгоритм для хешування файлів, багатопотоковий.

Теми для самостійного вивчення

  1. Принципи роботи алгоритмів групи CRC
  2. Принципи роботи алгоритмів групи MD
  3. Принципи роботи алгоритмів групи SHA
  4. Недоліки алгоритмів групи MD

Контрольні питання

  1. Що таке хеш-функція?
  2. Яке призначення хеш-функцій?
  3. Які алгоритми хешування ви знаєте?
  4. В чому головна відмінність процесів хешування та шифрування?