Need help completing an encryption algorithmn for assembly. Project Detail The e
ID: 3842776 • Letter: N
Question
Need help completing an encryption algorithmn for assembly.
Project Detail
The encryption is Adobe type 1 font encryption algorithm encryption this can be seen on pages 61 to 65 on the pdf file https://www-cdf.fnal.gov/offline/PostScript/T1_SPEC.PDF
I'm using MASM32.
So heres my code so far.
.model tiny
.data
filename db "file.txt", 0
bufferSize = 512
filehandle dw ?
buffer db bufferSize dup (0)
r dw ?
c1 dw 52845
c2 dw 22719
cipher db ?
message1 db 'Error opening the file. $'
message2 db 'Error reading the file. $'
message3 db 'Error closing the file. $'
.code
org 100h
start:
call openfile
call readfile
call closefile
call Exit
;the procedures
open:
mov ah,3DH
mov al,0
mov dx, offset filename
int 21h
jc openErr
mov filehandle, ax
ret
readfile: ;reads the file
mov ah, 3Fh
mov bx, filehandle
mov cx, bufferSize
mov dx, offset buffer
int 21h
cmp ax,0
jc readErr
;displays content of file
call clear
mov ah, 9
mov dx, offset buffer
int 21h
ret
closefile:
mov ah, 3Eh
mov bx, filehandle
int 21h
jc closeErr
ret
;encrypt:
;need help with this
;decrypt:
;need help with this
clear: ;clears the screen
mov ax,003h
int 10h
ret
Exit:
mov ax, 4C00h
int 21h
newline: ;prints a newline
mov ah, 2
mov dl, 0DH
int 21h
mov dl, 0AH
int 21h
ret
;error messages
openErr :
call newline
lea DX,message1 ;set up pointer to error message
mov AH,9 ;display string function
int 21H ;DOS call
stc ;set error flag
ret
readErr :
call newline
lea DX,message2 ;set up pointer to error message
mov AH,9 ;display string function
int 21H ;DOS call
stc ;set error flag
ret
closeErr :
call newline
lea DX,message3 ;set up pointer to error message
mov AH,9 ;display string function
int 21H ;DOS call
stc ;set error flag
ret
end start
Explanation / Answer
Answer:
Assembly Language Code :
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], rdi
pxor xmm0, xmm0
cvtsi2sdq xmm0, QWORD PTR [rbp-8]
call sqrt
movq rax, xmm0
mov QWORD PTR [rbp-16], rax
movsd xmm0, QWORD PTR [rbp-16]
leave
ret
prime(long):
push rbp
mov rbp, rsp
sub rsp, 32
mov QWORD PTR [rbp-24], rdi
mov rax, QWORD PTR [rbp-24]
mov rdi, rax
call __gnu_cxx::__enable_if<std::__is_integer<long>::__value, double>::__type std::sqrt<long>(long)
cvttsd2si rax, xmm0
mov QWORD PTR j[rip], rax
mov DWORD PTR [rbp-4], 2
.L7:
mov eax, DWORD PTR [rbp-4]
movsx rdx, eax
mov rax, QWORD PTR j[rip]
cmp rdx, rax
jg .L4
mov eax, DWORD PTR [rbp-4]
movsx rcx, eax
mov rax, QWORD PTR [rbp-24]
cqo
idiv rcx
mov rax, rdx
test rax, rax
jne .L5
mov eax, 0
jmp .L6
.L5:
add DWORD PTR [rbp-4], 1
jmp .L7
.L4:
mov eax, 1
.L6:
leave
ret
.LC0:
.string " ENTER FIRST PRIME NUMBER "
.LC1:
.string " WRONG INPUT "
.LC2:
.string " ENTER ANOTHER PRIME NUMBER "
.LC3:
.string " ENTER MESSAGE "
.LC4:
.string " POSSIBLE VALUES OF e AND d ARE "
.LC5:
.string " "
.LC6:
.string " "
main:
push rbp
mov rbp, rsp
push rbx
sub rsp, 8
mov esi, OFFSET FLAT:.LC0
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 esi, OFFSET FLAT:p
mov edi, OFFSET FLAT:std::cin
call std::basic_istream<char, std::char_traits<char> >::operator>>(long&)
mov rax, QWORD PTR p[rip]
mov rdi, rax
call prime(long)
cdqe
mov QWORD PTR flag[rip], rax
mov rax, QWORD PTR flag[rip]
test rax, rax
jne .L9
mov esi, OFFSET FLAT:.LC1
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 edi, 1
call exit
.L9:
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 esi, OFFSET FLAT:q
mov edi, OFFSET FLAT:std::cin
call std::basic_istream<char, std::char_traits<char> >::operator>>(long&)
mov rax, QWORD PTR q[rip]
mov rdi, rax
call prime(long)
cdqe
mov QWORD PTR flag[rip], rax
mov rax, QWORD PTR flag[rip]
test rax, rax
je .L10
mov rdx, QWORD PTR p[rip]
mov rax, QWORD PTR q[rip]
cmp rdx, rax
jne .L11
.L10:
mov esi, OFFSET FLAT:.LC1
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 edi, 1
call exit
.L11:
mov esi, OFFSET FLAT:.LC3
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 rax, QWORD PTR stdin[rip]
mov rdi, rax
call fflush
mov esi, OFFSET FLAT:msg
mov edi, OFFSET FLAT:std::cin
call std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&, char*)
mov QWORD PTR i[rip], 0
.L13:
mov rax, QWORD PTR i[rip]
movzx eax, BYTE PTR msg[rax]
test al, al
je .L12
mov rax, QWORD PTR i[rip]
mov rdx, QWORD PTR i[rip]
movzx edx, BYTE PTR msg[rdx]
movsx rdx, dl
mov QWORD PTR m[0+rax*8], rdx
mov rax, QWORD PTR i[rip]
add rax, 1
mov QWORD PTR i[rip], rax
jmp .L13
.L12:
mov rdx, QWORD PTR p[rip]
mov rax, QWORD PTR q[rip]
imul rax, rdx
mov QWORD PTR n[rip], rax
mov rax, QWORD PTR p[rip]
lea rdx, [rax-1]
mov rax, QWORD PTR q[rip]
sub rax, 1
imul rax, rdx
mov QWORD PTR t[rip], rax
call ce()
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 QWORD PTR i[rip], 0
.L15:
mov rax, QWORD PTR j[rip]
lea rdx, [rax-1]
mov rax, QWORD PTR i[rip]
cmp rdx, rax
jle .L14
mov rax, QWORD PTR i[rip]
mov rbx, QWORD PTR d[0+rax*8]
mov rax, QWORD PTR i[rip]
mov rax, QWORD PTR e[0+rax*8]
mov rsi, rax
mov edi, OFFSET FLAT:std::cout
call std::basic_ostream<char, std::char_traits<char> >::operator<<(long)
mov esi, OFFSET FLAT:.LC5
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 rsi, rbx
mov rdi, rax
call std::basic_ostream<char, std::char_traits<char> >::operator<<(long)
mov esi, OFFSET FLAT:.LC6
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 rax, QWORD PTR i[rip]
add rax, 1
mov QWORD PTR i[rip], rax
jmp .L15
.L14:
call encrypt()
call decrypt()
mov eax, 0
add rsp, 8
pop rbx
pop rbp
ret
ce():
push rbp
mov rbp, rsp
sub rsp, 16
mov DWORD PTR [rbp-4], 0
mov QWORD PTR i[rip], 2
.L22:
mov rdx, QWORD PTR i[rip]
mov rax, QWORD PTR t[rip]
cmp rdx, rax
jge .L24
mov rax, QWORD PTR t[rip]
mov rcx, QWORD PTR i[rip]
cqo
idiv rcx
mov rax, rdx
test rax, rax
je .L25
mov rax, QWORD PTR i[rip]
mov rdi, rax
call prime(long)
cdqe
mov QWORD PTR flag[rip], rax
mov rax, QWORD PTR flag[rip]
cmp rax, 1
jne .L20
mov rdx, QWORD PTR i[rip]
mov rax, QWORD PTR p[rip]
cmp rdx, rax
je .L20
mov rdx, QWORD PTR i[rip]
mov rax, QWORD PTR q[rip]
cmp rdx, rax
je .L20
mov rdx, QWORD PTR i[rip]
mov eax, DWORD PTR [rbp-4]
cdqe
mov QWORD PTR e[0+rax*8], rdx
mov eax, DWORD PTR [rbp-4]
cdqe
mov rax, QWORD PTR e[0+rax*8]
mov rdi, rax
call cd(long)
mov QWORD PTR flag[rip], rax
mov rax, QWORD PTR flag[rip]
test rax, rax
jle .L21
mov rdx, QWORD PTR flag[rip]
mov eax, DWORD PTR [rbp-4]
cdqe
mov QWORD PTR d[0+rax*8], rdx
add DWORD PTR [rbp-4], 1
.L21:
cmp DWORD PTR [rbp-4], 99
je .L26
jmp .L20
.L25:
nop
.L20:
mov rax, QWORD PTR i[rip]
add rax, 1
mov QWORD PTR i[rip], rax
jmp .L22
.L26:
nop
.L24:
nop
leave
ret
cd(long):
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-24], rdi
mov QWORD PTR [rbp-8], 1
.L30:
mov rax, QWORD PTR t[rip]
add QWORD PTR [rbp-8], rax
mov rax, QWORD PTR [rbp-8]
cqo
idiv QWORD PTR [rbp-24]
mov rax, rdx
test rax, rax
jne .L30
mov rax, QWORD PTR [rbp-8]
cqo
idiv QWORD PTR [rbp-24]
pop rbp
ret
.LC7:
.string " THE ENCRYPTED MESSAGE IS "
.LC8:
.string "%c"
encrypt():
push rbp
mov rbp, rsp
sub rsp, 48
mov rax, QWORD PTR e[rip]
mov QWORD PTR [rbp-16], rax
mov QWORD PTR i[rip], 0
mov edi, OFFSET FLAT:msg
call strlen
mov QWORD PTR [rbp-24], rax
.L36:
mov rax, QWORD PTR i[rip]
cmp rax, QWORD PTR [rbp-24]
je .L33
mov rax, QWORD PTR i[rip]
mov rax, QWORD PTR m[0+rax*8]
mov QWORD PTR [rbp-32], rax
sub QWORD PTR [rbp-32], 96
mov QWORD PTR [rbp-8], 1
mov QWORD PTR j[rip], 0
.L35:
mov rax, QWORD PTR j[rip]
cmp rax, QWORD PTR [rbp-16]
jge .L34
mov rax, QWORD PTR [rbp-8]
imul rax, QWORD PTR [rbp-32]
mov QWORD PTR [rbp-8], rax
mov rcx, QWORD PTR n[rip]
mov rax, QWORD PTR [rbp-8]
cqo
idiv rcx
mov QWORD PTR [rbp-8], rdx
mov rax, QWORD PTR j[rip]
add rax, 1
mov QWORD PTR j[rip], rax
jmp .L35
.L34:
mov rax, QWORD PTR i[rip]
mov rdx, QWORD PTR [rbp-8]
mov QWORD PTR temp[0+rax*8], rdx
mov rax, QWORD PTR [rbp-8]
add rax, 96
mov QWORD PTR [rbp-40], rax
mov rax, QWORD PTR i[rip]
mov rdx, QWORD PTR [rbp-40]
mov QWORD PTR en[0+rax*8], rdx
mov rax, QWORD PTR i[rip]
add rax, 1
mov QWORD PTR i[rip], rax
jmp .L36
.L33:
mov rax, QWORD PTR i[rip]
mov QWORD PTR en[0+rax*8], -1
mov esi, OFFSET FLAT:.LC7
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 QWORD PTR i[rip], 0
.L38:
mov rax, QWORD PTR i[rip]
mov rax, QWORD PTR en[0+rax*8]
cmp rax, -1
je .L39
mov rax, QWORD PTR i[rip]
mov rax, QWORD PTR en[0+rax*8]
mov rsi, rax
mov edi, OFFSET FLAT:.LC8
mov eax, 0
call printf
mov rax, QWORD PTR i[rip]
add rax, 1
mov QWORD PTR i[rip], rax
jmp .L38
.L39:
nop
leave
ret
__static_initialization_and_destruction_0(int, int):
push rbp
mov rbp, rsp
sub rsp, 16
mov DWORD PTR [rbp-4], edi
mov DWORD PTR [rbp-8], esi
cmp DWORD PTR [rbp-4], 1
jne .L42
cmp DWORD PTR [rbp-8], 65535
jne .L42
mov edi, OFFSET FLAT:std::__ioinit
call std::ios_base::Init::Init()
mov edx, OFFSET FLAT:__dso_handle
mov esi, OFFSET FLAT:std::__ioinit
mov edi, OFFSET FLAT:std::ios_base::Init::~Init()
call __cxa_atexit
.L42:
nop
leave
ret
_GLOBAL__sub_I_p:
push rbp
mov rbp, rsp
mov esi, 65535
mov edi, 1
call __static_initialization_and_destruction_0(int, int)
pop rbp
ret
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.