belun.app Блог
EN

Как работает алгоритм Луна и чего он не покажет

Контрольная сумма за каждым номером карты, что скрывает префикс IIN и почему пройденная проверка не значит, что с карты можно списать деньги.

Человек с банковской картой в руке заполняет форму онлайн-оплаты на ноутбуке

Последняя цифра номера карты не относится к счёту. Это контрольная сумма, посчитанная по остальным цифрам, и вся её работа — поймать момент, когда вы промахнулись по клавише.

Ханс Петер Лун придумал это в IBM в 1954 году и подал патент. Патент давно истёк, алгоритм стал общественным достоянием — поэтому он и оказался повсюду: номера карт, IMEI телефонов, канадские номера социального страхования, американские идентификаторы медработников.

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

Идём справа налево. Каждую вторую цифру удваиваем. Если получилось больше девяти, вычитаем девять. Всё складываем. У корректного номера сумма делится на 10.

Вот и всё. Никакой криптографии, никакой тайны вокруг метода: посчитать может кто угодно в несколько строк кода.

Ценность в том, что именно он ловит. Любую ошибку в одной цифре — всегда. И любую перестановку двух соседних цифр, ровно с одним исключением: 09 и 90 дают одинаковую сумму, так что этот случай проскакивает. Для контрольной суммы времён перфокарт это приличный результат против двух ошибок, которые люди реально делают, набирая шестнадцать цифр.

На практике это значит, что форма оплаты отбраковывает опечатку до того, как та доберётся до платёжной сети. Без похода на сервер, без отказа в выписке и без вопроса «меня что, банк заблокировал?».

О чём говорят первые цифры

Номера карт описаны стандартом ISO/IEC 7812. Первая цифра — отрасль: 4 и 5 это банки и финансы, 3 — путешествия и развлечения. Отсюда и тройка в начале у Amex, Diners Club и JCB.

Ведущий блок определяет эмитента. Раньше он занимал шесть цифр и назывался IIN. В 2017 году ISO расширил его до восьми, а Visa и Mastercard назначили апрель 2022 года датой перехода для своих сетей — тихо сломав множество таблиц BIN-справочников, где шестёрка была зашита намертво.

Платёжная система определяется сопоставлением этого префикса с опубликованными диапазонами. Для крупных сетей работает надёжно, на краях — хуже: кобрендовые и региональные карты иногда оказываются вне ожидаемых диапазонов. В проверке номера карты рядом с системой показан сырой IIN, так что при странном результате видно, на что именно сработало совпадение.

Место, где ошибаются чаще всего

Пройденная проверка Луна означает, что цифры согласованы между собой. И больше ничего.

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

На настоящие вопросы ответит только банк-эмитент и только через запрос авторизации. Проверка на стороне клиента стоит перед этим фильтром опечаток — и ничем больше не является.

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

Попробуйте инструмент

Проверка номера банковской карты →