;::::::::::::::::::::::::::::::::::::::::::::::::::::
::                  Logo:  Edizioni ByteMan        ::
::               Collana:  Particelle Didattiche   ::
::             Argomento:  Assembly 8086           ::
::      Titolo originale:  XCRIPTO.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 * ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::	
::        XCRIPTO.ASM  -  Revisione 25-agosto-1991, a cura di Salvo Rosta.  ::	
::                                                                          ::
:: Function XCripto(String,Chiave)    ; Crittografa String con Chiave       ::
:: Function XDeCripto(String,Chiave)  ; Decrittografa String con Chiave     ::	
::                                                                          ::
::   String = Variabile Stringa                                             ::
::   Chiave = Byte (Codice di de/crittografia)                              ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

La Criptografia di ciascun carattere consiste in tre passaggi:
1)  -  Complementazione del suo Codice ASCII.
2)  -  Riflessione dei bit del Passaggio 1, LSB diviene MSB e cos via.
3)  -  Somma del byte di CodiceChiave o del suo complemento a due.
La Decriptografia esegue i tre passaggi in modo complementare ed in ordine inverso.
Supponendo CodiceChiave = 4Ah (B6h complemento a 2 di 4Ah), seguiamo l'evolu-
zione del codice ASCII della lettera "Y" nelle fasi di Criptografia e Decripto-
grafia:

Originale    0     1 0 1  1 0 0 1    59h  "Y"  Codice ASCII originario
1)           1     0 1 0  0 1 1 0    A6h  ""  Complementazione
2)           0     1 1 0  0 1 0 1    65h  "A"  Riflessione
3)                                  +4Ah       Somma CodiceChiave
Crittografato                        AFh  ""  Traslazione Additiva mod 256

Crittografato                        AFh  ""  Codice ASCII criptografato
3)                                  +B6h       Sottrazione CodiceChiave
2)           0     1 1 0  0 1 0 1    65h  "A"  Traslazione Sottrattiva mod 256
1)           1     0 1 0  0 1 1 0    A6h  ""  Riflessione
Originale    0     1 0 1  1 0 0 1    59h  "Y"  Complementazione
*

CODE      SEGMENT BYTE PUBLIC
          ASSUME  CS:CODE
          PUBLIC  XCripto,XDeCripto

Function  EQU     DWORD PTR [BP+12]
String    EQU     DWORD PTR [BP+8]
Chiave    EQU     BYTE PTR [BP+6]

ProcUno   PROC    FAR

XCripto:
          XOR     BL,0
          JMP     Inizio
XDeCripto:
          MOV     BL,1
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
          MOV     AL,Chiave           ;Lettura CodiceChiave
          MOV     DL,AL               ;Salvataggio in DL.
          CMP     BL,0                ;Test Cripto/Decripto
          JZ      XCrpt0              ;Caso 0, Traslazione Additiva mod 256

                                      ;DECRIPTOGRAFIA ::::::::::::::::::::::::
          NEG     DL                  ;Modo 1, Traslazione Sottrattiva mod 256
XDrpt0:   LODSB                       ;Carica in AL il puntato da SI (INC SI)
          ADD     AL,DL               ;Aggiunta CodiceChiave          (Fase 3)
          MOV     BL,01               ;Registro 'Peso'
          XOR     AH,AH               ;Azzera Buffer
          MOV     BH,8                ;Contatore bit                  (Fase 2)
XDrpt1:   CLC                         ;Azzera Carry e ...
          RCL     AL,1                ;... leggi il prossimo bit
          JNB     XDrpt2              ;Se '0' By-Pass
          ADD     AH,BL               ;Se '1' Aggiungi Peso al Buffer
XDrpt2:   ROL     BL,1                ;Raddoppio 'Peso'
          DEC     BH                  ;Controllo fine byte
          JNZ     XDrpt1              ;Riciclo bit
          MOV     AL,AH               ;Prelievo Buffer
          NOT     AL                  ;Complementazione Codice        (Fase 1)
          STOSB                       ;Ricopia AL al puntato da DI (INC DI)
          LOOP    XDrpt0              ;Riciclo carattere
          JMP     EndXC

                                      ;CRIPTOGRAFIA ::::::::::::::::::::::::::
XCrpt0:   LODSB                       ;Carica in AL il puntato da SI (INC SI)
          MOV     BL,01               ;Registro 'Peso'
          XOR     AH,AH               ;Azzera Buffer
          NOT     AL                  ;Complementazione Codice         (Fase 1)
          MOV     BH,8                ;Contatore bit                   (Fase 2)
XCrpt1:   CLC                         ;Azzera Carry e ...
          RCL     AL,1                ;... leggi il prossimo bit
          JNB     XCrpt2              ;Se '0' By-Pass
          ADD     AH,BL               ;Se '1' Aggiungi Peso al Buffer
XCrpt2:   ROL     BL,1                ;Raddoppio 'Peso'
          DEC     BH                  ;Controllo fine byte
          JNZ     XCrpt1              ;Riciclo bit
          MOV     AL,AH               ;Prelievo Buffer
          ADD     AL,DL               ;Aggiunta Codice Chiave          (Fase 3)
          STOSB                       ;Ricopia AL al puntato da DI (INC DI)
          LOOP    XCrpt0              ;Riciclo carattere

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

CODE      ENDS
          END


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