BTC: 58581 USD
ETH: 1916 USD
BCH: 532 USD
LTC: 196 USD
DASH: 222 USD
Перейти к содержанию


morpho

Новичок
  • Публикаций

    2
  • Зарегистрирован

  • Посещение

2 Подписчика

Информация о morpho

  • Звание
    Rank №1

Посетители профиля

187 просмотров профиля
  1. Записался на обучение. Получил первый материал. Обещаю вам всё сообщить по результатам обучения!
  2. Продавцы воздуха поговаривают, что этим алгоритмом можно проверить картон. Докажу обратное: Например нам нужно сгенерировать "валидный" номер карты QIWI BANK, для этого мы берём BIN банка QIWI - 469395 В стандартной карте 16 цифр, из которых первые 6 - это BIN (Bank Identification Number), остальные 9 цифр указываю на аккаунт и/или другую информацию для банка, а последняя 10ая цифра, это и есть CHECK, который считается по специальному алгоритму Луна (Luhn) Берём 6 цифр нужного нам банка, 469395 добавляем к ним 9 цифр похожие на что-то настоящее, 713877391 и получаем код из 15 цифр - 469395 713877391 (отделил пробелом для наглядности) 4693 9571 3877 391* - вот наша карта, не хватает последней "чековой" цифры, её мы посчитаем согласно алгоритму Luhn Начнём считать нашу "звездочку" (checksum), "% 10" в примере означает деление с остатком на 10 checksum = 10 - ((luhn(num1) + num2 + luhn(num3) + num4 + luhn(num5) + num6 + luhn(num7) + num8 + luhn(num9) + num10 + luhn(num11) + num12 + luhn(num13) + num14 + luhn(num15)) % 10) Теперь поясню, что делает операция luhn(const), константа умножается на 2 и если она становится больше/равна 10ти, то отнимается 9, а иначе ничего не делаем, так и оставляем Эту операцию мы проделываем с 1, 3, 5, 7, 9, 11, 13, 15 (нечётными) цифрами в нашем сгенерированном номере checksum = 10 - ((luhn(4)+6+luhn(9)+3+luhn(9)+5+luhn(7)+1+luhn(3)+ 8+luhn(7)+7+luhn(3)+9+luhn(1)) % 10) 4*2 = 8, где 8<10, значит оставляем 8, 9*2 = 18, где 18>10, значит отнимаем 9 и получаем 9 9*2, аналогично, 9 7*2 = 14, снова больше 10, значит 14-9=5 3*2 = 6, оставляем 6 7*2, аналогично 5 3*2, аналогично, что и было ранее, это 6 1*2 = 2, так и оставляем 2 Теперь видим вот какой результат после преобразования: checksum = 10 - ((8+6+9+3+9+5+5+1+6+8+5+7+6+9+2 % 10) Получим в сумме 89, которую поделим на 10 с остатком, результат 9, а потом эту 9ку отнимем от 10ки и получим 1 Или просто наглядно посмотрим, сколько нужно добавить к 89, чтобы было кратное 10ти число? 89+1=90, всё, теперь кратное checksum = 1 4693 9571 3877 3911 - вот и стала ясна последняя цифра для того, чтобы наш сгенерированный номер был "валидным" Код программы на языке python (для проверки номера по алгоритму Luhn): #coding: utf8 cvv = raw_input('\n\n\n\033[1;32mВведите номер карты (16 цифр):\033[1;m\n\n') if len(cvv) == 16 and cvv.isdigit(): def da©: c = int© c *= 2 if c >= 10: c -= 9 return c if (da(cvv[0]) + int(cvv[1]) + da(cvv[2]) + int(cvv[3]) + da(cvv[4]) + int(cvv[5]) + da(cvv[6]) + int(cvv[7]) + da(cvv[8]) + int(cvv[9]) + da(cvv[10]) + int(cvv[11]) + da(cvv[12]) + int(cvv[13]) + da(cvv[14]) + int(cvv[15])) % 10 == 0: print "\n\n\033[1;37mVALID\033[1;m" bankidnum = cvv[0] + cvv[1] + cvv[2] + cvv[3] + cvv[4] + cvv[5] print "\n\n\033[1;37mbin =\033[1;m",bankidnum account = cvv[6] + cvv[7] + cvv[8] + cvv[9] + cvv[10] + cvv[11] + cvv[12] + cvv[13] + cvv[14] print "\033[1;37maccount =\033[1;m",account checksum = 10 - ((da(cvv[0]) + int(cvv[1]) + da(cvv[2]) + int(cvv[3]) + da(cvv[4]) + int(cvv[5]) + da(cvv[6]) + int(cvv[7]) + da(cvv[8]) + int(cvv[9]) + da(cvv[10]) + int(cvv[11]) + da(cvv[12]) + int(cvv[13]) + da(cvv[14])) % 10) if checksum != 10: print "\033[1;37mchecksum =\033[1;m",checksum,"\n\n" else: checksum = 0 print "\033[1;37mchecksum =\033[1;m",checksum,"\n\n" else: print "\n\n\033[1;30mNOT VALID\033[1;m\n\n" elif len(cvv) == 0: print "\n\n\033[1;30mВы ничего не ввели\033[1;m\n\n" elif not cvv.isdigit(): print "\n\n\033[1;30mПопробуйте ввести только цифры\033[1;m\n\n" elif cvv.isdigit() and len(cvv) < 16: print "\n\n\033[1;30mНедостаточно цифр\033[1;m\n\n" elif cvv.isdigit() and len(cvv) > 16: print "\n\n\033[1;30mСлишком много цифр\033[1;m\n\n"
×
×
  • Создать...