Пояснення · З прикладами розрахунків

Як працюють контрольні суми

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

Що таке контрольна сума

Контрольна сума (або контрольна цифра) — це навмисна надмірність. Коли число видається, одна або кілька його цифр не вибираються випадково: вони обчислюються з решти за фіксованим алгоритмом. Будь-хто, хто знає цей алгоритм, може пізніше перерахувати ці цифри та порівняти їх. Якщо вони збігаються, число є внутрішньо узгодженим. Якщо ні, щось було написано неправильно, прочитано неправильно або пошкоджено.

Це все, що обіцяє контрольна сума. Вона нічого не говорить про те, чи існує рахунок, хто ним володіє чи що на ньому зберігається — про це повторює кожен валідатор на цьому сайті, бо ці два поняття легко сплутати.

Розгорнутий приклад 1 — Luhn, алгоритм номерів карток

Алгоритм Luhn використовується Visa, Mastercard та більшістю інших платіжних карток. Візьмемо класичний приклад 7992 7398 713. Починаючи з правої крайньої цифри, подвойте кожну другу цифру; якщо результат подвоєння — двозначне число, додайте цифри цього числа разом. Потім підсумуйте все.

ЦифраПозиція з правого бокуПодвоєно?Вважається як
3Контрольна цифра3
1Друга з правого боку1 × 2 = 22
7Третя7
8Четверта8 × 2 = 16 → 1 + 67
9П'ята9
3Шоста3 × 2 = 66
7Сьома7
2Восьма2 × 2 = 44
9Дев'ята9
9Десята9 × 2 = 18 → 1 + 89
711-й7

Стовпець праворуч дає суму 3 + 2 + 7 + 7 + 9 + 6 + 7 + 4 + 9 + 9 + 7 = 70. Сімдесят ділиться на десять, отже число є дійсним. Змініть будь-яку цифру — і сума перестане бути кратною десяти. Спробуйте це на Валідатор кредитних карток — він виконує саме такі обчислення на вашому пристрої.

Наглядний приклад 2 — сума з вагами (ISBN-10)

Багато національних ідентифікаторів використовують суму з вагами: кожну цифру множать на фіксовану вагу, підсумовують та перевіряють остачу. Найнаочніший приклад — ISBN-10. Для 0-306-40615-2 ваги зменшуються від 10 до 1:

0×10 + 3×9 + 0×8 + 6×7 + 4×6 + 0×5 + 6×4 + 1×3 + 5×2 + 2×1 = 132

132 — це рівно 11 × 12, тож остача при діленні на 11 дорівнює нулю, і ISBN є дійсним. Бразильський CPF, польський PESEL та десятки інших ідентифікаторів мають той самий принцип із власними вагами та модулем — саме тому один Пакетний валідатор ID може перевірити тисячі з них за секунду.

Наглядний приклад 3 — IBAN та mod 97

Міжнародні номери банківських рахунків використовують стандарт ISO 7064 mod 97-10 — надійніший алгоритм із двома контрольними цифрами. Візьмемо стандартний приклад GB82 WEST 1234 5698 7654 32:

  1. Перевірте довжину для країни: британський IBAN містить 22 символи. ✓
  2. Перемістіть перші чотири символи на кінець: WEST12345698765432GB82.
  3. Замініть кожну літеру на дві цифри (A = 10 … Z = 35): W→32, E→14, S→28, T→29, G→16, B→11, у результаті отримуємо 3214282912345698765432161182.
  4. Розділіть це число на 97. Остача має бути рівно 1 — і так і є.

Оскільки 97 — просте число і більше за будь-яку двозначну заміну, mod 97 виявляє будь-яку помилку однієї цифри та будь-яку перестановку; лише приблизно один випадковий рядок із 97 може випадково пройти перевірку. Валідатор IBAN показує, як кожен із цих етапів проходить або не проходить.

Криптоадреси: контрольні суми, побудовані на основі хешів

Адреси Bitcoin та Ethereum встановлюють високі стандарти, адже помилка в них призводить до назавжди втрачених коштів. Старі адреси Bitcoin (1…, 3…) використовують Base58Check: вміст адреси обробляється через SHA-256 двічі, а перші чотири байти результату додаються як контрольна сума. Один неправильний символ повністю змінює хеш, тому ймовірність того, що помилка пройде непоміченою, становить приблизно один випадок на чотири мільярди. Новіші адреси bc1… використовують Bech32 або Bech32m — код із корекцією помилок, який гарантує виявлення будь-якої помилки, що стосується до чотирьох символів. У Ethereum EIP-55 приховує контрольну суму у візерунку великих та малих літер.

Інструменти Валідатор Bitcoin-адрес та Валідатор Ethereum-адрес реалізують ці алгоритми у браузері та перевіряють їх відповідність офіційним тестовим векторам під час кожного завантаження сторінки.

Огляд схем

СхемаВикористовується уВиявляєЙмовірність проходження випадкової помилки
Алгоритм Луна (за модулем 10)Кредитні та дебетові картки, IMEI, багато національних ідентифікаторівБудь-яку помилку одного символу та більшість сусідніх перестановокПриблизно 1 з 10
ISO 7064 за модулем 97-10IBAN, деякі податкові та корпоративні номериБудь-яка окрема помилка та будь-яке переставлення символівПриблизно 1 з 97
Зважена сума, mod 10 або 11ISBN-10, бразильський CPF, польський PESEL та багато інших ідентифікаторівОкремі помилки та більшість переставлень символівПриблизно 1 з 10 або 1 з 11
Base58Check (подвійний SHA-256, 4 байти)Старі адреси Bitcoin (1…, 3…)Будь-яка опечатка з величезною ймовірністюПриблизно 1 з 4 мільярдів
Bech32 / Bech32m (код BCH)Адреси Bitcoin SegWit та Taproot (bc1…)Гарантовано: будь-яка помилка впливає лише на до 4 символівМенше 1 випадку на мільярд
EIP-55 (keccak-256 з урахуванням регістру)Адреси EthereumОрфографічні помилки через закономірності великих та малих літерДуже низький показник для введення змішаного регістру

Чому валідатор має працювати на вашому пристрої

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

Поширені запитання

Чи означає дійсна контрольна сума, що номер є реальним чи активним?

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

Яка ймовірність того, що неправильне число все одно пройде перевірку?

Це залежить від схеми. Один контрольний розряд типу mod-10 пропускає приблизно 1 випадкову помилку з 10; контрольний розряд IBAN типу mod 97 пропускає приблизно 1 випадок з 97; 4-байтовий контрольний код Base58Check пропускає приблизно 1 випадок з 4 мільярдів. Важлива властивість усіх цих схем полягає у тому, що вони виявляють поширені людські помилки — один неправильний розряд чи два переставлені розряди.

Чому деякі ідентифікатори взагалі не мають контрольного коду?

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

Чи безпечно вставляти номер своєї картки чи посвідчення особи у верифікатор?

Лише якщо перевірка виконується на вашому пристрої. Контрольний код — це арифметичні обчислення над вже наявними у вас цифрами, тому немає жодної законної причини для верифікатора надсилати їх на сервер. Ви можете переконатися, що інструмент працює локально, за допомогою тесту в режимі «літак», описаного у нашому посібнику з перевірки того, чи завантажує інструмент ваші дані.

У чому різниця між контрольним кодом, хешем та шифруванням?

Контрольний код — це короткий контрольний розряд, призначений для виявлення випадкових описок. Криптографічний хеш — це довгий «відбиток», розроблений так, щоб навіть навмисна зміна була помітною, а оригінал неможливо було відновити. Шифрування перетворює дані так, щоб їх можна було прочитати лише за допомогою ключа. Base58Check використовує хеш для побудови свого контрольного коду, тому його так важко випадково підробити.