;::::::::::::::::::::::::::::::::::::::::::::::::::::
::                  Logo:  Edizioni ByteMan        ::
::               Collana:  Particelle Didattiche   ::
::             Argomento:  Assembly 8086           ::
::      Titolo originale:  XCRIPDE.ASM             ::
:: Autore e Proprietario:  Salvatore ROSTA         ::
::      Ultima revisione:  07-04-1994              ::
::         Sito Internet:  w3.quipo.it/byteman     ::
::                e-mail:  byteman@quipo.it        ::
::                                                 ::
::     Tutti i diritti riservati (c)1993..2000     ::
;::::::::::::::::::::::::::::::::::::::::::::::::::::

COMMENT * ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::        XCRIPDE.ASM  -  Revisione 28-10-1991, a cura di Salvo Rosta.      ::
::                                                                          ::
:: Function XCriptoDe(String,ChiaveSt) ;CriptoDecripto String con ChiaveSt  ::
::                                                                          ::
::   String = Variabile Stringa                                             ::
::   ChiaveSt = Stringa (Chiave di criptodecriptografia)                    ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

La CriptoDecriptografia di ciascun carattere consiste nel seguente algoritmo:
1) - I caratteri di controllo (ASCII 00h1Fh) restano inalterati
2) - Selezione del carattere Chiave, (caratteri di ChiaveSt in sequenza rotatoria)
3) - XOR di ciascun carattere di String con Chiave
4) - Se il risultato  un carattere di controllo si prende il carattere originario

*


CODE      SEGMENT BYTE PUBLIC
          ASSUME  CS:CODE
          PUBLIC  XCriptoDe

Function  EQU     DWORD PTR [BP+14]
String    EQU     DWORD PTR [BP+10]
ChiaveSt  EQU     DWORD PTR [BP+6]

ProcUno   PROC    FAR

XCriptoDe:
          JMP     Inizio
;:::::::: DATI INTERNI NON INIZIALIZZATI :::::::::::::::::::::::::::::::::::::
MaxKey    DW      ?
CurKey    DW      ?

Inizio:   PUSH    BP
          MOV     BP,SP
          PUSH    DS
          LES     DI,Function         ;Lettura Puntatore Funzione Stringa ES:DI
          LDS     SI,String           ;Lettura Puntatore Stringa DS:SI
          CLD
          LODSB
          STOSB                       ;Modifica Lunghezza Funzione Stringa
          XOR     CH,CH
          MOV     CL,AL               ;Numero di Caratteri in CL
          JCXZ    EndXC               ;Smetti se lunghezza=0
          PUSH    SI
          LDS     BX,ChiaveSt
          XOR     AX,AX
          MOV     AL,DS:[BX]          ;Lettura Lunghezza Chiave
          MOV     CS:MaxKey,BX        ;Calcolo BX Massimo
          ADD     CS:MaxKey,AX
          MOV     AH,AL               ;Lettura Prima Chiave
          MOV     CS:CurKey,BX        ;Inizializza Puntatore Chiave Corrente
          LDS     SI,String
          POP     SI

XDrpt0:   LODSB                       ;Carica in AL il puntato da SI (INC SI)
          CMP     AL,32
          JB      XDrpt3
          MOV     DH,AL
          xor     al,ah
          CMP     AL,31
          JA      XDrpt3
          MOV     AL,DH
XDrpt3:   STOSB                       ;Ricopia AL al puntato da DI (INC DI)

                                      ;Aggiornamento Chiave ::::::::::::::::
          PUSH    SI                  ;Salva Puntatore String
          LDS     BX,ChiaveSt         ;Carica Puntatore ChiaveSt
          MOV     AX,CS:CurKey        ;Analisi Ultimo Puntatore ChiaveSt Usato
          CMP     AX,CS:MaxKey
          JE      ZeroKey
          INC     AX
          MOV     BX,AX
ZeroKey:  MOV     CS:CurKey,BX
          MOV     AH,DS:[BX]          ;Lettura Chiave
          LDS     SI,String           ;Carica Puntatore String
          POP     SI                  ;Ripristina Puntatore Offset String

          LOOP    XDrpt0              ;Riciclo carattere

EndXC:    POP     DS                  ;Ripristino Registri
          POP     BP
          RET     8
ProcUno   ENDP


CODE      ENDS
          END


;::::::::::::::::  FINE FILE  :::::::::::::::::::