#️⃣ Геш-функції — лавинний ефект та колізії
Дослідіть, що робить криптогеш надійним: змініть один вхідний біт і спостерігайте, як ~половина вихідних бітів змінюється (лавинний ефект), та як парадокс днів народження робить колізії ймовірнішими за інтуїцію.
Про цю симуляцію
Ця симуляція демонструє дві основні властивості криптографічного геша за допомогою невеликого, швидкого геша FNV-1a (некриптографічний алгоритм змішування, названий на честь Фаулера, Нолла та Во), завершеного кроком xorshift, що дає 32-бітний дайджест (відбиток вхідних даних фіксованої довжини). У режимі Лавина ваш текст гешується наживо та зображується у вигляді бітової сітки; зміна одного вхідного біта перераховує геш і підсвічує кожен вихідний біт, що змінився — це лавинний ефект. У режимі Дні народження випадкові зразки гешуються у b-бітний простір із B = 2b кошиків і перевіряються на колізії, а графік показує спостережувану частоту колізій порівняно з теоретичною межею днів народження 1 − e−n²/2B.
🔬 Що це показує
32-бітний геш, зображений як сітка 4×8 клітинок 0/1 у режимі Лавина, де будь-який біт, що змінився між входом A та входом B, виділено червоним; а для режиму Дні народження — графік у реальному часі ймовірності колізії проти кількості взятих зразків, що порівнює бурштинову теоретичну криву зі зеленою спостережуваною точкою даних.
🎮 Як використовувати
Перемикайтеся між режимами Лавина та Дні народження двома кнопками режимів. У режимі Лавина введіть будь-який текст у поле вводу та натисніть «Flip one bit», щоб змінити один випадковий символ на один біт, або «Reset», щоб повернутися до «hello world». У режимі Дні народження перетягніть повзунок «Hash bits b» (4–16), щоб змінити розмір простору кошиків, та «Samples drawn» (1–120), щоб змінити кількість гешованих значень за спробу, потім натисніть «Run 1 trial» або «Run 200 trials», щоб накопичити спостережувану частоту колізій.
💡 Чи знали ви?
Саме через межу днів народження реальним геш-функціям потрібна приблизно вдвічі більша довжина в бітах порівняно з бажаним рівнем безпеки: SHA-256 дає 256-бітний дайджест, але оскільки колізії стають ймовірними вже приблизно після √B спроб, його фактична стійкість до колізій ближча до 128 бітів — той самий ефект квадратного кореня, який повзунок цієї симуляції дозволяє побачити напряму.
Поширені запитання
Який алгоритм обчислює геш у цій симуляції?
Вона використовує FNV-1a, швидкий некриптографічний геш: він починається з фіксованої базової величини зсуву, а потім для кожного вхідного символу виконує XOR поточного значення з кодом символу та множить на фіксоване просте число (0x01000193). Результат потім проходить через завершальний крок xorshift (три операції XOR-зсуву), щоб ретельніше перемішати біти, даючи 32-бітний результат. Це не SHA-256, але він все одно демонструє ту саму поведінку лавинного ефекту та колізій, навколо якої побудовані справжні криптографічні геші.
Чому зміна одного біта змінює так багато вихідних бітів?
Через те, як ланцюжок множення й XOR у FNV-1a перемішує кожен вхідний байт на кожному наступному кроці, а також через те, що завершальний xorshift поширює будь-яку однобітову різницю по всьому 32-бітному слову, зміна одного вхідного біта в середньому призводить до зміни приблизно половини з 32 вихідних бітів. Ця властивість і є лавинним ефектом, і саме її показують вам, біт за бітом, червоні підсвічені клітинки в режимі Лавина.
Що контролюють повзунки «Hash bits» та «Samples drawn» у режимі Дні народження?
«Hash bits b» задає ширину геш-простору: при b бітах існує B = 2b можливих вихідних кошиків (від 16 кошиків при b=4 до 65 536 при b=16). «Samples drawn» задає, скільки випадкових значень гешується в цей простір за одну спробу, перш ніж симуляція перевіряє, чи потрапили якісь два значення в один і той самий кошик. Обидва повзунки скидають накопичену статистику спроб, тож спостережувана частота завжди відповідає поточним налаштуванням.
Чому спостережувана частота колізій не збігається точно з передбаченою кривою?
Бурштинова крива показує замкнену формулу межі днів народження 1 − e−n²/2B, наближення, точне лише в границі великої кількості спроб. Зелена точка — це справжнє емпіричне середнє за фактично виконаною кількістю спроб (показано як «Trials run» на панелі статистики); маючи лише кілька спроб, через випадковість спостережувана частка може помітно відхилятися вище або нижче теоретичної лінії. Натискайте «Run 200 trials» повторно, щоб зменшити цю різницю.
Чи достатньо безпечна геш-функція цієї симуляції для реальної криптографії?
Ні — FNV-1a із завершальним xorshift швидка і демонструє правильну статистичну поведінку для навчання, але їй бракує криптографічної конструкції (фіксованих раундів, розкладу ключів, доведених меж дифузії), яка робить такі функції, як SHA-256, стійкими до навмисних атак. Реальні системи мають використовувати перевірений криптографічний геш; ця симуляція лише запозичує ті самі дві властивості — лавинний ефект і межу днів народження — щоб зробити їх наочними та інтерактивними.