Статья Генерация номеров кредитных карт(без регистрации и sms)

Номер кредитоной карты(PAN -Primory Account Number) может содержать от 12 до 19 цифр
Первая цифра это MII -Major Industry Identifier
Python:
MMI = {
    'ISO_TC68': 0,
    'AIRLINES': 1,
    'AIRLINES_AND_OTHER_INDUSTRY_ASSIGNMENT': 2,
    'TRAVEL_AND_ENTERTAINMENT': 3,
    'BANKING_AND_FINANCIAL': 4,
    'BANKING_AND_FINANCIAL': 5,
    'MERCHANDISING_AND_BANKING': 6,
    'PETROLEUM': 7,
    'TELECOMMUNICATIONS_AND_OTHER_INDUSTRY_ASSIGNMENT': 8,
    'NATIONAL_ASSIGNMENT': 9,
}

Если эта цифра 9, следующие три цифры - это код страны из .Например для Австралии это 036.

Идентификационный номер эмитента, также известный как идентификационный номер банка (BIN), представляет собой первые шесть цифр номера кредитной карты. Они идентифицируют учреждение, которое выпустило кредитную карту держателю карты, например для MASTERCARD это 511111- 551111, с 2017 добавлен диапазон 222100–272099.

С 7-ой до n-1 это индивидуальный идентификатор аккаунта, максимальная длинна ограничена 12 цифрами.
Последняя цифра - контрольная сумма, используется для проверки основного номера счета для защиты от случайных ошибок.

Алгоритм Луна(англ. ) представляет собой следующую последовательность действий:

Для примера используем 5501-5746-0551-8031
Последняя цифра (1) - наша контрольная цифра( далее в расчетах она не учитывается т.е list[:-1])
Теперь список принял вид 5501-5746-0551-803
Удваиваем каждую вторую цифру, начиная с первой
Python:
{i: v * 2 for i, v in enumerate(list_int[:-1]) if i == 0 or i % 2 == 0}

5501 - 5746 - 0551 - 803
(10)5(0)1 - (10)7(8)6 - (0)5(10)1-(16)0(6)

Суммируем произведение

(1)5(0)1 - (1)7(8)6 - (0)5(1)1 - (7)0(6)

Получаем сумму элементов(49) и умножаем полученный результат на 9. Произведение равно 441, а последняя цифра равна нашей контрольной (1), следовательно номер валидный.

Python:
from random import randint

ISSUER_ID = {
    'MASTERCARD': randint(511111, 551111),
    'VISA': randint(411111, 499999)
}


def userId() -> int:
    return randint(1111111111, 9999999999)


def issuerId(key: str = 'MASTERCARD') -> int:
    return ISSUER_ID.get(key)


def checkLuhn(list_int: list) -> bool:
    c_sum = list_int[-1]
    tmp_v = {i: v * 2 for i, v in enumerate(list_int[:-1]) if i == 0 or i % 2 == 0}
    for k, v in tmp_v.items():
        if v >= 10:
            y = str(v)[0]
            z = str(v)[1]
            w = int(y) + int(z)
            tmp_v.update({k: w})
    for k_, v_ in tmp_v.items():
        list_int[k_] = v_
    res = sum(list_int[:-1]) * 9
    if str(res)[-1] == str(c_sum):
        return True


def gen() -> None:
    while 1:
        iid = str(issuerId())
        uid = str(userId())
        num = iid + uid
        l_tmp = [int(i) for i in num]
        if checkLuhn(l_tmp):
            print(num)


if __name__ == '__main__':
    gen()

Чекнуть номер можно на там же можно и сгенерировать=)
 
  • Нравится
Реакции: 1984

Iskus

Green Team
13.11.2017
287
468
BIT
0
А если первая цифра не 9, то следующие 3 что?
 
  • Нравится
Реакции: 1984

Nesty

One Level
11.05.2018
2
1
BIT
0
Если первая не девять, то следующие 5 цифр это BIN Bank identification number или IIN Issuer identification number
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!