Алгоритм шифрования ROT13 на Ассемблере
Шифр ROT13 - вариация "шифра Цезаря", в котором используется сдвиг букв в алфавите или простейшая подстановка. Алгоритм не обладает даже минимальной криптостойкостью, поэтому не может применяться в серьезных системах. Вместе с тем, он часто используется при кодировании PHP-скриптов (функция str_rot13), так что алгоритм обратного кодирования будет полезен при написании расшифровщиков. Вот что у меня получилось:Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------------------
- ; Функция шифрования строки по алгоритму ROT13
- ; Copyright (C) ManHunter / PCL
- ; http://www.manhunter.ru
- ;-----------------------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на строку
- ; dSize - длина строки
- ;-----------------------------------------------------------------------
- proc ROT13 lpData:DWORD, dSize:DWORD
- pusha
- ; Длина строки
- mov ecx,[dSize]
- or ecx,ecx
- jz .loc_ret
- ; Указатели на строку
- mov esi,[lpData]
- mov edi,esi
- .loc_crypt:
- ; Получить символ из строки
- lodsb
- inc edi
- ; Сохранить бит регистра
- mov ah,al
- and ah,20h
- ; Символ в верхний регистр
- and al,(0FFh-20h)
- cmp al,'A'
- ; Кодировать не надо
- jb .no_crypt
- cmp al,'Z'
- ; Кодировать не надо
- ja .no_crypt
- sub al,13
- ; Cимвол первой половины алфавита?
- cmp al,'A'
- jae @f
- add al,26
- @@:
- ; Восстановить бит регистра
- or al,ah
- dec edi
- ; Записать измененный символ
- stosb
- .no_crypt:
- ; Следующий символ
- loop .loc_crypt
- .loc_ret:
- popa
- ret
- endp
Пример вызова функции ROT13:
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ...
- somedata db 'Yeah! I like Flat Assembler!',0 ; Строка для шифрования
- ; Сегмент кода
- section '.code' code readable executable
- ...
- invoke lstrlen,somedata
- ; Шифрование
- stdcall ROT13,somedata,eax
- ; Получилась строка "Lrnu! V yvxr Syng Nffrzoyre!"
- ; Расшифровка
- stdcall ROT13,somedata,eax
- ; Получилась исходная строка "Yeah! I like Flat Assembler!"
- ...
Просмотров: 8269 | Комментариев: 6
Метки: Assembler, безопасность
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Юра
(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 будет лишним, или тут хитрость какая?
Скачал пример с исходником и в коде исходника строки:
.wmencode:
invoke GetDlgItemText,[hwnddlg],ID_TXT,buff,255
invoke lstrlen,buff
stdcall ROT13,buff,eax
За оптимизацию: по сути вызов lstrlen будет лишним, или тут хитрость какая?
Дмитрий
(22.01.2012 в 11:09):
Спасибо весьма полезная процедурка получилась
Добавить комментарий
Заполните форму для добавления комментария