С Новым Годом! С Новым Годом!
Blog. Just Blog

Алгоритм Луна на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритм Луна на Ассемблере
Алгоритм Луна на Ассемблере

Алгоритм валидации номеров банковских карт основан на элегантном и простом методе, известном как алгоритм Луна. Он назван в честь немецкого ученого Ханса Петера Луна, инженера компании IBM. Важно понимать, что алгоритм Луна - это не шифрование и не средство защиты от мошенничества. Он предназначен исключительно для обнаружения случайных ошибок при вводе, например, перестановки соседних цифр или замены одной цифры на другую. Ранее я реализовывал этот алгоритм на PHP, а теперь на Ассемблере.

Как я и говорил, алгоритм Луна не обнаруживает все ошибки: например, некоторых пар цифр, таких как "09" и "90", может остаться незамеченной. Алгоритм не защищает от умышленного подбора или подделки номеров, зная первые 15 цифр номера карты, легко вычислить 16-ю контрольную цифру и получить формально валидный номер. Например, номер "4242 4242 4242 4242", часто используемый в тестовых средах, проходит проверку по алгоритму Луна. Важно понимать, что алгоритм не предназначен для криптографической проверки подлинности. Для проверки этого используются дополнительные механизмы, такие как CVV-код, срок действия карты и протоколы типа 3D Secure.
  1. ;---------------------------------------------
  2. ; Функция вычисления алгоритма Луна
  3. ; Copyright (C) ManHunter / PCL
  4. ; https://www.manhunter.ru
  5. ;---------------------------------------------
  6. ; Параметры:
  7. ;       lpData - указатель на строку
  8. ;       dSize  - длина строки
  9. ; На выходе:
  10. ;       EAX = 1 - VALID
  11. ;       EAX = 0 - INVALID
  12. ;---------------------------------------------
  13. proc    check_card_numb lpData:DWORD, dSize:DWORD
  14.         push    edx ebx ecx esi
  15.  
  16.         ; Указатель на входную строку
  17.         mov     esi,[lpData]
  18.         add     esi,[dSize]
  19.         dec     esi
  20.         ; Счетчик цифр
  21.         xor     ebx,ebx
  22.         ; Индекс для подсчета
  23.         xor     ecx,ecx
  24.  
  25.         ; Цифры проверяемой последовательности
  26.         ; нумеруются справа налево
  27.         std
  28. .loc_count:
  29.         lodsb
  30.         cmp     al,'0'
  31.         jb      .skip
  32.         cmp     al,'9'
  33.         ja      .skip
  34.  
  35.         sub     al,'0'
  36.         movzx   eax,al
  37.  
  38.         ; Количество цифр
  39.         inc     ebx
  40.         test    ebx,1
  41.         jnp     @f
  42.  
  43.         ; Цифры, стоящие на четных местах,
  44.         ; умножаются на 2
  45.         shl     eax,1
  46.  
  47.         ; Если в результате такого умножения
  48.         ; возникает число больше 9, оно заменяется
  49.         ; суммой цифр получившегося произведения -
  50.         ; однозначным числом, то есть цифрой.
  51.         cmp     eax,10
  52.         jb      @f
  53.         sub     eax,9
  54. @@:
  55.         ; Цифры, оказавшиеся на нечетных местах,
  56.         ; остаются без изменений
  57.         add     ecx,eax
  58. .skip:
  59.         cmp     esi,[lpData]
  60.         jnb     .loc_count
  61.  
  62.         ; Проверяем, делится ли сумма на 10
  63.         xor     edx,edx
  64.         mov     eax,ecx
  65.         mov     ebx,10
  66.         div     ebx
  67.         test    edx,edx
  68.         setz    al
  69.         movzx   eax,al
  70.  
  71.         cld
  72.  
  73.         pop     esi ecx ebx edx
  74.         ret
  75. endp
Вот как это выглядит на Ассемблере. lpData - указатель на строку, dSize - длина строки. В EAX возвращается 1, если номер валиден (сумма кратна 10), иначе 0.

Несмотря на отсутствие универсальности, алгоритм Луна - прекрасный пример того, как простая идея может служить десятилетиями. Он сочетает в себе математическую изящность, вычислительную эффективность и практическую полезность.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Luhn.Algorithm.Demo.zip (2,998 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 260 | Комментариев: 0

Метки: Assembler, хеши

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0034 сек.) / Память: 4.5 Mb
Наверх