我正在尝试用汇编语言(8086 TASM)实现TEA算法。然而,我在两个方面遇到了困难
字符串输入:我需要帮助实现一种机制,以便在我的汇编程序中从用户输入字符串。
十六进制转换:在获得用户输入后,我的目标是将输入字符串的每个字母转换为其相应的十六进制表示形式,为TEA加密做好准备。我正在寻求有关如何有效完成此转换的指导。
加密消息解密:使用 TEA 算法加密后,我在将生成的加密消息转换回可读字符串字母时遇到了困难。我需要帮助来解密加密消息并将其转换为其原始形式。
我已经成功实现了TEA算法的加密和解密功能。这些函数似乎可以正确执行加密和解密操作。然而,我一直专注于处理字符串输入并将它们转换为适合加密的格式。此外,加密后,输出包含未知符号,我需要帮助将其转换为可读的加密字符串。
这是我的加密/解密函数:
proc encrypt
pusha
mov cx, 32
encryptLoop:
; sum += delta
mov ax, [delta]
add [sum], ax
xor eax,eax
; ((p2 << 4) + k0)
mov dx, [p2]
shl dx, 4
add dx, [k0]
; (p2 + sum)
mov bx, [p2]
add bx, [sum]
; ((p2 << 4) + k0) ^ (p2 + sum)
xor dx, bx
xor bx, bx
; ((p2 >> 5) + k1)
mov bx, [p2]
shr bx, 5
add bx, [k1]
; ((p2 << 4) + k0) ^ (p2 + sum) ^ ((p2 >> 5) + k1)
xor dx, bx
add [pe1], dx
; ((p1 << 4) + k2)
mov dx, [p1]
shl dx, 4
add dx, [k2]
; (p1 + sum)
mov bx, [p1]
add bx, [sum]
; ((p0 << 4) + k2) ^ (p0 + sum)
xor dx, bx
xor bx, bx
; ((p1 >> 5 ) + k3)
mov bx,[p1]
shr bx, 5
add bx, [k3]
; ((p0 << 4) + k2) ^ (p0 + sum) ^ ((p1 >> 5 ) + k3)
xor dx, bx
add [pe2], dx
loop encryptLoop
popa
ret
endp encrypt
proc decrypt
pusha
mov cx, 32
decryptLoop:
; ((p1 << 4) + k2)
mov dx, [p1]
shl dx, 4
add dx, [k2]
; (p1 + sum)
mov bx, [p1]
add bx, [sum]
; ((p0 << 4) + k2) ^ (p0 + sum)
xor dx, bx
xor bx, bx
; ((p1 >> 5 ) + k3)
mov bx,[p1]
shr bx, 5
add bx, [k3]
; ((p0 << 4) + k2) ^ (p0 + sum) ^ ((p1 >> 5 ) + k3)
xor dx, bx
sub [pe2], dx
xor ax,ax
; ((p2 << 4) + k0)
mov dx, [p2]
shl dx, 4
add dx, [k0]
; (p2 + sum)
mov bx, [p2]
add bx, [sum]
; ((p1 << 4) + k0) ^ (p1 + sum)
xor dx, bx
xor bx, bx
; ((p2 >> 5) + k1)
mov bx, [p2]
shr bx, 5
add bx, [k1]
; ((p2 << 4) + k0) ^ (p2 + sum) ^ ((p2 >> 5) + k1)
xor dx, bx
sub [pe1], dx
; sum -= delta
mov ax, [delta]
sub [sum], ax
loop decryptLoop
popa
ret
endp decrypt
DS部分:
delta dw 79b9h ; 79b9h for 16 bits, 9e3779b9h for 32 bits
sum dw 0
p1 dw 0
p2 dw 0
k0 dw 0
k1 dw 0
k2 dw 0
k3 dw 0
; Two part of the plaintext after encryption
pe1 dw 0
pe2 dw 0
我对
p1,p2,k0,k1,k2,k3
使用了硬编码值
在调用
encryption:
之前内存看起来是这样的
Delta: 9e3779b9h
p1 : 20656349h = 'Ice '
p2 : 21414554h = 'TEA!'
k1 : 00000016h = 22
k2 : 0000000bh = 11
k3 : 00000021h = 33
k4 : 00000003h = 3
-d ds:0
0EED:0000 B9 79 37 9E 00 00 00 00-49 63 65 20 54 45 41 21 .y7.....Ice TEA!
0EED:0010 16 00 00 00 0B 00 00 00-21 00 00 00 03 00 00 00 ........!.......
encryption
之后:
Delta: 9e3779b9h
p1 : c6ef3720h (encrypted)
p2 : c96bcfebh (encrypted)
k1 : 00000016h = 22
k2 : 0000000bh = 11
k3 : 00000021h = 33
k4 : 00000003h = 3
-d ds:0
0EED:0000 B9 79 37 9E 20 37 EF C6-7A D0 EA DC 1E FC 4C 9A .y7. 7..z.....L.
0EED:0010 16 00 00 00 0B 00 00 00-21 00 00 00 03 00 00 00 ........!.......
现在
decryption
,恢复正常:
Delta: 9e3779b9h
p1 : 20656349h = 'Ice '
p2 : 21414554h = 'TEA!'
k1 : 00000016h = 22
k2 : 0000000bh = 11
k3 : 00000021h = 33
k4 : 00000003h = 3
-d ds:0
0EED:0000 B9 79 37 9E 00 00 00 00-49 63 65 20 54 45 41 21 .y7.....Ice TEA!
0EED:0010 16 00 00 00 0B 00 00 00-21 00 00 00 03 00 00 00 ........!.......
完整代码如下:
.386
ideal
model small
stack 256
segment datasg
delta dd 9e3779b9h ; 79b9h for 16 bits, 9e3779b9h for 32 bits
sum dd 0
p1 dd 20656349h
p2 dd 21414554h
k0 dd 22
k1 dd 11
k2 dd 33
k3 dd 3
; Two part of the plaintext after encryption
pe1 dd 0
pe2 dd 0
ends
assume ds:datasg,cs:code
segment code
start:
mov ax,datasg
mov ds,ax
call encrypt
call decrypt
mov ax,4c00h
int 21h
proc encrypt
pusha
mov cx, 32
encryptLoop:
; sum += delta
mov eax, [delta]
add [sum], eax
xor eax,eax
; ((p2 << 4) + k0)
mov edx, [p2]
shl edx, 4
add edx, [k0]
; (p2 + sum)
mov ebx, [p2]
add ebx, [sum]
; ((p2 << 4) + k0) ^ (p2 + sum)
xor edx, ebx
xor ebx, ebx
; ((p2 >> 5) + k1)
mov ebx, [p2]
shr ebx, 5
add ebx, [k1]
; ((p2 << 4) + k0) ^ (p2 + sum) ^ ((p2 >> 5) + k1)
xor edx, ebx
;---
add [p1],edx
;add [pe1], edx
; ((p1 << 4) + k2)
mov edx, [p1]
shl edx, 4
add edx, [k2]
; (p1 + sum)
mov ebx, [p1]
add ebx, [sum]
; ((p0 << 4) + k2) ^ (p0 + sum)
xor edx, ebx
xor ebx, ebx
; ((p1 >> 5 ) + k3)
mov ebx,[p1]
shr ebx, 5
add ebx, [k3]
; ((p0 << 4) + k2) ^ (p0 + sum) ^ ((p1 >> 5 ) + k3)
xor edx, ebx
add [p2],edx
;add [pe2], edx
loop encryptLoop
popa
ret
endp encrypt
proc decrypt
pusha
mov cx, 32
decryptLoop:
; ((p1 << 4) + k2)
mov edx, [p1]
shl edx, 4
add edx, [k2]
; (p1 + sum)
mov ebx, [p1]
add ebx, [sum]
; ((p1 << 4) + k2) ^ (p1 + sum)
xor edx, ebx
xor ebx, ebx
; ((p1 >> 5) + k3)
mov ebx, [p1]
shr ebx, 5
add ebx, [k3]
; ((p1 << 4) + k0) ^ (p2 + sum) ^ ((p1 >> 5) + k3)
xor edx, ebx
sub [p2], edx
; ((p2 << 4) + k0)
mov edx, [p2]
shl edx, 4
add edx, [k0]
; (p2 + sum)
mov ebx, [p2]
add ebx, [sum]
; ((p2 << 4) + k0) ^ (p2 + sum)
xor edx, ebx
xor ebx, ebx
; ((p2 >> 5 ) + k1)
mov ebx,[p2]
shr ebx, 5
add ebx, [k1]
; ((p2 << 4) + k0) ^ (p2 + sum) ^ ((p2 >> 5 ) + k1)
xor edx, ebx
sub [p1], edx
; sum -= delta
mov eax, [delta]
sub [sum], eax
loop decryptLoop
popa
ret
endp decrypt
ends
end start