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

Шифр 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
Теги:
ROT13, lpData, dSize, строки, строки, somedata, crypt, строку, section, длина, Сегмент, указатель, Параметры, алгоритму, readable, manhunter, Пример, crypt, символ, буквы, функции, строку, алфавита, надо, можно, регистра, Кодировать, Assembler, используется, строка, текстом, программы, Получилась, stdcall, кодирующей
Добавлено: 16 Апреля 2015 07:47:31 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...