Blog. Just Blog

Алгоритм шифрования ROT13 на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Шифр ROT13 - вариация "шифра Цезаря", в котором используется сдвиг букв в алфавите или простейшая подстановка. Алгоритм не обладает даже минимальной криптостойкостью, поэтому не может применяться в серьезных системах. Вместе с тем, он часто используется при кодировании PHP-скриптов (функция str_rot13), так что алгоритм обратного кодирования будет полезен при написании расшифровщиков. Вот что у меня получилось:
  1. ;-----------------------------------------------------------------------
  2. ; Функция шифрования строки по алгоритму ROT13
  3. ; Copyright (C) ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;-----------------------------------------------------------------------
  6. ; Параметры:
  7. ;      lpData - указатель на строку
  8. ;      dSize  - длина строки
  9. ;-----------------------------------------------------------------------
  10. proc    ROT13 lpData:DWORD, dSize:DWORD
  11.         pusha
  12.  
  13.         ; Длина строки
  14.         mov     ecx,[dSize]
  15.         or      ecx,ecx
  16.         jz      .loc_ret
  17.  
  18.         ; Указатели на строку
  19.         mov     esi,[lpData]
  20.         mov     edi,esi
  21. .loc_crypt:
  22.         ; Получить символ из строки
  23.         lodsb
  24.         inc     edi
  25.  
  26.         ; Сохранить бит регистра
  27.         mov     ah,al
  28.         and     ah,20h
  29.  
  30.         ; Символ в верхний регистр
  31.         and     al,(0FFh-20h)
  32.         cmp     al,'A'
  33.         ; Кодировать не надо
  34.         jb      .no_crypt
  35.         cmp     al,'Z'
  36.         ; Кодировать не надо
  37.         ja      .no_crypt
  38.  
  39.         sub     al,13
  40.         ; Cимвол первой половины алфавита?
  41.         cmp     al,'A'
  42.         jae     @f
  43.         add     al,26
  44. @@:
  45.         ; Восстановить бит регистра
  46.         or      al,ah
  47.         dec     edi
  48.         ; Записать измененный символ
  49.         stosb
  50. .no_crypt:
  51.         ; Следующий символ
  52.         loop    .loc_crypt
  53. .loc_ret:
  54.         popa
  55.         ret
  56. endp
Параметры функции: lpData - указатель на шифруемую строку в памяти, dSize - длина строки. При шифровании затрагиваются только буквы английского алфавита, любые другие буквы и символы остаются без изменения. Поскольку ROT13 является обратным алгоритмом, то снять его можно, просто применив эту же функцию к зашифрованной строке.

Пример вызова функции ROT13:
  1. ; Сегмент данных
  2. section '.data' data readable writeable  
  3. ...
  4. somedata db 'Yeah! I like Flat Assembler!',0 ; Строка для шифрования
  5.  
  6. ; Сегмент кода
  7. section '.code' code readable executable
  8.         ...
  9.         invoke  lstrlen,somedata
  10.         ; Шифрование
  11.         stdcall ROT13,somedata,eax
  12.         ; Получилась строка "Lrnu! V yvxr Syng Nffrzoyre!"
  13.  
  14.         ; Расшифровка
  15.         stdcall ROT13,somedata,eax
  16.         ; Получилась исходная строка "Yeah! I like Flat Assembler!"
  17.         ...
В приложении пример программы с исходным текстом, кодирующей введенную строку по алгоритму ROT13. Ее также можно использовать для декодирования зашифрованной строки.

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

ROT13.Crypt.Demo.zip (2,516 bytes)


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

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Юра (07.05.2015 в 21:19):
Огромное спасибо за программу... Ты мне жизнь спас =D
ManHunter (13.09.2013 в 14:24):
Grey, да, но только если кодируются все без исключения символы строки (читай - "блока двоичных данных"). Конкретно в PHPшном и в этом варианте кодируются только буквы.
Grey (13.09.2013 в 14:21):
думал что такого рода фукции реализуются через ROR/ROL
ManHunter (11.12.2012 в 17:09):
Да, соглашусь. GetDlgItemText и так вернет в EAX длину строки. Это была не совсем удачная попытка совместить пример из статьи и работу с диалоговыми окнами.
noldor (11.12.2012 в 17:07):
Спасибо за простую реализацию на асме!
Скачал пример с исходником и в коде исходника строки:
.wmencode:
  invoke  GetDlgItemText,[hwnddlg],ID_TXT,buff,255
  invoke  lstrlen,buff
  stdcall ROT13,buff,eax
За оптимизацию: по сути вызов lstrlen будет лишним, или тут хитрость какая?
Дмитрий (22.01.2012 в 11:09):
Спасибо весьма полезная процедурка получилась

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

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

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