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

Алгоритм Луна на Ассемблере
Алгоритм валидации номеров банковских карт основан на элегантном и простом методе, известном как алгоритм Луна. Он назван в честь немецкого ученого Ханса Петера Луна, инженера компании IBM. Важно понимать, что алгоритм Луна - это не шифрование и не средство защиты от мошенничества. Он предназначен исключительно для обнаружения случайных ошибок при вводе, например, перестановки соседних цифр или замены одной цифры на другую. Ранее я реализовывал этот алгоритм на PHP, а теперь на Ассемблере.
Как я и говорил, алгоритм Луна не обнаруживает все ошибки: например, некоторых пар цифр, таких как "09" и "90", может остаться незамеченной. Алгоритм не защищает от умышленного подбора или подделки номеров, зная первые 15 цифр номера карты, легко вычислить 16-ю контрольную цифру и получить формально валидный номер. Например, номер "4242 4242 4242 4242", часто используемый в тестовых средах, проходит проверку по алгоритму Луна. Важно понимать, что алгоритм не предназначен для криптографической проверки подлинности. Для проверки этого используются дополнительные механизмы, такие как CVV-код, срок действия карты и протоколы типа 3D Secure.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Функция вычисления алгоритма Луна
- ; Copyright (C) ManHunter / PCL
- ; https://www.manhunter.ru
- ;---------------------------------------------
- ; Параметры:
- ; lpData - указатель на строку
- ; dSize - длина строки
- ; На выходе:
- ; EAX = 1 - VALID
- ; EAX = 0 - INVALID
- ;---------------------------------------------
- proc check_card_numb lpData:DWORD, dSize:DWORD
- push edx ebx ecx esi
- ; Указатель на входную строку
- mov esi,[lpData]
- add esi,[dSize]
- dec esi
- ; Счетчик цифр
- xor ebx,ebx
- ; Индекс для подсчета
- xor ecx,ecx
- ; Цифры проверяемой последовательности
- ; нумеруются справа налево
- std
- .loc_count:
- lodsb
- cmp al,'0'
- jb .skip
- cmp al,'9'
- ja .skip
- sub al,'0'
- movzx eax,al
- ; Количество цифр
- inc ebx
- test ebx,1
- jnp @f
- ; Цифры, стоящие на четных местах,
- ; умножаются на 2
- shl eax,1
- ; Если в результате такого умножения
- ; возникает число больше 9, оно заменяется
- ; суммой цифр получившегося произведения -
- ; однозначным числом, то есть цифрой.
- cmp eax,10
- jb @f
- sub eax,9
- @@:
- ; Цифры, оказавшиеся на нечетных местах,
- ; остаются без изменений
- add ecx,eax
- .skip:
- cmp esi,[lpData]
- jnb .loc_count
- ; Проверяем, делится ли сумма на 10
- xor edx,edx
- mov eax,ecx
- mov ebx,10
- div ebx
- test edx,edx
- setz al
- movzx eax,al
- cld
- pop esi ecx ebx edx
- ret
- endp
Несмотря на отсутствие универсальности, алгоритм Луна - прекрасный пример того, как простая идея может служить десятилетиями. Он сочетает в себе математическую изящность, вычислительную эффективность и практическую полезность.
Просмотров: 260 | Комментариев: 0
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария
Пример программы с исходным текстом (FASM)

