Код Луна¶
Код Луна (также известный как формула Луна, алгоритм Луна или алгоритм модуля 10) — это алгоритм вычисления контрольной цифры номера, используемый для проверки корректности ввода идентификационных номеров, таких как номера кредитных карт, IMEI-коды, номера социального страхования в некоторых странах и другие. Алгоритм предназначен для обнаружения случайных ошибок при ручном вводе (например, перестановки соседних цифр или опечатки в одной цифре), но не обеспечивает криптографической защиты от преднамеренного подбора.
¶История
Алгоритм был разработан в 1954 году Хансом Питером Луном (Hans Peter Luhn), сотрудником компании IBM. Луна, немецко-американский учёный в области информатики, также известен как создатель термина «информационный поиск» и основоположник ряда методов автоматической индексации текстов. Первоначально алгоритм был запатентован в США (патент US 2950048 A, подан в 1954 году, выдан в 1960 году) и предназначался для использования в механических устройствах для проверки номеров. С развитием электронных платежных систем и появлением пластиковых карт алгоритм получил широкое распространение. В 1960-х годах он был принят в качестве стандарта для проверки номеров кредитных карт, а позже — для других идентификаторов.
¶Принцип работы
Алгоритм Луна основан на простой арифметической проверке. Он вычисляет контрольную сумму номера, которая должна быть кратна 10. Процесс проверки состоит из следующих шагов:
- Начиная с самой правой цифры (контрольной) и двигаясь влево, удваивается значение каждой второй цифры (то есть цифры на чётных позициях, если считать справа налево, начиная с 1).
- Если результат удвоения превышает 9, из него вычитается 9 (или, что эквивалентно, складываются цифры полученного числа: например, 16 → 1+6=7).
- Все полученные числа (как исходные, так и преобразованные) суммируются.
- Если общая сумма кратна 10 (оканчивается на 0), номер считается корректным.
¶Пример вычисления
Рассмотрим номер карты 4561 2612 1234 5467. Контрольная цифра — 7 (последняя).
- Удваиваем каждую вторую цифру справа налево, начиная с первой (счёт справа):
- 4 (не удваивается) → 4
- 5 (удваивается, но 5*2=10, 10-9=1) → 1
- 6 (не удваивается) → 6
- 4 (удваивается, 4*2=8) → 8
- 3 (не удваивается) → 3
- 2 (удваивается, 2*2=4) → 4
- 2 (не удваивается) → 2
- 1 (удваивается, 1*2=2) → 2
- 1 (не удваивается) → 1
- 2 (удваивается, 2*2=4) → 4
- 6 (не удваивается) → 6
- 2 (удваивается, 2*2=4) → 4
- 1 (не удваивается) → 1
- 5 (удваивается, 5*2=10, 10-9=1) → 1
- 4 (не удваивается) → 4
- 7 (контрольная цифра, не удваивается) → 7
- Суммируем все полученные значения: 4+1+6+8+3+4+2+2+1+4+6+4+1+1+4+7 = 60.
- 60 кратно 10 — номер корректен.
¶Применение
Код Луна используется в следующих системах:
¶Платежные карты
Номера кредитных и дебетовых карт международных платёжных систем (Visa, Mastercard, American Express, Мир и других) содержат контрольную цифру, вычисленную по алгоритму Луна. Это позволяет банковским терминалам и онлайн-формам быстро отсеивать номера, введённые с ошибкой, без обращения к банку-эмитенту.
¶IMEI
Международный идентификатор мобильного оборудования (IMEI) — 15-значный код, в котором последняя цифра является контрольной, рассчитанной по формуле Луна. Это позволяет операторам связи и производителям проверять корректность ввода IMEI при регистрации устройств в сети или при блокировке украденных телефонов.
¶Номера социального страхования
В Канаде (Social Insurance Number, SIN) и США (в некоторых контекстах) используется алгоритм Луна для проверки корректности ввода номера. Однако в США для номеров Social Security Number (SSN) применяется другой, более сложный метод проверки.
¶Другие идентификаторы
Алгоритм применяется в номерах ISIN (International Securities Identification Number) для ценных бумаг, в некоторых штрих-кодах (например, UPC-A), в номерах банковских счетов IBAN (International Bank Account Number) в сочетании с другими алгоритмами, а также в ряде государственных идентификаторов (например, в некоторых странах — в номерах водительских удостоверений).
¶Ограничения
Алгоритм Луна не является криптостойким. Он предназначен исключительно для обнаружения случайных ошибок ввода. Основные ограничения:
- Не защищает от намеренного подбора. Злоумышленник, зная алгоритм, может легко подобрать корректный номер, изменив одну цифру.
- Не обнаруживает все типы ошибок. Алгоритм не гарантирует обнаружение перестановки цифр, если разница между ними кратна 9 (например, 09 → 90). Также он не всегда обнаруживает двойные ошибки (например, 22 → 11).
- Не проверяет существование номера. Алгоритм лишь подтверждает, что номер соответствует формату, но не гарантирует, что такой номер действительно выдан банком или оператором.
¶Критика и альтернативы
Несмотря на широкое распространение, алгоритм Луна критикуется за низкую надёжность по сравнению с современными методами контроля целостности данных. Для более чувствительных приложений (например, в криптографии или при проверке целостности файлов) используются хеш-функции (SHA-256, MD5) или контрольные суммы (CRC). В контексте платёжных карт, помимо алгоритма Луна, существуют дополнительные проверки, такие как проверка по префиксу (BIN-код), проверка длины номера и проверка срока действия карты.
В некоторых системах (например, в номерах банковских счетов IBAN) используется более сложный алгоритм, основанный на модуле 97 (ISO 7064), который обеспечивает более высокую вероятность обнаружения ошибок.
¶Интересные факты
- Алгоритм Луна запатентован, но патент истёк в 1970-х годах, и алгоритм стал общедоступным.
- В некоторых странах (например, в Китае) алгоритм Луна используется для проверки номеров удостоверений личности.
- Алгоритм Луна является частью стандарта ISO/IEC 7812-1, который определяет формат номеров платежных карт.
- В 2020-х годах с развитием онлайн-торговли и электронных платежей алгоритм Луна остаётся основным методом первичной проверки номеров карт в веб-формах.