Blog. Just Blog

Алгоритм Верхеффа на Ассемблере

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

В мире цифровых идентификаторов, где человек вручную вводит длинные последовательности цифр, ошибки неизбежны. При этом даже одна опечатка может привести к финансовым потерям, особенно если речь идет о номерах банковских карт, персональных идентификаторах или серийных номерах оборудования. Чтобы обнаруживать такие ошибки, а в идеале и предотвращать их последствия, были разработаны специальные алгоритмы контрольных сумм. Среди них особенно выделяется алгоритм Верхеффа, предложенный голландским математиком Якобом Верхеффом (Jacobus Verhoeff) в 1969 году.

До появления алгоритма Верхеффа большинство систем использовали простые контрольные суммы: сложение цифр по модулю 10 или алгоритм Луна (применяемый в номерах кредитных карт). В отличие от более известного алгоритма Луна (Luhn), который пропускает некоторые типы ошибок (например, перестановку соседних цифр "09" <--> "90"), алгоритм Верхеффа обнаруживает 100% одиночных ошибок и 100% транспозиций соседних цифр, а также многие другие распространенные виды человеческих ошибок.

Миллионы документов со старыми номерами будут действительны еще годы и десятилетия, а для систем, где важен человеческий ввод, алгоритм остается актуальным. Современные системы все чаще используют криптографические подписи вместо контрольных сумм. Но там, где нужна легкость проверки "на глаз" или в уме, Верхефф по-прежнему вне конкуренции.

Вот пример реализации алгоритма Верхеффа на языке Ассемблер для проверки контрольной цифры. Например: проверка паспорта старого образца. Это целое 10-значное число, часто его проверяют как комбинацию серия (4 цифры) + номер (6 цифр) как. Последняя 10-я цифра - контрольная, находится в номере бланка, но проверяется вся связка. При замене паспорта номер меняется, но алгоритм проверки остается тем же, математическая константа в меняющемся документообороте.
  1. ;---------------------------------------------
  2. ; Компактная проверка Верхеффа
  3. ; Copyright (C) ManHunter / PCL
  4. ; https://www.manhunter.ru
  5. ;---------------------------------------------
  6. ; Параметры:
  7. ;       lpData - указатель на строку
  8. ; На выходе:
  9. ;       EAX = 1 - VALID
  10. ;       EAX = 0 - INVALID
  11. ;---------------------------------------------
  12. proc    verhoeff_check lpData:DWORD
  13.         push    edx ebx ecx esi edi
  14.  
  15.         ; Указатель на входную строку
  16.         mov     esi,[lpData]
  17.         ; Перейти на окончание строки
  18.         mov     edi,esi
  19. .find_end:
  20.         cmp     byte[edi],0
  21.         je      @f
  22.         inc     edi
  23.         jmp     .find_end
  24. @@:
  25.         ; На последнюю цифру
  26.         dec     edi
  27.  
  28.         xor     eax,eax
  29.         xor     ecx,ecx
  30.  
  31. .loc_loop:
  32.         cmp     edi,esi
  33.         ; Вышли за начало
  34.         jb      .loc_done
  35.  
  36.         ; Проверить только символы 0..9
  37.         mov     bl,[edi]
  38.         cmp     bl,'0'
  39.         jb      .loc_skip
  40.         cmp     bl,'9'
  41.         ja      .loc_skip
  42.         sub     bl,'0'
  43.  
  44.         ; pos*10 + digit
  45.         movzx   edx,cl
  46.         ; pos*8
  47.         shl     edx,3
  48.         ; pos*10
  49.         lea     edx,[edx+ecx*2]
  50.         ; digit
  51.         movzx   ebx,bl
  52.         ; pos*10 + digit
  53.         add     edx,ebx
  54.         ; p[pos][digit]
  55.         mov     dl,[.p_table+edx]
  56.  
  57.         ; d[c][p]
  58.         movzx   ebx,al
  59.         ; c*8
  60.         shl     ebx,3
  61.         ; c*10
  62.         lea     ebx,[ebx+eax*2]
  63.         movzx   eax,dl
  64.         ; c*10 + p
  65.         add     ebx,eax
  66.         mov     al,[.d_table+ebx]
  67.  
  68.         ; pos = (pos+1) & 7
  69.         inc     cl
  70.         and     cl,7
  71. .loc_skip:
  72.         ; Следующая цифра слева
  73.         dec     edi
  74.         jmp     .loc_loop
  75.  
  76. .loc_done:
  77.         cmp     al, 0
  78.         sete    al
  79.  
  80.         pop     edi esi ecx ebx edx
  81.         ret
  82.  
  83.         ; Перестановка p[8][10]
  84. .p_table:
  85.         db      0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  86.         db      1, 5, 7, 6, 2, 8, 3, 0, 9, 4
  87.         db      5, 8, 0, 3, 7, 9, 6, 1, 4, 2
  88.         db      8, 9, 1, 6, 0, 4, 3, 5, 2, 7
  89.         db      9, 4, 5, 3, 1, 2, 6, 8, 7, 0
  90.         db      4, 2, 8, 6, 5, 7, 3, 9, 0, 1
  91.         db      2, 7, 9, 3, 8, 0, 6, 4, 1, 5
  92.         db      7, 0, 4, 6, 9, 1, 3, 2, 5, 8
  93.  
  94.         ; Умножение d[10][10]
  95. .d_table:
  96.         db      0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  97.         db      1, 2, 3, 4, 0, 6, 7, 8, 9, 5
  98.         db      2, 3, 4, 0, 1, 7, 8, 9, 5, 6
  99.         db      3, 4, 0, 1, 2, 8, 9, 5, 6, 7
  100.         db      4, 0, 1, 2, 3, 9, 5, 6, 7, 8
  101.         db      5, 9, 8, 7, 6, 0, 4, 3, 2, 1
  102.         db      6, 5, 9, 8, 7, 1, 0, 4, 3, 2
  103.         db      7, 6, 5, 9, 8, 2, 1, 0, 4, 3
  104.         db      8, 7, 6, 5, 9, 3, 2, 1, 0, 4
  105.         db      9, 8, 7, 6, 5, 4, 3, 2, 1, 0
  106. endp
Процедура принимает в EAX указатель на строку ASCIIZ-строки с контрольной цифрой. Возвращает EAX=0 (валидно) или EAX=1 (невалидно). Использует стандартные таблицы Verhoeff, обрабатывает справа-налево. Неправильные символы, то есть не '0'..'9, пропускаются и в подсчетах не используются. Такой вариант минимален по коду: нет стека, одна точка входа и только две таблицы по 100 и 80 байт.

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

Verhoeff.Algorithm.Demo.zip (3,211 bytes)


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

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

Комментарии

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

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

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

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