Пояснение · С примерами решений

Как работают контрольные суммы

Номера карт, IBAN, налоговые ID и криптоадреса всегда содержат одну-две дополнительные скрытые цифры, рассчитанные из остальных. Если ошибиться хотя бы в одном символе, арифметика больше не сойдётся — именно поэтому валидатор может мгновенно отметить опечатку офлайн, без обращения к банку или блокчейну.

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

Контрольная сумма (или контрольная цифра) — это преднамеренное дублирование данных. При присвоении номера одна или несколько его цифр выбираются не произвольно: они рассчитываются из остальных по заранее заданному алгоритму. Любой, кто знает этот алгоритм, может позже пересчитать эти цифры и сравнить их. Если они совпадут, номер внутренне согласован. Если нет — значит, была допущена опечатка, ошибка чтения или повреждение данных.

Вот и всё, что гарантирует контрольная сумма. Она ничего не говорит о том, существует ли счёт, кто им владеет или что на нём лежит — об этом постоянно напоминают все валидаторы на этом сайте, потому что эти понятия легко спутать.

Пример расчёта №1 — алгоритм Луна для номеров карт

Алгоритм Луна используется в картах 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. Число 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 и модуль 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 — простое число и больше любой двузначной перестановки, модуль 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
Взвешенная сумма по модулю 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Опечатки, определяемые по шаблону заглавных и строчных буквОчень низкий показатель для ввода с смешанным регистром

Почему валидатор должен работать на вашем устройстве

Всё вышесказанное — это арифметические операции над уже имеющимися у вас цифрами. Нет никаких причин отправлять номер карты, налоговый идентификатор или адрес кошелька на сервер — и есть очень веская причина этого не делать. Все валидаторы на этом сайте работают локально; список офлайн-инструментов размещён здесь, а наш путеводитель по проверке того, загружает ли инструмент ваши данные показывает, как подтвердить это для любого сайта за двадцать секунд.

Вопросы и ответы

Означает ли корректная контрольная сумма, что номер является действительным или активным?

Нет. Контрольная сумма лишь подтверждает внутреннюю согласованность цифр — то, что такой номер может существовать. Она не может сообщить вам, открыт ли счёт, кто им владеет или каков его баланс. Каждый валидатор на этом сайте указывает это на странице, потому что это важное различие.

Насколько велика вероятность того, что неверное число всё равно пройдёт проверку?

Всё зависит от схемы. Один контрольный разряд по модулю 10 пропускает примерно 1 случайную ошибку из 10; контрольный разряд IBAN по модулю 97 пропускает около 1 случая из 97; 4-байтовая контрольная сумма Base58Check пропускает около 1 случая из 4 миллиардов. Важное свойство всех этих схем — они выявляют распространённые человеческие ошибки: один неверный разряд или две переставленные цифры.

Почему у некоторых идентификаторов вообще нет контрольной суммы?

Более старые или простые схемы были разработаны для поиска в реестре, а не для автономной проверки, а некоторые системы нумерации появились ещё до возникновения такой практики. Для них валидатор может проверять только длину и формат.

Безопасно ли вставлять номер своей карты или удостоверения личности в валидатор?

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

В чём разница между контрольной суммой, хешем и шифрованием?

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