Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

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

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote