Шифр
ROT13 - вариация "шифра Цезаря", в котором используется сдвиг букв в алфавите или простейшая подстановка. Алгоритм не обладает даже минимальной криптостойкостью, поэтому не может применяться в серьезных системах. Вместе с тем, он часто используется при кодировании PHP-скриптов (функция
str_rot13), так что алгоритм обратного кодирования будет полезен при написании расшифровщиков. Вот что у меня получилось:
;-----------------------------------------------------------------------
; Функция шифрования строки по алгоритму 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
Параметры функции: lpData - указатель на шифруемую строку в памяти, dSize - длина строки. При шифровании затрагиваются только буквы английского алфавита, любые другие буквы и символы остаются без изменения. Поскольку ROT13 является обратным алгоритмом, то снять его можно, просто применив эту же функцию к зашифрованной строке.
Пример вызова функции ROT13:
; Сегмент данных
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!"
...
В приложении пример программы с исходным текстом, кодирующей введенную строку по алгоритму ROT13. Ее также можно использовать для декодирования зашифрованной строки.
Пример программы с исходным текстом (FASM)
ROT13.Crypt.Demo.zip (2,516 bytes)
Источник: http://www.manhunter.ru