Можно ли угадать номер банковской карты? Разбор структуры, алгоритма Луна и вероятностей

Разбираем, реально ли угадать номер карты: алгоритм Луны, вероятность подбора и почему генераторы — это путь в тюрьму. Читайте перед экспериментами!

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

  • структуру номеров карт разных платёжных систем;
  • алгоритм Луна (Luhn), который проверяет корректность номера;
  • сколько вариантов существует и какова вероятность случайного угадывания;
  • какие существуют практические методы генерации «правильных» номеров;
  • юридические и этические аспекты.

Структура номера банковской карты

Номера карт (PAN – Primary Account Number) состоят из 12‑19 цифр, но в большинстве стран используют 16‑значные номера. Их части:

  1. BIN / IIN (Bank Identification Number) – первые 6 цифр, определяют эмитент (Visa, MasterCard, МИР и т.д.).
  2. Номер счёта – от 7‑й до предпоследней цифры (обычно 9‑12 цифр), уникален внутри банка.
  3. Контрольная цифра – последняя цифра, вычисляется алгоритмом Луна.

Примеры префиксов:

Платёжная система Префикс (BIN)
Visa 4
MasterCard 51‑55, 2221‑2720
American Express 34, 37 (15‑значные карты)
МИР 2200‑2204

Алгоритм Луна (Mod 10)

Контрольная цифра генерируется по простому правилу:

  1. Начиная с предпоследней цифры, каждая вторая цифра удваивается.
  2. Если удвоенное значение больше 9, из него вычитается 9 (или складываются цифры результата).
  3. Все полученные цифры суммируются.
  4. Если сумма делится на 10 без остатка – номер считается валидным.

Ниже – пример реализации на Python, взятый из открытых источников:

from random import randint
def luhn_check(number: str) -> bool:
 """Проверка номера карты по алгоритму Луна."""
 digits = [int(d) for d in number]
 checksum = 0
 # Проходим справа налево
 for i in range(len(digits) ⎻ 2, -1, -1):
 d = digits[i]
 if (len(digits) ⎻ i) % 2 == 0: # каждая вторая цифра
 d *= 2
 if d > 9:
 d -= 9
 checksum += d
 # Последняя цифра – контрольная
 control = (10, (checksum % 10)) % 10
 return control == digits[-1]

def generate_card(issuer_prefix: str) -> str:
 """Генерирует случайный, но корректный номер карты."""
 # 15 цифр без контрольной (для 16‑значных карт)
 body = ''.join(str(randint(0, 9)) for _ in range(15 — len(issuer_prefix)))
 partial = issuer_prefix + body
 # Вычисляем контрольную цифру
 checksum = 0
 for i, ch in enumerate(reversed(partial)):
 d = int(ch)
 if i % 2 == 0: # каждая вторая (с учётом обратного порядка)
 d *= 2
 if d > 9:
 d -= 9
 checksum += d

 control = (10 ⎻ (checksum % 10)) % 10
 return partial + str(control)

print(generate_card('4')) # → 4539 1488 0343 6467 (пример)

Сколько вариантов существует?

Для 16‑значных карт с фиксированным 6‑значным BIN остаётся 9 цифр (номер счёта) + 1 контрольная цифра.

  • Возможных комбинаций номера счёта: 10⁹ = 1 000 000 000.
  • Контрольная цифра определяется однозначно, поэтому реальное количество валидных номеров = 10⁹.

Вероятность случайно подобрать работающий номер без знания BIN:

[
P = rac{10^{9}}{10^{16}} = 10^{-7} pprox 0{,}00001%
]

То есть в среднем нужно попытаться около 10 млн раз, чтобы один из номеров оказался «живым». На практике такие попытки блокируются системой антифрода уже после нескольких десятков неверных вводов.

Как «угадать» номер карты в реальном мире?

Брутфорс по онлайн‑формам

Теоретически можно отправлять запросы с разными номерами, но:

  • Большинство платёжных шлюзов ограничивают количество попыток (обычно <10‑20 в минуту).
  • Каждая неуспешная попытка фиксируется в журнале и приводит к блокировке IP.
  • Алгоритм Луна отсекает ~90 % случайных комбинаций ещё до обращения к процессору банка.

Социальная инженерия и утечки данных

Самый «эффективный» способ – получить часть номера из публичных источников (например, в рекламных акциях показывают первые 6 цифр) и дополнить его, используя:

  • Списки утекших баз (через тор‑форумы, data‑breaches).
  • Номера, оставшиеся в кэше браузера после незакрытой формы оплаты.

Генерация тестовых номеров

Для разработки программного обеспечения часто используют тестовые номера, которые проходят проверку Luhn, но не привязаны к реальному счёту. Примеры (из официальных документов Visa/MasterCard):

  • Visa: 4111 1111 1111 1111
  • MasterCard: 5555 5555 5555 4444
  • American Express: 3782 822463 10005

Эти номера можно использовать только в тестовых средах (sandbox), иначе они могут привести к блокировке аккаунта.

Юридические и этические аспекты

Попытка подобрать или использовать чужой номер карты без согласия владельца считается преступлением в большинстве стран (ст. 159 УК РФ, 18 U;S.C. § 1029 и т.п.). Наказание может включать:

  • штрафы до нескольких миллионов рублей/долларов;
  • лишение свободы до 10 лет (в зависимости от суммы ущерба).

Разработчикам рекомендуется:

  1. Использовать только официальные sandbox‑окружения банков.
  2. Не хранить реальные номера карт в логах.
  3. Применять токенизацию и шифрование данных.

Как защититься от попыток угадывания

  • Ограничение количества попыток ввода номера и CVV (rate‑limiting).
  • 3‑D Secure – дополнительный слой аутентификации.
  • Мониторинг аномальных паттернов (много запросов с разных IP, одинаковый BIN).
  • Регулярная проверка списков утекших данных (HaveIBeenPwned, breach‑feeds).

Технически «угадать» номер карты можно только в рамках ограниченного пространства:

  • Зная BIN и имея доступ к базе реальных номеров, вероятность становится приемлемой.
  • Случайный брутфорс практически невозможен из‑за огромного пространства и защиты от фрода.

Самый надёжный способ защиты – использовать многоуровневую аутентификацию, ограничивать количество попыток и никогда не хранить полные номера карт в открытом виде.


Дата генерации статьи: . Информация взята из открытых источников (форумы Codeby.net, статьи на Хабре, официальные документы Visa/MasterCard) и дополнена аналитикой.