Почти каждый день мы держим в руках пластиковую карту и без раздумий вводим её 16-значный номер в формы оплаты.
Но за этой безобидной последовательностью скрывается целая «нумерология», строгие математические правила, ключи эмитента и даже алгоритмы, которые умеют отличить настоящий номер от вымышленного.
В этой статье разберёмся, из чего «сшита» карта, как работает алгоритм Луна, как создают тестовые номера и почему цифры на карте — это не просто случайность.
Содержание
- Структура номера карты
- Алгоритм Луна (Mod 10)
- Генераторы тестовых карт
- Пошаговая проверка валидности
- Частые вопросы и мифы
Структура номера банковской карты
Стандартный номер платёжной карты содержит от 13 до 19 цифр, но большинство карт в России и мире — 16 цифр, разбитых на 4 блока по 4 цифры.
Каждая цифра несёт смысл:
- Цифры 1–6: Идентификационный номер эмитента (IIN/BIN).
Пример: карты Visa начинаются с 4, MasterCard, с 51–55, МИР — с 2200–2204. - Цифры 7–15: Уникальный номер счёта/карты внутри банка.
- Цифра 16: Контрольная цифра, вычисляемая по алгоритму Луна.
Формат отображения может варьироваться:
1234 5678 9012 3456 или 1234-5678-9012-3456.
Однако для вычислений используется только «сырая» строка из цифр.
Алгоритм Луна (Luhn, «Mod 10»)
В 1960 году инженер IBM Питер Луна запатентовал простой, но элегантный способ детектировать ошибки набора номера.
Суть алгоритма — получить одну контрольную цифру, которая зависит от всех остальных.
Если при ручном вводе ошиблись хотя бы одной цифрой, алгоритм моментально «поймает» ошибку.
Как работает алгоритм (шаг за шагом)
- Начиная справа налево, пронумеруйте цифры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16. - Каждую цифру на чётной позиции (2, 4, 6…) умножьте на 2.
- Если результат умножения стал двузначным (>9), вычтите 9 (это то же самое, что сложить цифры числа).
- Просуммируйте все 16 цифр.
- Если сумма кратна 10 (sum % 10 == 0), номер валиден. Иначе, ошибка ввода или фальшивый номер.
Пример:
Номер: 4 5 5 6 7 3 7 5 1 3 4 5 6 7 8 9 Шаг 2: 4 10 5 12 7 6 7 10 1 6 4 10 6 14 8 18 Шаг 3: 4 1 5 3 7 6 7 1 1 6 4 1 6 5 8 9 Сумма: 4 + 1 + 5 + 3 + 7 + 6 + 7 + 1 + 1 + 6 + 4 + 1 + 6 + 5 + 8 + 9 = 63 63 % 10 = 3 ≠ 0 → Недействителен
Генераторы тестовых карт
Для разработчиков, тестировщиков и демонстраций важно иметь валидные, но фальшивые номера.
Генераторы используют:
- Корректные префиксы BIN (Visa, MasterCard, МИР, AmEx).
- Алгоритм Луна, чтобы последняя цифра всегда была верной.
- Дополнительные поля: дату экспайри (MM/YY) и CVV (3-4 цифры).
Типичный формат выдачи генератора:
Номер: 4532 1234 5678 9012 EXP: 12/29 CVV: 123 Имя: IVAN IVANOV
Важно: такие карты НЕ привязаны к реальному счёту и не могут использоваться для оплаты в продакшене.
Большинство платёжных шлюзов блокируют попытки оплаты тестовыми BIN.
Пошаговая проверка валидности с примером кода
Ниже приведён минимальный Python-скрипт, который проверяет номер и, при необходимости, генерирует новый корректный номер.
def luhn_check(card_number: str) -> bool:
"""Проверить номер карты алгоритмом Луна."""
if len(card_number) != 16 or not card_number.isdigit:
return False
digits = [int(d) for d in card_number]
for i in range(0, 16, 2): # чётные позиции (0-based)
digits[i] *= 2
if digits[i] > 9:
digits[i] -= 9
return sum(digits) % 10 == 0
def generate_card_number(prefix: str = "4") -> str:
"""Сгенерировать валидный 16-значный номер."""
import random
body = prefix + "".join(str(random.randint(0, 9)) for _ in range(14))
check = 0
for offset in range(10):
if luhn_check(body + str(offset)):
check = offset
break
return body + str(check)
card = input("Введите номер карты (16 цифр): ").replace(" ", "")
if luhn_check(card):
print("<b style='color:green'>Правильный номер карты!</b>")
else:
print("<b style='color:red'>Не правильно набран номер!</b>")
print("Случайный валидный номер:", generate_card_number)
Частые вопросы и мифы
- Можно ли «угадать» рабочую карту?
Нет. Даже если номер валиден по Луна, он должен быть активирован банком и привязан к счёту. Генераторы выдают только тестовые номера. - Работает ли Луна на 19-значных картах?
Да. Алгоритм универсален и применяется к любому числу цифр (SIM-карты, вагоны РЖД). - Можно ли изменить одну цифру, чтобы номер снова стал валидным?
Да, но только если новая цифра согласуется с контрольной цифрой Луна. Это сразу видно при проверке. - Где взять «безопасный» генератор для тестов?
Используйте официальные SDK Stripe, Adyen, ЮKassa или открытые репозитории на GitHub с ключевым словомcredit-card-generator.
Нумерология банковских карт, это не магия, а строгая математика.
Алгоритм Луна превращает 16 цифр в маленький контрольный чек, который спасает миллионы пользователей от опечаток и мошенников.
А генераторы тестовых карт позволяют разработчикам безопасно отлаживать платёжные формы — без риска утечки реальных реквизитов.
Помните: всё гениальное — просто, если знаешь формулу.