.section .
data
msg_input: .asciz "Digite a mensagem: "
key_input: .asciz "\nDigite a chave de 16 caracteres: "
msg_encrypted: .asciz "Mensagem criptografada: "
newline: .asciz "\n"
.section .bss
.lcomm message, 256
.lcomm key, 16
.section .text
.global main
main:
# Exibir prompt e ler mensagem
mov $1, %rax # syscall write
mov $1, %rdi # stdout
lea msg_input(%rip), %rsi
mov $21, %rdx
syscall
# Ler mensagem
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 criptografia
lea message(%rip), %rdi
lea key(%rip), %rsi
call kriptus
# Exibir mensagem criptografada
mov $1, %rax # syscall write
mov $1, %rdi # stdout
lea msg_encrypted(%rip), %rsi
mov $26, %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: kriptus (criptografa usando XOR)
# ----------------------------------------
kriptus:
xor %rcx, %rcx # Zerar contador
loop_kriptus:
lea message(%rip), %rdi # Corrige acesso à variável global
movb (%rdi, %rcx, 1), %al
testb %al, %al
je done_kriptus
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_kriptus
done_kriptus:
ret