我想在程序集8086(TASM)中编写TEA算法,但我陷入了将明文(块)变量拆分为2个变量并将密钥拆分为4个变量(k1,k2,k3,k4)的第一步.
我知道明文(块)的限制是 64 位(8 字节)
并且密钥的限制是128位(16位)。
明文变量存储在ds中:
plainText db 8 dup('$')
这是明文的两个变量:
p1 db 4 dup('$')
p2 db 4 dup('$')
关键变量的存储方式如下:
key db 16 dup("$")
macro inputString storage
pusha
mov ah, 0ah
lea dx, storage
int 21h
popa
endm inputString
和 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
我尝试了很多方法,也查了很多资料,但找不到任何解决方案。
和 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
然后不需要复制,您可以轻松访问单独的变量。