Приложение А. Листинг А.1 – Программа шифрования/расшифрования текстовых сообщений с помощью алгоритма ГОСТ 28147-89
Листинг А.1 – Программа шифрования/расшифрования текстовых сообщений с помощью алгоритма ГОСТ 28147-89
.386 Sseg segment use16 para stack 'stack' db 256 dup(?) Sseg ends
Dseg segment para public 'data' strng db 'Rocking just to make ya move!$' key dd 0F3FA012Bh, 023FE412Ah, 013F5062Bh, 0D9FA0C9Bh dd 033AA1120h, 0B7FA0182h, 0A3FA0D25h, 083F7035Bh endWithZero dq 0;64 нуля mode db 0;флаг режима: зашифровка = 0, расшифровка = 1 (или любое другое число) last db 0;флаг последнего блока substitute db 4, 1, 3, 11, 0, 10, 5, 2, 7, 12, 6, 14, 8, 9, 15, 13 sblocks db 8 dup(0)
cb dw 0;count blocks, номер, по которому;будет записываться образованный блок в строку dcb dw 0;для decrypt cryptedstring db 256 dup(0) decryptedstring db 256 dup(0) endstr db 13d, 10d, '$';символ конца строки ;для ввода строки Dseg ends
Cseg segment use16 para public 'code' assume cs:Cseg, ds:Dseg, ss:Sseg start proc far ; push ds sub ax, ax push ax ; mov bx, Dseg mov ds, bx ; call main ret start endp main proc near lea dx, ds:[strng];вывод строки,;функция 9 прерывания ДОС 21 mov ah, 09h int 21h
lea dx, ds:[endstr];вывод строки,;функция 9 прерывания ДОС 21 mov ah, 09h int 21h
; ret lea bx, ds:[strng];получить адрес;нашей строки jmp process for_decryption: mov al, 1 mov mode, al;устанавливаем флаг;режима расшифровки lea bx, ds:[cryptedstring] process: xor esi, esi;обнуляем указатель на;строку xor edi, edi;указатель ключа
; maincycle: xor cx, cx lea ax, ds:[key];берем адрес следующей, за строкой, переменной sub ax, bx cmp ax, 8;если на итерации не будет 64 бит, то идем на ветку ;кода, где недостающие биты будут нулями
jl less64 jg next_step
next_step: mov eax, dword ptr [bx+si];занесли;левую часть add si, 4;следующие 4 байта (32 бита) mov edx, dword ptr [bx+si];занесли;правую часть add si, 4;смещение для следующего цикла add bx, 8;смещение для следующего цикла
push ax;сохраняем левую часть в;стек, чтобы освободить регистр для работы ror eax, 16 push ax jmp func ; less64: mov al, 1 mov last, al;флаг, что заменяется;последний блок ; add bx, si xor si, si lea cx, ds:[key] lesstrace: mov al, byte ptr [bx] mov byte ptr endWithZero[si], al inc si inc bx cmp bx, cx jne lesstrace xor cx, cx
;функция func: rol edi, 2 add edx, key[edi] ror edi, 2 ;подстановка ;извлечение push di push bx lea bx, substitute mov eax, edx and dl, 00001111b mov di, dx and di, 00FFh mov dl, substitute[di] mov sblocks[0], dl mov dx, ax shr dl, 4 mov di, dx and di, 00FFh mov dl, substitute[di] mov sblocks[1], dl mov dx, ax and dh, 00001111b xor dl, dl xchg dl, dh mov di, dx mov dh, substitute[di] mov sblocks[2], dh mov dx, ax shr dh, 4 xor dl, dl xchg dl, dh mov di, dx mov dh, substitute[di] mov sblocks[3], dh mov edx, eax shr edx, 16 mov ax, dx and dl, 00001111b mov di, dx and di, 00FFh mov dl, substitute[di] mov sblocks[4], dl mov dx, ax shr dl, 4 mov di, dx and di, 00FFh mov dl, substitute[di] mov sblocks[5], dl mov dx, ax and dh, 00001111b xor dl, dl xchg dl, dh mov di, dx mov dh, substitute[di] mov sblocks[6], dh mov dx, ax shr dh, 4 xor dl, dl xchg dl, dh mov di, dx mov dh, substitute[di] mov sblocks[7], dh pop bx pop di
;замена, склеивание S-блоков mov dl, sblocks[1] rol dl, 4 or dl, sblocks[0] mov dh, sblocks[3] rol dh, 4 or dh, sblocks[2] mov ax, dx mov dl, sblocks[5] rol dl, 4 or dl, sblocks[4] mov dh, sblocks[7] rol dh, 4 or dh, sblocks[6] rol edx, 16 mov dx, ax ;rol edx, 16
rol edx, 11
inc cl
mov al, mode;вспоминаем флаг;режима cmp al, 0; jz cryptmode jmp decryptmode
cryptmode: cmp ch, 3;если идет [0..3];последний цикл применения ключа, идти по подключам в обратном;порядке je creverse_di cmp di, 7;если дошли до;последнего подключа, переходим к первому je creset_di inc di ;inc ch jmp func creset_di: inc ch cmp ch, 3 je func xor di, di
jmp func creverse_di: cmp cl, 23 je func dec di cmp cl, 32 je out_cycle jmp func
decryptmode: cmp ch, 0;если первый проход по;ключу, идем прямо je ddirect_di cmp di, 0 je dset_di dec di cmp cl, 32;завершение 32-х циклов;преобразования jnb out_cycle jmp func dset_di: mov di, 7 inc ch
jmp func ddirect_di: inc di cmp di, 7 ja dset_di cmp cl, 32;завершение 32-х циклов;преобразования jb func
out_cycle: pop ax;восстанавливаем левую;часть из стека rol eax, 16 pop ax xor eax, edx xchg eax, edx
;сохранение блоков в новой строке mov cl, mode cmp cl, 0 jne save_decrypt push si mov si, cb mov dword ptr cryptedstring[si], eax add si, 4 mov dword ptr cryptedstring[si], edx add si, 4 mov cb, si pop si
save_decrypt: push si mov si, dcb mov dword ptr decryptedstring[si], eax add si, 4 mov dword ptr decryptedstring[si], edx add si, 4 mov dcb, si pop si
mov cl, last cmp cl, 0 je maincycle;конец шифровки
mov cl, mode;смена режима после;шифровки cmp cl, 0 je for_decryption
mov si, cb mov byte ptr cryptedstring[si], '$' mov si, dcb mov byte ptr decryptedstring[si], '$'
lea dx, ds:[strng];вывод строки,;функция 9 прерывания ДОС 21 mov ah, 09h int 21h
lea dx, ds:[endstr];вывод строки,;функция 9 прерывания ДОС 21 mov ah, 09h int 21h
lea dx, ds:[cryptedstring];вывод;строки, функция 9 прерывания ДОС 21 mov ah, 09h int 21h
lea dx, ds:[endstr];вывод строки,;функция 9 прерывания ДОС 21 mov ah, 09h int 21h
lea dx, ds:[decryptedstring];вывод;строки, функция 9 прерывания ДОС 21 mov ah, 09h int 21h
ret main endp Cseg ends end start
Примечание: для сборки программы нужно ввести в командной строке следующее: tasm <имя_файла> tlink <имя_файла> /3
|