-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcifra.asm
342 lines (250 loc) · 13.9 KB
/
cifra.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
.686
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\msvcrt.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\masm32.lib
.data
mensagem1 db "Bem vindos ao nosso programa de criptografia!", 0ah, 0h ;Textos utilizados ao longo do programa
barra db "-------------------------------------", 0ah, 0h
options db "Selecione uma das opcoes:", 0ah, 0h
option1 db "1. Criptografar", 0ah, 0h
option2 db "2. Descriptografar", 0ah, 0h
option3 db "3. Sair", 0ah, 0h
confirm1 db "Voce selecionou a opcao de criptografar!", 0ah, 0h
confirm2 db "Voce selecionou a opcao de descriptografar!", 0ah, 0h
confirm3 db "Voce selecionou sair. Obrigado por utilizar nosso programa!", 0ah, 0h
arqentr db "Digite o nome do arquivo para ser lido: (Nao exceder 50 caracteres)", 0ah, 0h
arqsai db "Digite o nome do arquivo de saida: (Nao exceder 50 caracteres)", 0ah, 0h
chavecript db "Digite a chave de criptografia (0-7): ", 0ah, 0h
inputString db 4 dup(0) ;Array para armazenar a opção escolhida pelo usuário
inputStringArqEntr db 50 dup(0) ;Array para armazenar o nome do arquivo de entrada
inputStringArqSaid db 50 dup(0) ;Array para armazenar o nome do arquivo de saída
inputStringChave db 11 dup(0) ;Array para armazenar a chave digitada pelo usuário
fileBuffer dd 8 dup(0) ;Array do buffer do arquivo de entrada
fileBuffer2 dd 8 dup(0) ;Array que vai ser utilizado como buffer do arquivo de saída
fileHandle1 dd 0 ;Handle utilizado na função ReadFile
fileHandle2 dd 0 ;Handle utilizado na função WriteFile
inputHandle dd 0 ;Handle utilizado na função ReadConsole
outputHandle dd 0 ;Handle utilizado na função WriteConsole
write_count dd 0 ;Contador de caracteres escritos pelas funções WriteConsole e ReadConsole
readCount dd 0 ;Contador de caracteres lidos na função ReadFile
writeCount dd 0 ;Contador de caracteres escritos na função WriteFile
integer1 dd 0 ;Variável que recebe a opção escolhida pelo usuário no menu inicial
contador dd 0 ;Variável de contagem de ciclos na função criptografar e descriptografar
Chave dd 0 ;Variável que vai armazenar o valor lido na posição [contador] do array da chave
.code
start:
invoke GetStdHandle, STD_OUTPUT_HANDLE ;Usar a função GetStdHandle para guardar o handle de printar na variável outputHandle
mov outputHandle, eax
invoke WriteConsole, outputHandle, addr barra, sizeof barra, addr write_count, NULL
invoke WriteConsole, outputHandle, addr mensagem1, sizeof mensagem1, addr write_count, NULL
comeco:
xor eax, eax
invoke WriteConsole, outputHandle, addr barra, sizeof barra, addr write_count, NULL
invoke WriteConsole, outputHandle, addr options, sizeof options, addr write_count, NULL
invoke WriteConsole, outputHandle, addr option1, sizeof option1, addr write_count, NULL
invoke WriteConsole, outputHandle, addr option2, sizeof option2, addr write_count, NULL
invoke WriteConsole, outputHandle, addr option3, sizeof option3, addr write_count, NULL
invoke GetStdHandle, STD_INPUT_HANDLE ;Usar a função GetStdHandle para guardar o handle de input na variável inputHandle
mov inputHandle, eax
invoke ReadConsole, inputHandle, addr inputString, sizeof inputString, addr write_count, NULL
mov esi, offset inputString ; Tratamento de erro para reconhecimento do caracter de retorno
proximo:
mov al, [esi] ;
inc esi ;
cmp al, 13 ; Verificar se eh o caractere ASCII CR - FINALIZAR
jne proximo
dec esi ;
xor al, al ;
mov [esi], al ;
invoke atodw, addr inputString ; Com o input do usuário, selecionar qual função deseja executar
mov integer1, eax
cmp integer1, 1
je criptografar
cmp integer1, 2
je descriptografar
cmp integer1, 3
je fim
criptografar:
invoke WriteConsole, outputHandle, addr confirm1, sizeof confirm1, addr write_count, NULL ;Printar e receber o input do nome dos arquivos e chave
invoke WriteConsole, outputHandle, addr barra, sizeof barra, addr write_count, NULL
invoke WriteConsole, outputHandle, addr arqentr, sizeof arqentr, addr write_count, NULL
invoke ReadConsole, inputHandle, addr inputStringArqEntr, sizeof inputStringArqEntr, addr write_count, NULL
invoke WriteConsole, outputHandle, addr arqsai, sizeof arqsai, addr write_count, NULL
invoke ReadConsole, inputHandle, addr inputStringArqSaid, sizeof inputStringArqSaid, addr write_count, NULL
invoke WriteConsole, outputHandle, addr chavecript, sizeof chavecript, addr write_count, NULL
invoke ReadConsole, inputHandle, addr inputStringChave, sizeof inputStringChave, addr write_count, NULL
;----------------Fazer a abertura do arquivo que vai ser lido-----------------
mov esi, offset inputStringArqEntr ; Tratamento de erro para reconhecimento do caracter de retorno
proximo1:
mov al, [esi] ;
inc esi ;
cmp al, 13 ; Verificar se eh o caractere ASCII CR - FINALIZAR
jne proximo1
dec esi ;
xor al, al ;
mov [esi], al ;
invoke CreateFile, addr inputStringArqEntr, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
mov fileHandle1, eax
;------------Fazer a abertura do arquivo que vai ser escrito------------------
mov esi, offset inputStringArqSaid ; Tratamento de erro para reconhecimento do caracter de retorno
proximo2:
mov al, [esi] ;
inc esi ;
cmp al, 13 ; Verificar se eh o caractere ASCII CR - FINALIZAR
jne proximo2
dec esi ;
xor al, al ;
mov [esi], al ;
invoke CreateFile, addr inputStringArqSaid, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
mov fileHandle2, eax
lerescrevercripto:
;------------Zerar os buffers antes de cada ciclo de leitura e escrita----------
mov eax, 0
zerar:
mov fileBuffer[eax], 0
mov fileBuffer2[eax], 0
inc eax
cmp eax, 8
jl zerar
;-------------Fazer a leitura do arquivo que vai ser lido---------------------
invoke ReadFile, fileHandle1, addr fileBuffer, 8, addr readCount, NULL
cmp readCount, 0 ;Quando não ler 8 caracteres, fecha os arquivos de Read e Write pois já chegou no final do arquivo.
je terminarciclocripto
push offset inputStringChave
push offset fileBuffer2
push offset fileBuffer
call FazerCriptografia
;------------Fazer a escrita no arquivo de destino----------------------------
invoke WriteFile, fileHandle2, addr fileBuffer2, 8, addr writeCount, NULL
jmp lerescrevercripto ;Depois de escrever no arquivo de saída, voltar para o início do ciclo de criptografia
terminarciclocripto:
;------------Fazer o fechamento do arquivo de sa?da---------------------------
invoke CloseHandle, fileHandle1
;------------Fazer o fechamento do arquivo que foi lido-----------------------
invoke CloseHandle, fileHandle2
jmp comeco
descriptografar:
invoke WriteConsole, outputHandle, addr confirm2, sizeof confirm2, addr write_count, NULL ;Printar e receber o input do nome dos arquivos e chave
invoke WriteConsole, outputHandle, addr barra, sizeof barra, addr write_count, NULL
invoke WriteConsole, outputHandle, addr arqentr, sizeof arqentr, addr write_count, NULL
invoke ReadConsole, inputHandle, addr inputStringArqEntr, sizeof inputStringArqEntr, addr write_count, NULL
invoke WriteConsole, outputHandle, addr arqsai, sizeof arqsai, addr write_count, NULL
invoke ReadConsole, inputHandle, addr inputStringArqSaid, sizeof inputStringArqSaid, addr write_count, NULL
invoke WriteConsole, outputHandle, addr chavecript, sizeof chavecript, addr write_count, NULL
invoke ReadConsole, inputHandle, addr inputStringChave, sizeof inputStringChave, addr write_count, NULL
;----------------Fazer a abertura do arquivo que vai ser lido-----------------
mov esi, offset inputStringArqEntr ; Tratamento de erro para reconhecimento do caracter de retorno
proximo3:
mov al, [esi] ;
inc esi ;
cmp al, 13 ; Verificar se eh o caractere ASCII CR - FINALIZAR
jne proximo3
dec esi ;
xor al, al ;
mov [esi], al ;
invoke CreateFile, addr inputStringArqEntr, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
mov fileHandle1, eax
;------------Fazer a abertura do arquivo que vai ser escrito------------------
mov esi, offset inputStringArqSaid ; Tratamento de erro para reconhecimento do caracter de retorno
proximo4:
mov al, [esi] ;
inc esi ;
cmp al, 13 ; Verificar se eh o caractere ASCII CR - FINALIZAR
jne proximo4
dec esi ;
xor al, al ;
mov [esi], al ;
invoke CreateFile, addr inputStringArqSaid, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
mov fileHandle2, eax
lerescreverdescripto:
;------------Zerar o buffer antes de cada ciclo de leitura e escrita----------
mov eax, 0
zerar1:
mov fileBuffer[eax], 0
mov fileBuffer2[eax], 0
add eax, 4
cmp eax, 32
jl zerar1
;-------------Fazer a leitura do arquivo que vai ser lido---------------------
invoke ReadFile, fileHandle1, addr fileBuffer, 8, addr readCount, NULL
cmp readCount, 0 ;Quando não ler 8 caracteres, fecha os arquivos de Read e Write pois já chegou no final do arquivo.
je terminarciclodescripto
push offset inputStringChave
push offset fileBuffer2
push offset fileBuffer
call FazerDescriptografia
;------------Fazer a escrita no arquivo de destino----------------------------
invoke WriteFile, fileHandle2, addr fileBuffer2, 8, addr writeCount, NULL
jmp lerescreverdescripto ;Depois de escrever no arquivo de sa?da, voltar para o in?cio do ciclo de descriptografia
terminarciclodescripto:
;------------Fazer o fechamento do arquivo de sa?da---------------------------
invoke CloseHandle, fileHandle1
;------------Fazer o fechamento do arquivo que foi lido-----------------------
invoke CloseHandle, fileHandle2
jmp comeco
FazerCriptografia: ;Função de Criptografar
push ebp
mov ebp, esp
sub esp, 4
mov ecx, DWORD PTR [ebp+8] ; Aponta para o buffer do arquivo de entrada (fileBuffer)
mov ebx, DWORD PTR [ebp+12] ; Aponta para o buffer do arquivo de saida (fileBuffer2)
mov eax, DWORD PTR [ebp+16] ; Aponta para a chave de criptografia
mov DWORD PTR [ebp-4], eax
mov contador, 0
ciclocripto:
mov esi, DWORD PTR [ebp-4]
add esi, contador
mov al, [esi]
sub al, 48
movzx eax, al
mov Chave, eax ;Chave vira um modificador de acesso (representando em qual posicao mostrada pela chave, o caracter indicado na posicao filebuffer[cont] deve ir)
mov esi, ecx ;Colocar em esi o ponteiro para o filebuffer
add esi, contador ;Adicionar com o contador do ciclo qual caracter do filebuffer estamos acessando [0], [1], [2]....
mov edi, ebx ;Atribuir a edi o ponteiro para o filebuffer2 que eh o filebuffer de saida
mov al, [esi] ;Mover para al o conte?do do filebuffer apontado por esi
add edi, Chave ;Adicionar ? edi (usando a Chave) a posi??o que o caracter deve ficar
mov [edi], al ;Mover para o conte?do da posi??o que edi aponta o al (o que existe no esi na posi??o indicada)
inc contador ;Contador que ? usado para avan?ar no ?ndice de filebuffer. A exemplo de filebuffer[0] no primieiro ciclo e filebuffer[1] no segundo
cmp contador, 8
jl ciclocripto
mov esp, ebp
pop ebp
ret 12
FazerDescriptografia: ; Função de Descriptografar
push ebp
mov ebp, esp
sub esp, 4
mov ecx, DWORD PTR [ebp+8] ; Aponta para o buffer do arquivo de entrada (fileBuffer)
mov ebx, DWORD PTR [ebp+12] ; Aponta para o buffer do arquivo de saida (fileBuffer2)
mov eax, DWORD PTR [ebp+16] ; Aponta para a chave de descriptografia
mov DWORD PTR [ebp-4], eax
mov contador, 0
ciclodescripto:
mov esi, DWORD PTR [ebp-4]
add esi, contador
mov al, [esi]
sub al, 48
movzx eax, al
mov Chave, eax ;Chave vira um modificador de acesso (representando em qual posi??o mostrada pela chave, o caracter indicado na posi?ao filebuffer2[cont] deve ir)
mov esi, ecx ;Colocar em esi o ponteiro para o filebuffer
add esi, Chave ;Adicionar com o valor da Chave qual caracter do filebuffer estamos acessando [0], [1], [2]....
mov edi, ebx ;Atribuir a edi o ponteiro para o filebuffer2 que ? o filebuffer de sa?da
mov al, [esi] ;Mover para al o conte?do do filebuffer apontado por esi
add edi, contador ;Adicionar ? edi (usando o contador) a posi??o que o caracter deve ficar para descriptografar
mov [edi], al ;Mover para o conte?do da posi??o que edi aponta o al (o que existe no esi na posi??o indicada)
inc contador ;Contador que ? usado para avan?ar no ?ndice de filebuffer2. A exemplo de filebuffer2[0] no primieiro ciclo e filebuffer2[1] no segundo
cmp contador, 8
jl ciclodescripto
mov esp, ebp
pop ebp
ret 12
fim:
invoke WriteConsole, outputHandle, addr confirm3, sizeof confirm3, addr write_count, NULL
invoke ExitProcess, 0
end start