在汇编8086 TASM中与TEA算法作斗争

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

我正在尝试用汇编语言(8086 TASM)实现TEA算法。然而,我在两个方面遇到了困难

  1. 字符串输入:我需要帮助实现一种机制,以便在我的汇编程序中从用户输入字符串。

  2. 十六进制转换:在获得用户输入后,我的目标是将输入字符串的每个字母转换为其相应的十六进制表示形式,为TEA加密做好准备。我正在寻求有关如何有效完成此转换的指导。

  3. 加密消息解密:使用 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        
algorithm assembly encryption ascii tasm
1个回答
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

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