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

(The answer should be in Assembly Language, you can use the Irvine32.inc library

ID: 3716572 • Letter: #

Question

(The answer should be in Assembly Language, you can use the Irvine32.inc library) Revise the encryption program in Section 6.3.4 in the following manner: Create an encryption
key consisting of multiple characters. Use this key to encrypt and decrypt the plaintext by XORing
each character of the key against a corresponding byte in the message. Repeat the key as
many times as necessary until all plain text bytes are translated. Suppose, for example, the key
were equal to “ABXmv#7”. This is how the key would align with the plain text bytes:

For reference 6.3.4:

; Encryption Program (Encrypt.asm)
INCLUDE Irvine32.inc
KEY = 239 ; any value between 1-255
BUFMAX = 128 ; maximum buffer size
.data
sPrompt BYTE "Enter the plain text:",0
sEncrypt BYTE "Cipher text: ",0
sDecrypt BYTE "Decrypted: ",0
buffer BYTE BUFMAX+1 DUP(0)
bufSize DWORD ?
.code
main PROC
call InputTheString ; input the plain text
call TranslateBuffer ; encrypt the buffer
mov edx,OFFSET sEncrypt ; display encrypted message
call DisplayMessage
call TranslateBuffer ; decrypt the buffer
mov edx,OFFSET sDecrypt ; display decrypted message
call DisplayMessage
exit
main ENDP
;-----------------------------------------------------
InputTheString PROC
;
; Prompts user for a plaintext string. Saves the string
; and its length.
; Receives: nothing
; Returns: nothing
;-----------------------------------------------------
pushad ; save 32-bit registers
mov edx,OFFSET sPrompt ; display a prompt
call WriteString
mov ecx,BUFMAX ; maximum character count
mov edx,OFFSET buffer ; point to the buffer
call ReadString ; input the string
mov bufSize,eax ; save the length
call Crlf
popad
ret
InputTheString ENDP
;-----------------------------------------------------
DisplayMessage PROC
;
; Displays the encrypted or decrypted message.
; Receives: EDX points to the message
; Returns: nothing
;-----------------------------------------------------

pushad
call WriteString
mov edx,OFFSET buffer ; display the buffer
call WriteString
call Crlf
call Crlf
popad
ret
DisplayMessage ENDP
;-----------------------------------------------------
TranslateBuffer PROC
;
; Translates the string by exclusive-ORing each
; byte with the encryption key byte.
; Receives: nothing
; Returns: nothing
;-----------------------------------------------------
pushad
mov ecx,bufSize ; loop counter
mov esi,0 ; index 0 in buffer
L1:
xor buffer[esi],KEY ; translate a byte
inc esi ; point to next byte
loop L1
popad
ret
TranslateBuffer ENDP
END main

Plain text Th S (The key repeats until it equals the length of the plain text.

Explanation / Answer

INCLUDE Irvine32.inc

KEY = 239           ; any value between 1-255

BUFMAX = 128        ; maximum buffer size

.data

sPrompt BYTE "Enter the plain text: ",0

sEncrypt BYTE "Cipher text:          ",0

sDecrypt BYTE "Decrypted:            ",0

buffer   BYTE   BUFMAX+1 DUP(0)

bufSize DWORD ?

.code

main PROC

    call    InputTheString      ; input the plain text

    call    TranslateBuffer ; encrypt the buffer

    mov edx,OFFSET sEncrypt ; display encrypted message

    call    DisplayMessage

    call    TranslateBuffer     ; decrypt the buffer

    mov edx,OFFSET sDecrypt ; display decrypted message

    call    DisplayMessage

    exit

main ENDP

    pushad

    mov edx,OFFSET sPrompt ; display a prompt

    call    WriteString

    mov ecx,BUFMAX      ; maximum character count

    mov edx,OFFSET buffer   ; point to the buffer

    call    ReadString          ; input the string

    mov bufSize,eax         ; save the length

    call    Crlf

    popad

    ret

InputTheString ENDP

    pushad

    call    WriteString

    mov edx,OFFSET buffer   ; display the buffer

    call    WriteString

    call    Crlf

    call    Crlf

    popad

    ret

DisplayMessage ENDP

    pushad

    mov ecx,bufSize     ; loop counter

    mov esi,0           ; index 0 in buffer

L1:

    xor buffer[esi],KEY ; translate a byte

    inc esi             ; point to next byte

    loop    L1

    popad

    ret

TranslateBuffer ENDP

END main