Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Приложение А. Листинг А.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

 







Дата добавления: 2015-10-19; просмотров: 173. Нарушение авторских прав


Рекомендуемые страницы:


Studopedia.info - Студопедия - 2014-2019 год . (0.02 сек.) русская версия | украинская версия