Модуль 97
Модуль 97 — это алгоритм вычисления контрольной цифры (контрольного числа) на основе операции взятия остатка от деления на 97, используемый для проверки целостности и достоверности номеров банковских счетов (IBAN) и некоторых других идентификаторов в международных и национальных системах расчётов. Относится к классу детерминированных контрольных сумм, устойчивых к одиночным ошибкам ввода и большинству перестановок символов.
История и стандартизация
Необходимость в надёжном методе проверки номеров счетов возникла с развитием международных банковских переводов. В конце 1980-х — начале 1990-х годов Международная организация по стандартизации (ISO) разработала стандарт ISO 13616, определяющий структуру международного номера банковского счёта (IBAN). Ключевым требованием к IBAN стала возможность автоматической проверки номера до отправки платежа, чтобы снизить количество ошибочных транзакций.
В качестве базового алгоритма проверки был выбран модуль 97 (mod 97), уже зарекомендовавший себя в национальных системах, в частности в немецкой системе проверки номеров счетов (Kontonummer). Выбор числа 97 объясняется тем, что оно является простым и достаточно большим, чтобы обеспечить высокую вероятность обнаружения ошибок, но при этом удобным для вычислений (97 меньше 100, что упрощает ручную проверку).
Стандарт ISO 13616 был принят в 1997 году, а в 2003 году — обновлён. В Евросоюзе и странах Европейской экономической зоны использование IBAN и проверки по модулю 97 стало обязательным для всех межбанковских переводов с 2007 года (SEPA — Единая зона платежей в евро). В России IBAN применяется для международных переводов, а для внутренних расчётов используется собственная система с контрольным ключом по модулю 97, определённая Положением Банка России № 579-П.
Алгоритм расчёта
Проверка по модулю 97 для IBAN основана на преобразовании буквенно-цифрового номера в целое число и вычислении остатка от деления этого числа на 97. Если остаток равен 1, номер считается корректным.
Процедура проверки (для IBAN)
- Удаление пробелов: Из номера IBAN удаляются все пробелы и небуквенно-цифровые символы.
- Перестановка: Первые четыре символа (код страны и контрольные цифры) переносятся в конец строки.
- Замена букв: Каждая буква латинского алфавита заменяется на двузначное число: A=10, B=11, ..., Z=35.
- Вычисление остатка: Полученное длинное число делится на 97. Остаток от деления (mod 97) должен быть равен 1.
- Интерпретация: Если остаток = 1 — номер корректен. В противном случае — ошибка ввода или недействительный счёт.
Пример
Для гипотетического IBAN GB82 WEST 1234 5698 7654 32:
- После удаления пробелов:
GB82WEST12345698765432 - Перестановка:
WEST12345698765432GB82 - Замена букв:
- W=32, E=14, S=28, T=29, G=16, B=11
- Получаем:
3214282912345698765432161182
- Вычисление:
3214282912345698765432161182 mod 97 = 1(корректно).
Расчёт контрольных цифр
При создании нового IBAN контрольные цифры (позиции 3–4) рассчитываются по тому же алгоритму, но с обратной логикой. Сначала формируется номер с временными контрольными цифрами (например, 00), затем вычисляется остаток от деления. Контрольные цифры получаются по формуле: 98 - (остаток). Если результат меньше 10, перед ним добавляется ноль.
Применение
Международные банковские счета (IBAN)
Основное применение — проверка номеров IBAN в платежных системах (SWIFT, SEPA, системы стран СНГ). Алгоритм реализован во всех банковских программах, интернет-банках и платёжных шлюзах. Он позволяет отсеять до 98% опечаток при вводе номера счёта вручную.
Российские банковские счета (внутренние)
В России для внутренних расчётов используется номер лицевого счёта (20 знаков) и номер корреспондентского счёта (20 знаков). Контрольный ключ (третий разряд счёта) рассчитывается по алгоритму, основанному на модуле 97, но с весовыми коэффициентами, определёнными Банком России. Алгоритм учитывает номер счёта, БИК банка и код валюты. Проверка обязательна при открытии счёта и при обработке платёжных поручений.
Другие идентификаторы
Алгоритм mod 97 также используется в:
- Международном номере банковского идентификатора (BIC/SWIFT) — для проверки кода филиала (branch code).
- Номерах паспортов и удостоверений личности в некоторых странах (например, в Германии — Personalausweisnummer).
- Номерах социального страхования (SSN) в отдельных государствах.
- Идентификаторах юридических лиц (LEI) — для проверки последних двух символов.
Классификация ошибок, обнаруживаемых модулем 97
Модуль 97 относится к классу детерминированных контрольных сумм. Он гарантированно обнаруживает:
| Тип ошибки | Описание | Вероятность обнаружения |
|---|---|---|
| Одиночная ошибка | Замена одного символа на другой | 100% (если не меняет номер на другой корректный) |
| Перестановка соседних символов | Обмен местами двух соседних цифр или букв | 100% (кроме случаев, когда перестановка даёт другой корректный номер) |
| Перестановка не соседних символов | Обмен местами двух символов, разделённых одним или несколькими другими | ~97% (зависит от расстояния) |
| Вставка/удаление символа | Добавление или пропуск одного знака | ~97% |
| Двойная ошибка | Две независимые ошибки в одном номере | ~97% |
Критика и ограничения
Несмотря на широкое распространение, алгоритм mod 97 имеет ряд ограничений:
- Не является криптографической хеш-функцией: Он не защищает от преднамеренной подделки номера. Злоумышленник, зная алгоритм, может подобрать другой номер с той же контрольной суммой.
- Чувствительность к регистру: Стандарт IBAN предписывает использовать только заглавные буквы. Ввод строчных букв может привести к ошибке проверки, если программное обеспечение не выполняет автоматическое преобразование регистра.
- Не обнаруживает все перестановки: Алгоритм не гарантирует обнаружение перестановок, при которых разность чисел кратна 97. Например, перестановка цифр 0 и 1 в некоторых позициях может остаться незамеченной.
- Зависимость от правильной реализации: Ошибки в программной реализации (например, переполнение целочисленной арифметики при работе с очень длинными числами) могут привести к ложным срабатываниям или пропуску ошибок.
Интересные факты
- Число 97 выбрано не случайно: оно является простым числом, а также наибольшим двузначным простым числом, что обеспечивает максимальную теоретическую вероятность обнаружения ошибок для двузначной контрольной суммы (1/97 ≈ 1,03% необнаруженных ошибок).
- В некоторых странах (например, в Германии) до введения IBAN использовалась собственная система проверки номеров счетов с другими модулями (11, 10, 7), что создавало сложности при автоматизации международных переводов.
- Алгоритм mod 97 настолько прост, что может быть выполнен вручную с помощью карандаша и бумаги, что было важно в эпоху до всеобщей компьютеризации банков.
Источники
- ISO 13616:1997 — Financial services — International bank account number (IBAN).
- ISO 13616-1:2007 — Financial services — International bank account number (IBAN) — Part 1: Structure.
- Положение Банка России от 27.02.2017 № 579-П «О Плане счетов бухгалтерского учета для кредитных организаций и порядке его применения».
- European Committee for Banking Standards (ECBS) — IBAN Implementation Guidelines.
- Рекомендации SWIFT по проверке IBAN.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →