Перевірка кредитної картки за алгоритмом Луна

Напевне не секрет для всіх, що кредитні та дебетові картки - це шматочок пластику ( або віртуальна картка без пластику) певної фінансової системи, яка спробує процеси розрахунків та покупок.

Проте, мало хто задумується, що приховано за тими числами на картці та як визначити їхню валідність

Так як у світі багато людей, і кожна людина може мати декілька різних карток, тому ці номери мають велику кількість цифр

Для прикладу:

  • American Express - використовує номери із 15 розрядів
  • MasterCard - використовує номери із 16 розрядів
  • Visa - використовує номери із 13 розрядів

Але що таке розряди?

​Під словом розряди розуміється що це десяткові( від 0 до 9), а ніж не як двійкові, тобто це означає що MasterCard з розрядністю 16 номерів може надрукувати 10^16 карток що дорівнює 10,000,000,000,000,000 унікальних карток! ( Тобто це десять квадриліон карток!)

Але це чисто теорія, на практиці на даний момент кожні картки мають певну структуру, для прикладу:

  • ​Карти MasterCard поничаються з цифри 5 та мають 16 цифр
  • Карти Visa починаються з цифри 4 та мають 13 або 16 цифр

Також номери мають контрольну суму, яка обраховується за допомогою математики, та за допомогою контрольної суми ми можемо перевірити чи номер карти може існувати в платіжній системі чи ні.

Для прикладу згенеруємо число з 16 символів де перша цифра 4.
4025683458123411 
і тепер ви можете сказати що даний номер карти повинен в когось бути в світі, проте нам потрібно перевірити чи збігається контрольна сума.

Перевірка числа

Для перевірки контрольної будемо використовувати формулу Луна
Алгоритм Луна - це проста формула перевірки контрольної суми, що використовується для валідації різноманітних ідентифікаційних номерів, таких як номери кредитних/платіжних карток.
        
4 0 2 5 6 8 3 4 5 8 1 2 3 4 1 1
↓   ↓   ↓   ↓   ↓   ↓   ↓   ↓   //перемножуємо кожне друге число на 2
8   4   12  6   10  2   6   2
↓   ↓   ↓   ↓   ↓   ↓   ↓   ↓
8   4   3   6   1   2   6   2 //числа які більше 9 потрібно додати( або відняти 9)
8+0+4+5+3+8+6+4+1+8+2+2+6+4+2 = 63        
    
    

Ми отримали суму 63 , так як 63 не ділиться на 10 без залишків, тому контрольна сума не збіглась. Даний номер карти не правильний.

Отже, ми вже знаємо терію, та провірки контрольної симу, час приступити до написання коду, де ми будемо перевіряти номер на валідність, та якщо він вірний виведемо до якої платіжної системи він відноситься

Приклад коду на мові c++ може бути таким:


          #include stdio.h
          #include cs50.h
          #include string.h

          int main(void) {
              long number = 0;
              while (!number) {
                  number = get_long("Number: ");
              }

              // Переводимо число у рядок
              char number_str[20];
              snprintf(number_str, sizeof(number_str), "%ld", number);

              int length = strlen(number_str);
              string cardName = "INVALID";

              // Перевірка кількості цифр
              if ((length == 13 || length == 16) && number_str[0] == '4') {
                  cardName = "VISA";
              } else if
                ((length == 13 || length == 16) && number_str[0] == '5'  ){
                  cardName = "MASTERCARD";
              } else if (length == 15 && (number_str[0] == '3' && (number_str[1] == '4' || number_str[1] == '7'))) {
                  cardName = "AMEX";
              }

              int sum = 0;

              for (int i = length - 2; i >= 0; i -= 2) {
                  int digit = (number_str[i] - '0') * 2;
                  while (digit > 0) {
                      sum += digit % 10;
                      digit /= 10;
                  }
              }

              for (int i = length - 1; i >= 0; i -= 2) {
                  sum += number_str[i] - '0';
              }
             
              if (sum % 10 == 0) {
                  printf("%s\n", cardName);
              } else {
                  printf("INVALID\n");
              }

              return 0;
          }


Висновки

Використовуючи алгоритм Луна, ми можемо не лише перевірити валідність номера картки, але й визначити, до якої платіжної системи вона відноситься. Завдяки цьому алгоритму, фінансові транзакції стають безпечнішими та надійнішими для користувачів, тепер стало зрозуміло що якщо ви введете не вірну одну цифру, великі шанси що даний номер не пройде перевірку контрольної суми