Use Assembly Language to create a Vigenère cipher program 1. Your code should us
ID: 3689496 • Letter: U
Question
Use Assembly Language to create a Vigenère cipher program
1. Your code should use STDIN and STDOUT for input and output. (This is the default.) Use redirection on the command line to read from a file and write to a file.
2. Your code should open a file, read it character by character and save it into an array.
3. When you get to the end of the file you should encode the contents of the array with a Vigenère cipher using the keyword CRYPTOGRAM, then print it out.
4. Maintain the distinction between upper-case and lower-case letters, and do not modify non-alphabetic characters. This is not very good for the security of your message, but the result will look neater.
5. This program should use glibc functions. In addition to printf(), you may need getchar() and putchar().
6. Assume that the input file contains just ASCII text Don't worry about what happens with non-text files.
7. Once the encoder is working, build a decoder by duplicating the code and changing the addition to a subtraction.
8. If you use printf() to output the array, remember that a null termination is required on a string.
Explanation / Answer
generateKey(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >):
push rbp
mov rbp, rsp
push rbx
sub rsp, 56
mov QWORD PTR [rbp-40], rdi
mov QWORD PTR [rbp-48], rsi
mov QWORD PTR [rbp-56], rdx
mov rax, QWORD PTR [rbp-48]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const
mov DWORD PTR [rbp-24], eax
mov DWORD PTR [rbp-20], 0
.L5:
mov eax, DWORD PTR [rbp-24]
cmp eax, DWORD PTR [rbp-20]
jne .L2
mov DWORD PTR [rbp-20], 0
.L2:
mov rax, QWORD PTR [rbp-56]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const
mov rbx, rax
mov rax, QWORD PTR [rbp-48]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const
cmp rbx, rax
sete al
test al, al
jne .L8
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
mov rax, QWORD PTR [rbp-56]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)
movzx eax, BYTE PTR [rax]
movsx edx, al
mov rax, QWORD PTR [rbp-56]
mov esi, edx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(char)
add DWORD PTR [rbp-20], 1
jmp .L5
.L8:
nop
mov rdx, QWORD PTR [rbp-56]
mov rax, QWORD PTR [rbp-40]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)
mov rax, QWORD PTR [rbp-40]
add rsp, 56
pop rbx
pop rbp
ret
cipherText(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >):
push rbp
mov rbp, rsp
push rbx
sub rsp, 56
mov QWORD PTR [rbp-40], rdi
mov QWORD PTR [rbp-48], rsi
mov QWORD PTR [rbp-56], rdx
mov rax, QWORD PTR [rbp-40]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()
mov DWORD PTR [rbp-20], 0
.L11:
mov eax, DWORD PTR [rbp-20]
movsx rbx, eax
mov rax, QWORD PTR [rbp-48]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const
cmp rbx, rax
setb al
test al, al
je .L15
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
mov rax, QWORD PTR [rbp-48]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)
movzx eax, BYTE PTR [rax]
movsx ebx, al
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
mov rax, QWORD PTR [rbp-56]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)
movzx eax, BYTE PTR [rax]
movsx eax, al
lea ecx, [rbx+rax]
mov edx, 1321528399
mov eax, ecx
imul edx
sar edx, 3
mov eax, ecx
sar eax, 31
sub edx, eax
mov eax, edx
mov DWORD PTR [rbp-24], eax
mov eax, DWORD PTR [rbp-24]
imul eax, eax, 26
sub ecx, eax
mov eax, ecx
mov DWORD PTR [rbp-24], eax
add DWORD PTR [rbp-24], 65
mov eax, DWORD PTR [rbp-24]
movsx edx, al
mov rax, QWORD PTR [rbp-40]
mov esi, edx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(char)
add DWORD PTR [rbp-20], 1
jmp .L11
mov rbx, rax
mov rax, QWORD PTR [rbp-40]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
mov rax, rbx
mov rdi, rax
call _Unwind_Resume
.L15:
nop
mov rax, QWORD PTR [rbp-40]
add rsp, 56
pop rbx
pop rbp
ret
originalText(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >):
push rbp
mov rbp, rsp
push rbx
sub rsp, 56
mov QWORD PTR [rbp-40], rdi
mov QWORD PTR [rbp-48], rsi
mov QWORD PTR [rbp-56], rdx
mov rax, QWORD PTR [rbp-40]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()
mov DWORD PTR [rbp-20], 0
.L18:
mov eax, DWORD PTR [rbp-20]
movsx rbx, eax
mov rax, QWORD PTR [rbp-48]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const
cmp rbx, rax
setb al
test al, al
je .L22
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
mov rax, QWORD PTR [rbp-48]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)
movzx eax, BYTE PTR [rax]
movsx ebx, al
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
mov rax, QWORD PTR [rbp-56]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)
movzx eax, BYTE PTR [rax]
movsx eax, al
sub ebx, eax
mov eax, ebx
lea ecx, [rax+26]
mov edx, 1321528399
mov eax, ecx
imul edx
sar edx, 3
mov eax, ecx
sar eax, 31
sub edx, eax
mov eax, edx
mov DWORD PTR [rbp-24], eax
mov eax, DWORD PTR [rbp-24]
imul eax, eax, 26
sub ecx, eax
mov eax, ecx
mov DWORD PTR [rbp-24], eax
add DWORD PTR [rbp-24], 65
mov eax, DWORD PTR [rbp-24]
movsx edx, al
mov rax, QWORD PTR [rbp-40]
mov esi, edx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(char)
add DWORD PTR [rbp-20], 1
jmp .L18
mov rbx, rax
mov rax, QWORD PTR [rbp-40]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
mov rax, rbx
mov rdi, rax
call _Unwind_Resume
.L22:
nop
mov rax, QWORD PTR [rbp-40]
add rsp, 56
pop rbx
pop rbp
ret
.LC0:
.string "HELLOWORLD"
.LC1:
.string "PROGRAM"
.LC2:
.string "Ciphertext : "
.LC3:
.string " "
.LC4:
.string "Original/Decrypted Text : "
main:
push rbp
mov rbp, rsp
push rbx
sub rsp, 376
lea rax, [rbp-242]
mov rdi, rax
call std::allocator<char>::allocator()
lea rdx, [rbp-242]
lea rax, [rbp-288]
mov esi, OFFSET FLAT:.LC0
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)
lea rax, [rbp-242]
mov rdi, rax
call std::allocator<char>::~allocator()
lea rax, [rbp-241]
mov rdi, rax
call std::allocator<char>::allocator()
lea rdx, [rbp-241]
lea rax, [rbp-320]
mov esi, OFFSET FLAT:.LC1
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)
lea rax, [rbp-241]
mov rdi, rax
call std::allocator<char>::~allocator()
lea rdx, [rbp-320]
lea rax, [rbp-240]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
lea rdx, [rbp-288]
lea rax, [rbp-208]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
lea rax, [rbp-352]
lea rdx, [rbp-240]
lea rcx, [rbp-208]
mov rsi, rcx
mov rdi, rax
call generateKey(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)
lea rax, [rbp-208]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
lea rax, [rbp-240]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
lea rdx, [rbp-352]
lea rax, [rbp-176]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
lea rdx, [rbp-288]
lea rax, [rbp-144]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
lea rax, [rbp-384]
lea rdx, [rbp-176]
lea rcx, [rbp-144]
mov rsi, rcx
mov rdi, rax
call cipherText(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)
lea rax, [rbp-144]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
lea rax, [rbp-176]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
mov esi, OFFSET FLAT:.LC2
mov edi, OFFSET FLAT:std::cout
call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
mov rdx, rax
lea rax, [rbp-384]
mov rsi, rax
mov rdi, rdx
call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
mov esi, OFFSET FLAT:.LC3
mov rdi, rax
call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
mov esi, OFFSET FLAT:.LC4
mov edi, OFFSET FLAT:std::cout
call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
mov rbx, rax
lea rdx, [rbp-352]
lea rax, [rbp-80]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
lea rdx, [rbp-384]
lea rax, [rbp-48]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
lea rax, [rbp-112]
lea rdx, [rbp-80]
lea rcx, [rbp-48]
mov rsi, rcx
mov rdi, rax
call originalText(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)
lea rax, [rbp-112]
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.