;***************************************************** ;* Kryptor Dateiverschluesselung * ;* * ;* 2010 H.V.Viehof Assembled with A86 * ;* * ;* Es ist kein Luxus den Quelltext etwas zu ordnen, * ;* es erleichtert die Lesbarkeit. * ;* Da mehrere Mal eine Benutzereingabe erwartet wird * ;* beschraenkt sich Geschwindigkeitsoptimierung wenn * ;* ueberhaupt auf die Prozeduren, und nicht auf das * ;* Hauptprogramm. * ;* * ;* Wichtiger Hinweis: * ;* Die Arbeitsweise dieser Verschluesselungsroutine * ;* ist zu einfach um professionellen Standarts zu * ;* entsprechen. * ;***************************************************** ;__________________________________________ ; ; Stapelsegment : ;__________________________________________ stack segment stack word 'stack' dw 80 dup (?) stack ends ;__________________________________________ ; ; Programmsegment: ;__________________________________________ code segment public word 'prog' main: mov ax, 3 ; Textbildschirm int 010 ; waehlen und loeschen mov bx, offset Intro call Meldung mov ax, seg datavar mov ds, ax mov bx, offset Klartext mov ds: w UseText, bx ; der Text vor der Eingabe mov ax, seg datavar ; Segment des Lesepuffers: datavar mov ds: StoreSeg, ax ; speichern mov ax, OFFSET TextBuffer mov ds: UseBuffer, ax call RComplete ; Unterprog. Datei lesen und danach schliessen mov ax, es:w Length mov es: w FileLength, ax mov ax, seg datavar mov ds, ax mov bx, offset Schluessel mov ds: w UseText, bx mov ax, seg key ; Schluesseldatei lesen mov ds: StoreSeg, ax mov ax, OFFSET KeyBuffer mov ds: UseBuffer, ax call RComplete ; Unterprog. Datei lesen und danach schliessen mov ax, es:w Length mov es: w KeyLength, ax call scramble mov bx, offset Ausgabe call Meldung mov ax, seg datavar mov ds, ax mov bx, offset TextBuffer ; Pufferinhalt auf Bildschirm anzeigen call Display call Linie mov bx, offset Ausgabe call Meldung call WComplete pEnde: mov ax, 04c00 ; Ende! int 021 ;__________________________________________ ; ; Prozeduren: ;__________________________________________ Linie: mov bx, offset hr Meldung: mov ax, seg datafix mov ds, ax Display: mov dl, ds:[bx] ; Zeichen an Position [bx] laden cmp dl, 0 je ret mov ah, 2 int 021 inc bx jmp Display GetName: mov ah, 1 ; Int 021 Funktion 1: Zeichen von der Tastatur lesen int 021 and ax, 0ff ; nur das in al wird benoetigt cmp al, 0d ; ist es die Enter Taste? jz JumpOut ; dann ist das hier fertig stosb ; im Namenspuffer speichern jmp GetName ; Und naechstes Zeichen holen JumpOut: mov al, 0 ; Schlusszeichen setzen stosb ret WComplete: mov ax, seg datavar mov ds, ax mov es, ax mov di, offset FileName call GetName ; Unterprog. Dateinamen eingeben Create: xor cx, cx mov dx, OFFSET FileName mov ah, 05b ; neue Datei int 021 ; erstellen, Name schon vorhanden? jnc WriteFile ; Fehlerabfang (Carry Flag gesetzt?) mov bx, offset wError mov ax, seg datafix mov ds, ax call Display mov ah, 1 int 021 cmp al, 'a' jnz WComplete jmp pEnde WriteFile: mov es: FileHandle, ax ; Handle nach BX mov bx, ax mov ah, 040 ; Funktion 40h schreibe Puffer in Datei mov cx, es: w FileLength mov dx, OFFSET TextBuffer int 021 ; Daten schreiben mov ah, 03E mov bx, es: FileHandle int 021 ; Datei schliessen ret RComplete: mov bx, UseText call Meldung mov ax, seg datavar ; Datensegment initialisieren mov ds, ax mov es, ax mov di, offset FileName call GetName ; Unterprog. Dateinamen eingeben mov dx, OFFSET FileName ; dx zeigt auf den Dateinamen mov ax, 03d00 ; ah = 03d Datei oeffnen, al = 0 nur lesen int 021 ; Datei oeffnen mov ds: FileHandle, ax ; und Dateihandle sichern jnc Y1 ; Oops, ein Fehler trat auf... mov bx, offset rError call Meldung call Linie jmp RComplete Y1: mov ax, es: StoreSeg ; Segment fuer Lesepuffer mov ds, ax mov dx, es: UseBuffer ; Lesepuffer ReadFile: mov bx, es: FileHandle ; Handle nach BX mov cx, 512 ; Der Datenpuffer hat zwar Platz fuer 64000 Zeichen mov ah, 03F ; aber DOS/FAT16 liest nur 512, WIN/FAT33/NTFS wuerden 4096 akzeptieren int 021 ; Daten Lesen add dx, ax ; Pufferzeiger + Anzahl gelesener Bytes cmp ax, 0 jne ReadFile ; solange ax != 0 naechsten Datensatz lesen mov bx, dx ; Das Dateiende im Puffer ermitteln mov ds: b [bx], 0 ; und mit 0 markieren mov es: w Length, bx CloseFile: mov ah, 03E mov bx, es: FileHandle int 021 ; Datei schliessen mov bx, offset Datei call Meldung mov ax, seg datavar mov ds, ax mov bx, offset FileName call Display mov bx, offset CRLF call Meldung mov ax, es: w Length call DezOut mov bx, offset Message call Meldung call Linie ret scramble: mov ax, seg datavar ; Die XOR Verschluesselungsroutine mov ds, ax mov dx, ax mov ax, offset KeyBuffer mov ds: w Position, ax add ds: w KeyLength, ax cld mov cx, ds:FileLength mov si, offset TextBuffer mov di, offset TextBuffer Verschl: mov ax, seg key mov es, ax mov bl, es:b[Position] ds: lodsb xor al, bl mov es, dx es: stosb inc ds: w Position ; erhoehe Position um 1 Byte mov ax, ds:w Position cmp ax, ds:w KeyLength jnz >Y2 mov ax, offset KeyBuffer mov ds: w Position, ax Y2: loop Verschl mov al, 0 stosb ret DezOut: cld mov bx, 10 mov cx, 0 ; cx wird als Zaehler gebraucht X1: xor dx ,dx ; dx löschen div bx ; dx:ax durch bx (10) teilen add dl, 030h ; dem divisionsrest 30h hinzuaddieren push dx ; auf den stapel legen inc cx ; durchlauf zähler erhöhen cmp ax, 0 ; ist ax schon 0? jnz X1 ; nicht? dann das ganze noch einmal... rücksprung nach X1 mov al, 020 ; evtl. werden Leerzeichen gebraucht X3: cmp cx, 5 ; 5 Stellen insgesammt? jz >X2 ; gut, dann kann das Ergebniss in den Ausgabepuffer push ax ; andernfalls. ein Leerzeichen davor inc cx ; Zaehler erhoehen jmp X3 ; und noch einmal... X2: pop dx ; Ok, die Zahl wird einmal rumgedreht: dx vom stapel holen mov ah, 2 ; und dl in den an position [di] Puffer schreiben int 021 ; schreibzeiger erhöhen loop X2 ; bis Durchlaufzähler = 0 mov dl, 020 ; und ein Leerzeichen int 021 ; dahinter ret code ends ;__________________________________________ ; ; Datensegmente: ;__________________________________________ datafix segment public word 'daten' ; nur Texte / statische Daten Intro db 0a,0d db "*********************************************************************",0a,0d db "* Kryptor - Verschluesselt eine Datei durch XOR Verknuepfung mit *",0a,0d db "* dem Inhalt einer anderen Datei als Schluessel. *",0a,0d db "* Die Ausgabe kann betrachtet und gespeichert werden. *",0a,0d db "* Zum Entschluesseln wird die Ausgabedatei ein zweites Mal mit dem *",0a,0d db "* gleichen Schluessel verknuepft, das kehrt den Vorgang um. *",0a,0d db "* Der Grad der Verschluesselung haengt von der Komplexitaet und *",0a,0d db "* Laenge der Schluesseldatei ab. *",0a,0d db "* *",0a,0d db "* 2010 Heinz Volker Viehof *",0a,0d db "*********************************************************************",0a,0d db 0a,0d CRLF db 0a,0d,0 Klartext db "Eingabedatei angeben, bitte Dateinamen eingeben und mit Enter bestaetigen:",0a,0d,0 Schluessel db "Schluesseldatei angeben, bitte Dateinamen eingeben und mit Enter bestaetigen:",0a,0d,0 Ausgabe db "Ausgabedatei angeben, bitte Dateinamen eingeben und mit Enter bestaetigen:",0a,0d,0 rError db "<<< Datei nicht gefunden! Bitte Dateinamen pruefen! >>>",0a,0d,0 wError db "<<< Datei wurde nicht angelegt, da schon vorhanden! >>>",0a,0d db "<<< Bitte Dateinamen pruefen, oder [A]bbrechen >>>",0a,0d,0 hr db 0a,0d,"________________________________________________________________________________",0a,0d,0 Message db "Bytes wurden geladen",0a,0d,0 Datei db "Datei: ",0 Inhalt db "Ausgabe / Inhalt der Ausgabedatei:",0a,0d,0 datafix ends datavar segment public word 'daten' ; alle Speichervariablen und erster Dateipuffer UseText dw ? ; der zur Dateinnameneingabe passende Text UseBuffer dw ? ; Offset des verwendeten Schreib/Lese Puffer StoreSeg dw ? ; Segment des verwendeten Schreib/Lese Puffer FileHandle dw ? ; Dateihandle Length dw ? ; Dateilaenge FileLength dw ? ; Dateilaenge der Klartext und Ausgabedatei KeyLength dw ? ; Dateilaenge der Schluesseldatei Position dw ? ; Hilfspointer zum Verschluesseln Filename DB 12 dup (?) ; Dateinamen TextBuffer DB 64000 dup (?) ; erster Dateipuffer (Klartext und Ausgabedatei) datavar ends key segment public word 'daten' ; Puffer fuer Schluesseldatei KeyBuffer DB 64000 dup (?) key ends end