home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* FEAL.A *)
- (* Algorithmus von Akihiro Shimizu & Shoji Mijaguchi *)
- (* implementiert in M2ASM (c) 1989 Ralf Hensmann *)
- (* ------------------------------------------------------ *)
- module FEAL;
-
- segment D_FEAL (M_DATA,28H); select D_FEAL
- public FEAL@Key: org 32 (* Zur Verschlüsselung *)
- public FEAL@DecryptKey: org 32 (* Zur Entschlüsselung *)
- Hilf1: org 2 (* Hilfsvariablen *)
- Hilf2: org 2
- HilfB: org 1
-
- segment C_FEAL (FCODE,28H); group G_FEAL (C_FEAL);
- select C_FEAL
-
- public FEAL$SetKey: DataAdr = 6;
- push bp
- mov bp,sp
- push ds
- push es
- push si
- push di
- (* Laden der Register *)
- mov ax, [bp] [DataAdr]
- mov bx, [bp] [DataAdr+2]
- mov cx, [bp] [DataAdr+4]
- mov dx, [bp] [DataAdr+6]
- (* DS auf Datensegment setzen *)
- mov si,D_FEAL
- mov ds,si
- (* Hilfsvariable auf 0 setzen *)
- and word [Hilf1], 0
- and word [Hilf2], 0
- sub si, si
-
- (* Start der Schleife *)
- Start: push cx
- push dx
- xor cx, [Hilf1]
- xor dx, [Hilf2]
- mov [Hilf1], ax
- mov [Hilf2], bx
- (* Funktion fk *)
- xor ah, al
- xor bl, bh
-
- mov [HilfB], bl
- xor bl, cl
- add ah, bl; inc ah; rol ah,1; rol ah,1
- mov bl, [HilfB]
-
- mov [HilfB], ah
- xor ah, ch
- add bl, ah; rol bl,1; rol bl,1
- mov ah, [HilfB]
-
- xor ah, dl
- add al, ah; rol al,1; rol al,1
- mov ah, [HilfB]
-
- mov [HilfB], bl
- xor bl, dh
- add bh, bl; inc bh; rol bh,1; rol bh,1
- mov bl, [HilfB]
- (* Funktionsende *)
- mov [FEAL@Key] [si], ax
- mov [FEAL@Key+2] [si], bx
- mov cx, ax
- mov dx, bx
- pop bx
- pop ax
- add si, 4
- cmp si, 32
- jb Start
-
- (* DecryptKey erstellen *)
- mov ax, ds
- mov es, ax
- lea si, [FEAL@Key]
- add si, 16
- mov dx, si
- lea di, [FEAL@DecryptKey]
- add di, 24
- movsw; movsw; movsw; movsw;
- sub di, 16
- movsw; movsw; movsw; movsw;
-
- sub di, 10
- sub si, 32
- Schleife:
- lodsw
- mov [di], ax
- dec di
- dec di
- cmp si, dx
- jb Schleife
- (* Funktionsende *)
- pop di
- pop si
- pop es
- pop ds
- mov sp, bp
- pop bp
- ret far 8
- (* Verschlüsselungsfunktion *)
-
- public FEAL$Crypt: DataAdr = 6;
-
- push bp
- mov bp, sp
- push si
- push ds
- lea si, [FEAL@Key]
- jmp near CryptStart
-
- public FEAL$DeCrypt: DataAdr = 6;
-
- push bp
- mov bp, sp
- push si
- push ds
- lea si, [FEAL@DecryptKey]
-
- CryptStart:
- push di
- lds di, [bp] [DataAdr]
-
- (* Laden der Register *)
- mov ax, [di]
- mov bx, [di] [2]
- mov cx, [di] [4]
- mov dx, [di] [6]
-
- mov di, D_FEAL
- mov ds, di
- mov di, si (* Ende der Schleife *)
- add di, 16
- (* Anfangs - XOR *)
- xor ax, [di]
- xor bx, [di] [2]
- xor cx, [di] [4]
- xor dx, [di] [6]
- xor cx, ax
- xor dx, bx
-
- C_Schleife:
- mov [Hilf1], cx
- mov [Hilf2], dx
- (* Funktion f *)
- xor ch, [si]
- inc si
- xor dl, [si]
- inc si
- xor ch, cl
- xor dl, dh
- add ch, dl; inc ch; rol ch,1; rol ch,1
- add dl, ch; rol dl,1; rol dl,1
- add dh, dl; inc dh; rol dh,1; rol dh,1
- add cl, ch; rol cl,1; rol cl,1
- (* Ende der Funktion *)
- cmp si, di
- je Weiter
- xor cx, ax
- xor dx, bx
- mov ax, [Hilf1]
- mov bx, [Hilf2]
- jmp C_Schleife
- Weiter:
- xor ax, cx
- xor bx, dx
- mov cx, [Hilf1]
- mov dx, [Hilf2]
- xor cx, ax
- xor dx, bx
- (* End - XOR *)
- xor ax, [si] [8]
- xor bx, [si] [10]
- xor cx, [si] [12]
- xor dx, [si] [14]
- (* Abspeichern *)
- lds di, [bp] [DataAdr]
- mov [di], ax
- mov [di] [2], bx
- mov [di] [4], cx
- mov [di] [6], dx
- Ende: pop di
- pop ds
- pop si
- mov sp, bp
- pop bp
- ret far 4
- end
- (* ------------------------------------------------------ *)
- (* Ende von FEAL.A *)