汇编8086 TASM - TEA算法 - 如何将8字节变量拆分为两个不同的4字节变量?

问题描述 投票:0回答:1

我想在程序集8086(TASM)中编写TEA算法,并且我陷入了将plaintext(块)变量拆分为2个变量并将key拆分为4个变量(k1,k2,k3)的第一步,k4)。
我知道明文(块)的限制是64位(8字节)
key的限制是128位(16字节)。

plaintext变量存储在数据部分:

plainText db 8 dup('$')

这是明文的两个变量:

p1 db 4 dup('$')
p2 db 4 dup('$')

key变量的存储方式如下:

key db 16 dup("$")

和 4 个分割键:

k0 db ?
k1 db ?
k2 db ?
k3 db ?

这是我当前用于获取用户输入的加密部分:

proc encryptionSelection
    print plainTextPrompt
    inputString [plainText] ; Block Limit: 64 bits -> 8 bytes

    call printLine
    print p1
    call printLine
    print p2

    print keyPrompt
    inputString [key] ; Key Limit:  128 bits -> 16 bytes

    ; Encryption Logic Here...
    ret
endp encryptionSelection
macro inputString storage
    pusha
    mov ah, 0ah
    lea dx, storage
    int 21h
    popa
endm inputString
macro print value
    pusha
    mov ah, 09h
    mov dx, offset value
    int 21h
    popa

endm print

我尝试了很多方法并搜索了很多,但我找不到任何解决方案。

assembly encryption input x86-16 tasm
1个回答
0
投票

和 4 个分割键:

k0 db ?  
k1 db ?  
k2 db ?  
k3 db ?

key有16个字节,所以分成4个,我希望这些是双字而不是字节!

plainText db 8 dup('$')
p1 db 4 dup('$')
p2 db 4 dup('$')

您的 inputString 宏正在使用 DOS.BufferedInput 函数 0Ah,并且您没有向 DOS 提供正确的缓冲区!请参阅缓冲输入如何工作
plainText 的正确定义是:

plainText db 9, 0, 9 dup('$')
p1 db 4 dup('$')
p2 db 4 dup('$')

分割输入的 8 个字节的一种方法是复制以下方式:

print plainTextPrompt
inputString [plainText] ; Block Limit: 64 bits -> 8 bytes
mov  di, offset p1
mov  si, offset plainText+2
mov  cx, 8
rep movsb

但最有效的方法是重新组织缓冲区:

plainText db 9, 0
p1        dd 0      ;;
p2        dd 0      ; Together 9 bytes of inputbuffer
          db 0      ;;
          db 0      ; 1 extra byte for word-alignment
key       db 17, 0
k0        dd 0      ;;
k1        dd 0      ;;;
k3        dd 0      ; Together 17 bytes of inputbuffer
k4        dd 0      ;;;
          db 0      ;;
          db 0      ; 1 extra byte for word-alignment

然后不需要复制,您可以轻松访问单独的变量。

© www.soinside.com 2019 - 2024. All rights reserved.