Ви, мабуть, бачили хеш-рядок або значення контрольної суми під час оновлення програмного забезпечення або завантаження файлу. Це виглядає як випадковий шум – довгий рядок шістнадцяткових цифр або коротке число, прикріплене до файлу. Але він виконує життєво важливу функцію. Це цифровий відбиток. Якщо хоча б один біт даних зміниться, цей відбиток повністю зміниться. Цей механізм гарантує, що ви завантажили саме той файл, який було надіслано, аж до останнього байта.
Двома найбільш поширеними способами досягнення цієї мети є контрольні суми (Checksums) та циклічні надлишкові коди (CRC). Хоча вони звучать схоже, вони засновані на різних принципах і служать трохи різним нішам у світі мережевих протоколів і зберігання даних. Розуміння різниці між ними є важливим для всіх, хто має справу з передачею файлів, мережевим трафіком або діагностикою обладнання.
Проста контрольна сума
У основі контрольна сума — це значення, отримане з блоку цифрових даних. Найбільш базова версія — це контрольна сума Інтернету (Internet Checksum), яка використовується у більш старих протоколах, таких як IPv4 та UDP. Вона працює шляхом обробки даних як послідовності 16-бітових слів та їх складання. Якщо кількість байтів непарна, додається байт заповнення (Padding). Потім сума інвертується за одиницями (one’s complement).
Цей метод дуже швидкий. Дуже швидкий. Але він не відрізняється особливою надійністю. Він може пропускати певні типи помилок. Наприклад, якщо два байти поміняються місцями або якщо інверсія біта в одній позиції компенсується інверсією біта в іншій, контрольна сума може залишитися незмінною. Це схоже на перевірку ваги валізи, але ігнорування її вмісту. Ви знаєте, що вага правильна, але не знаєте, чи залишилася там сорочка або вона була замінена каменем тієї ж ваги.
Через ці обмеження прості контрольні суми сьогодні рідко використовуються для критичних перевірок цілісності. В основному вони були замінені на більш надійні алгоритми, такі як CRC або криптографічні хеші, такі як SHA-256. Однак розуміння простої контрольної суми допомагає пояснити, чому нам потрібні найкращі інструменти для перевірки цілісності даних.
З’являється циклічний надлишковий код (CRC)
Тут цікаво. CRC заснований на поліноміальному розподілі. Замість простого додавання чисел CRC обробляє дані як велике двійкове число і ділить його на заздалегідь визначений що породжує поліном. Залишок від цього поділу є значення CRC.
Цей математичний підхід робить набагато більш ефективним для виявлення помилок. Він може виявляти всі поодинокі бітові помилки, всі помилки з двома інверсіями бітів та будь-яку непарну кількість помилок. Він також виявляє пакетні помилки (burst errors) – послідовні біти, які пошкоджені, – які часто зустрічаються у зашумлених каналах передачі. Уявіть пакетні помилки як тимчасовий збій у радіосигналі або подряпину на CD. CRC розроблено для обробки цих реальних недосконалостей.
Найбільш поширеним варіантом є CRC-32, який генерує 32-бітове значення. Ви зустрінете його всюди. Кадри Ethernet, ZIP-архіви, PNG-зображення і навіть деякі системи баз даних використовують CRC-32. Він не є криптографічно стійким – ви не можете використовувати його, щоб довести, що хтось не навмисно підробив ваші дані, але він відмінно підходить для виявлення випадкових пошкоджень.
Чому це важливо для вас?
Ви, можливо, не думаєте про CRC, коли дивитеся відео зі стримінгу або надсилаєте електронного листа. Але він працює у фоновому режимі. Коли ви завантажуєте патч для гри, ваша система використовує контрольні суми або CRC для перевірки файлів. Якщо значення не збігаються


























