.section .
data
msg_input: .asciz "Digite a mensagem criptografada: "
key_input: .asciz "\nDigite a chave de 16 caracteres: "
msg_decrypted: .asciz "Mensagem descriptografada: "
newline: .asciz "\n"
.section .bss
.lcomm message, 256
.lcomm key, 16
.section .text
.global main
main:
# Exibir prompt e ler mensagem criptografada
mov $1, %rax # syscall write
mov $1, %rdi # stdout
lea msg_input(%rip), %rsi
mov $35, %rdx
syscall
# Ler mensagem criptografada
mov $0, %rax # syscall read
mov $0, %rdi # stdin
lea message(%rip), %rsi
mov $256, %rdx
syscall
# Exibir prompt e ler chave
mov $1, %rax # syscall write
mov $1, %rdi # stdout
lea key_input(%rip), %rsi
mov $34, %rdx
syscall
# Ler chave
mov $0, %rax # syscall read
mov $0, %rdi # stdin
lea key(%rip), %rsi
mov $16, %rdx
syscall
# Chamar função de descriptografia
lea message(%rip), %rdi
lea key(%rip), %rsi
call dkriptus
# Exibir mensagem descriptografada
mov $1, %rax # syscall write
mov $1, %rdi # stdout
lea msg_decrypted(%rip), %rsi
mov $29, %rdx
syscall
mov $1, %rax # syscall write
mov $1, %rdi # stdout
lea message(%rip), %rsi
mov $256, %rdx
syscall
# Encerrar programa
mov $60, %rax # syscall exit
xor %rdi, %rdi
syscall
# ----------------------------------------
# Função: dkriptus (descriptografa usando XOR)
# ----------------------------------------
dkriptus:
xor %rcx, %rcx # Zerar contador
loop_dkriptus:
lea message(%rip), %rdi # Corrige acesso à variável global
movb (%rdi, %rcx, 1), %al
testb %al, %al
je done_dkriptus
mov %rcx, %rdx
and $0xF, %rdx # Calcula (rcx % 16)
lea key(%rip), %rsi # Corrige acesso à variável global
xorb (%rsi, %rdx, 1), %al # XOR com chave circular
movb %al, (%rdi, %rcx, 1) # Escreve resultado de volta
inc %rcx
jmp loop_dkriptus
done_dkriptus:
ret