Come criptare e decriptare una stringa o un file di testo con AutoHotkey

La crittogafia è quella è la scienza matematica che si occupa delle tecniche atte a rendere indecifrabili gli scritti.

Frequentemente può essere necessario nascondere ad occhi indiscreti informazioni sensibili che vengono salvate nei files di testo, perché questi ultimi sono molto facilmente visualizzabili con un semplice click ad esempio attraverso il classico Notepad di Windows.

Una soluzione, dunque, può essere quella di criptare il testo in modo da renderlo appunto illeggibile all'atto dell'apertura del file.

Le tecniche di crittografia possono essere dalle più semplici come la crittografia monoalfabetica, che consiste nel semplice spostamento delle lettere dell'alfabeto, tecnica usata nell'antico "cifrario di Cesare", fino ad arrivare alla "Crittografia_quantistica"...!

Quelli che propongo sono di 3 tipi di crittografia, con algoritmo di criptazione progressivamente più complesso, dalla semplice crittografia monoalfabetica, che usa sempre lo stesso carattere per la stessa lettera, e per questo motivo è relativamente poco sicura (anche se ci sono 50 miliardi di miliardi di combinazioni possibili), ma è la più sicura dal punto di vista della certezza di decriptazione, perché è indipendente dal punto in cui si inizia il processo di decriptazione (cioè ad un carattere ASCII corrisponde inequivocabilmente un carattere di decriptazione indipendentemente dalla posizione di questo nella stringa), fino a due tipi di  crittografia polialfabetica, una con alternanza di 2 "alfabeti" ASCII di 255 caratteri ed un'altra con la successione di 10 alfabeti che sono più sicure, ma la condizione per potere decriptare la stringa è che si cominci dall'inizio della stringa o del file di testo, e che non si perdano dati del record, pena la impossibilità di decriptare il restante testo dal punto della pedita dei dati.

Le 2 funzioni, una di criptazione e l'altra di decriptazione, sono fatte usando il linguaggio di AutoHotkey, ma sono ben descritte per comprendere l'algoritmo e facilmente trasferibili ad altro linguaggio.
Nella funzione di decriptazione ho inserito anche una barra di progressione che è utile nel caso vengano decriptati files di testo molto lunghi, per dare all'utente finale l'informazione del processo in atto, altrimenti il programma potrebbe sembrare "inchiodato". La decriptazione è comunque molto veloce, solo per files veramente molto lunghi può impiegare un certo numero di secondi. Se non interessa la barra di progressione può essere eliminata.

All'inizio dei listati ci sono alcune  di programma che permettono di testare subito le funzioni inserendo una frase in un box di input. Queste righe andranno chiaramente eliminate qualora voleste usare le due funzioni nel vostro programma.

Infine ho inserito anche uno script (Listato_4) che può generare un "rimescolamento" casuale dei 255 caratteri ASCII se si vuole sostituire la stringa numerica della variabile "_encrypt" per cambiare la chiave di criptazione/decriptazione (ricordarsi di farlo in entrambe le funzioni).

I seguenti listati possono essere copiati ed incollati su Notepad salvandoli con desinenza ".ahk" avendo l'accortezza di selezionare, nel menù a discesa "salva come", la voce "tutti i file" per evitare l'apposizione della desinenza ".txt" al file che si andrà a salvare.

Possono essere anche scaricati direttamente da questi link del mio Google drive:
Listato_1   Listato_2   Listato_3   Listato_4

Ho anche fatto un piccolo programma di esempio con interfaccia grafica utente (finestra) che permette di criptare e decriptare una frase o un file di testo e di salvarli in clipboard o in un file, e può essere scaricato come script sorgente (CryptDecrypt.ahk) da qui e come file eseguibile (CryptDecrypt.exe) da qui.


Istruzioni

     per criptare:
  • scrivere il testo (o caricarlo dal menu "File") nella finestra superiore
  • premere il pulsante Cripta/decripta
  • il testo viene criptato nella finestra inferiore
  • quest'ultimo potrà essere copiato in clipboard o salvato in un altro file
     per decriptare:
  • copiare e incollare il testo criptato nella finestra inferiore (o caricare un file precedentemente salvato dal menù "File")
  • premere il pulsante Cripta/decripta
  • il testo viene decriptato nella finestra superiore
  • quest'ultimo potrà essere copiato in clipboard o salvato in altro file

Ciao. Carlo.


Listato 1

;Funzioni per criptare e decriptare una stringa
;versione 1
;
InputBox, _Stringa_da_criptare, Input, Inserisci la frase che vuoi criptare e premi ok
_str := EnCrypt(_Stringa_da_criptare)
msgbox La frase`n"%_Stringa_da_criptare%"`ncriptata, è diventata la seguente:`n`n%_str%`n`nOra premi Ok per ridecriptarla
_str := DeCrypt(_str)
msgbox La frase`n"%_Stringa_da_criptare%"`nridecriptata:`n`n%_str%
exitapp

;------------------------------------------------------------------------------
;---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn   EnCrypt()
;------------------------------------------------------------------------------
EnCrypt(_stringa)
{
;Uso: EnCrypt(variabile) oppure EnCrypt("stringa")
;versione 1
 _Len := StrLen(_stringa)             ;...in _Len la lunghezza della stringa passata a questa funzione
                                      ;...la variabile _encrypt è una sequenza di numeri da 1 a 255 mescolati tra di loro e separati da virgola
_encrypt = 10,17,65,222,18,57,216,45,12,136,180,132,41,205,5,76,187,63,165,212,81,171,28,82,110,223,67,84,200,77,249,179,181,250,238,153,149,4,122,56,168,191,170,161,19,228,189,91,135,209,105,69,177,75,247,23,40,178,93,112,147,11,232,241,230,204,224,208,255,217,120,196,108,144,55,42,233,154,248,95,98,151,195,30,118,186,71,49,36,190,62,150,31,164,52,173,109,184,231,219,221,14,172,192,32,22,129,73,137,218,182,106,197,15,166,245,134,24,254,80,183,90,244,239,13,174,25,39,7,111,26,229,176,131,85,61,126,70,202,243,33,155,194,83,193,44,119,162,89,160,58,9,199,94,140,145,50,148,246,236,6,240,88,16,29,78,214,242,3,211,156,152,72,128,46,117,79,133,101,203,253,215,159,21,252,92,59,138,54,143,213,102,113,86,103,130,125,100,27,37,107,74,114,48,185,97,235,96,104,206,237,64,66,123,141,188,8,35,234,121,116,124,2,207,127,87,47,157,115,225,169,198,227,34,226,167,175,220,201,1,68,139,43,38,146,99,20,142,210,158,60,163,251,51,53
 Loop, parse, _encrypt, `,            ;...Questo loop legge ad uno ad uno i numeri contenuti in _encrypt separati da virgola
 {
 _StrEn := _StrEn chr(A_LoopField)    ;...in _StrEn saranno contenuti caratteri ascii in sequenza, corrispondenti alla sequenza numerica _encrypt
 _StrDe := _StrDe chr(A_Index)        ;...in _StrDe saranno contenuti caratteri ascii in sequenza, in ordine crescente da 1 a 255
 }

 Loop %_Len%                          ;...Questo loop continua fino alla lunghezza della stringa passata a questa funzione
 {
_Tmp1 := SubStr(_stringa, A_Index, 1) ;...in _Tmp1 c'è il carattere da processare
_Tmp2 := InStr(_StrDe, _Tmp1, true)   ;...in _Tmp2 c'è la posizione del carattere processato nella stringa _StrDe
_Tmp3 := SubStr(_StrEn, _Tmp2,1)      ;...in _Tmp3 c'è il carattere corrispondente nella stringa _StrEn
_StringCrypt := _StringCrypt _Tmp3    ;...in _StringCrypt ci sarà la stringa criptata
 }
 _stringa := _StringCrypt
 Return %_stringa%                    ;...ritorna la stringa criptata
}
;------------------------------------------------------------------------------
;---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn   DeCrypt()
;------------------------------------------------------------------------------
DeCrypt(_stringa)
{
;Uso: DeCrypt(variabile) oppure DeCrypt("stringa")
;versione 1
 _Len := StrLen(_stringa)             ;...in _Len la lunghezza della stringa passata alla funzione
                                      ;...la seguente variabile _encrypt è una sequenza di numeri da 1 a 255 mescolati tra di loro e separati da virgola
_encrypt = 10,17,65,222,18,57,216,45,12,136,180,132,41,205,5,76,187,63,165,212,81,171,28,82,110,223,67,84,200,77,249,179,181,250,238,153,149,4,122,56,168,191,170,161,19,228,189,91,135,209,105,69,177,75,247,23,40,178,93,112,147,11,232,241,230,204,224,208,255,217,120,196,108,144,55,42,233,154,248,95,98,151,195,30,118,186,71,49,36,190,62,150,31,164,52,173,109,184,231,219,221,14,172,192,32,22,129,73,137,218,182,106,197,15,166,245,134,24,254,80,183,90,244,239,13,174,25,39,7,111,26,229,176,131,85,61,126,70,202,243,33,155,194,83,193,44,119,162,89,160,58,9,199,94,140,145,50,148,246,236,6,240,88,16,29,78,214,242,3,211,156,152,72,128,46,117,79,133,101,203,253,215,159,21,252,92,59,138,54,143,213,102,113,86,103,130,125,100,27,37,107,74,114,48,185,97,235,96,104,206,237,64,66,123,141,188,8,35,234,121,116,124,2,207,127,87,47,157,115,225,169,198,227,34,226,167,175,220,201,1,68,139,43,38,146,99,20,142,210,158,60,163,251,51,53
 Loop, parse, _encrypt, `,
 {
 _StrEn := _StrEn chr(A_LoopField)    ;...in _StrEn saranno contenuti caratteri ascii in sequenza, corrispondenti alla sequenza numerica _encrypt
 _StrDe := _StrDe chr(A_Index)        ;...in _StrDe saranno contenuti caratteri ascii in sequenza, in ordine crescente da 1 a 255
 }
 ;
 _unpercenttmp := _Len/100             ;...lunghezza stringa diviso 100 = 1 percento della lunghezza
 _poipercenttmp := _unpercenttmp       ;...successive percwentuali da autoincrementare di un percentuale (_unpercenttmp)
 _nn := 1                              ;...numero che si autoincrementerà per allungare la barra progressione
 ;
 Loop %_Len%                           ;...questo loop continua fino alla lunghezza della stringa passata a questa funzione
 {
  If (A_Index = 1)                                            ;...se il loop è = 1
  {
   _n := 1
   Progress, %_n%, Attendere..., Decrypt...,Encrypt/Decrypt   ;...crea una barra di progressione della decriptazione
  }
  If (A_Index > _poipercenttmp)                               ;...se il loop è > _poipercenttmp
  {
   _Poipercenttmp := _poipercenttmp + _unpercenttmp           ;...incrementa la percentuale di avanzamento della barra
   Progress, %_nn%, Attendere..., Decrypt...,Encrypt/Decrypt  ;...fa avanzare la barra di progressione della decriptazione
   _nn := _nn +1
  }
  _Tmp1 := SubStr(_stringa, A_Index, 1)                       ;...il carattere da processare
  _Tmp2 := InStr(_StrEn, _Tmp1, true)                         ;...posizione del carattere processato nella stringa Encrypt
  _Tmp3 := SubStr(_StrDe, _Tmp2, 1)                           ;...carattere corrispondente nella stringa Decrypt
  _StringCrypt := _StringCrypt _Tmp3                          ;...in _StringCrypt ci sarà la stringa decriptata
 }                                                            ;...fine del loop
 _stringa := _StringCrypt
 Progress, 100, Attendere..., Decrypt...,Encrypt/Decrypt      ;...pone la barra di progressione al 100%
 Sleep, 1000                                                  ;...attende 1 secondo (per fare vedere che la barra è arrivata al 100%)
 Progress, off                                                ;...cancella la barra di progressione
 _Progrex := 0
 Return %_stringa%                                            ;...ritorna la stringa decriptata
}


Listato 2

;Funzioni per criptare e decriptare una stringa
;versione 2 con incremento/decremento dei caratteri pari e dispari
;Nota Bene, è chiaro che la fase di decriptazione deve ricominciare dal punto preciso dove è iniziata la encriptazione
;pena la perdita dei dati
;
;
InputBox, _Stringa_da_criptare, Input, Inserisci la frase che vuoi criptare e premi ok
_str := EnCrypt(_Stringa_da_criptare)
msgbox La frase`n"%_Stringa_da_criptare%"`ncriptata, è diventata la seguente:`n`n%_str%`n`nOra premi Ok per ridecriptarla
_str := DeCrypt(_str)
msgbox La frase`n"%_Stringa_da_criptare%"`nridecriptata:`n`n%_str%
exitapp

;------------------------------------------------------------------------------
;---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn   EnCrypt()
;------------------------------------------------------------------------------
EnCrypt(_stringa)
{
;Uso: EnCrypt(variabile) oppure EnCrypt("stringa")
;versione 2 con incremento del carattere criptato pari o dispari
 _Len := StrLen(_stringa)             ;...in _Len la lunghezza della stringa passata a questa funzione
                                      ;...la seguente variabile _encrypt è una sequenza di numeri da 1 a 255 mescolati tra di loro e separati da virgola
_encrypt = 10,17,65,222,18,57,216,45,12,136,180,132,41,205,5,76,187,63,165,212,81,171,28,82,110,223,67,84,200,77,249,179,181,250,238,153,149,4,122,56,168,191,170,161,19,228,189,91,135,209,105,69,177,75,247,23,40,178,93,112,147,11,232,241,230,204,224,208,255,217,120,196,108,144,55,42,233,154,248,95,98,151,195,30,118,186,71,49,36,190,62,150,31,164,52,173,109,184,231,219,221,14,172,192,32,22,129,73,137,218,182,106,197,15,166,245,134,24,254,80,183,90,244,239,13,174,25,39,7,111,26,229,176,131,85,61,126,70,202,243,33,155,194,83,193,44,119,162,89,160,58,9,199,94,140,145,50,148,246,236,6,240,88,16,29,78,214,242,3,211,156,152,72,128,46,117,79,133,101,203,253,215,159,21,252,92,59,138,54,143,213,102,113,86,103,130,125,100,27,37,107,74,114,48,185,97,235,96,104,206,237,64,66,123,141,188,8,35,234,121,116,124,2,207,127,87,47,157,115,225,169,198,227,34,226,167,175,220,201,1,68,139,43,38,146,99,20,142,210,158,60,163,251,51,53
 Loop, parse, _encrypt, `,            ;...questo loop legge ad uno ad uno i numeri contenuti in _encrypt separati da virgola
 {
 _StrEn := _StrEn chr(A_LoopField)    ;...in _StrEn saranno contenuti caratteri ascii in sequenza, corrispondenti alla sequenza numerica _encrypt
 _StrDe := _StrDe chr(A_Index)        ;...in _StrDe saranno contenuti caratteri ascii in sequenza, in ordine crescente da 1 a 255
 }
 Loop %_Len%                          ;...questo loop continua fino alla lunghezza della stringa passata a questa funzione
 {
_Tmp1 := SubStr(_stringa, A_Index, 1) ;...in _Tmp1 c'è il carattere da processare
_Tmp2 := InStr(_StrDe, _Tmp1, true)   ;...in _Tmp2 c'è la posizione del carattere processato nella stringa _StrDe
_Dispari = 1,3,5,7,9
_Ult := SubStr(A_Index, StrLen(A_Index), 1) ;...ultima cifra a dx di A_Index
IfInString, _Dispari, %_Ult%          ;...se è un numero dispari si addiziona 1
    _Tmp2 := _Tmp2 + 1
If _Tmp2 > 255                        ;...se _Tmp2 è superiore a 255 sottrae 255
    _Tmp2 := _Tmp2 - 255
_Tmp3 := SubStr(_StrEn, _Tmp2,1)      ;...in _Tmp3 c'è il carattere corrispondente nella stringa _StrEn
_StringCrypt := _StringCrypt _Tmp3    ;...in _StringCrypt ci sarà la stringa criptata
 }                                    ;...fine del loop
 _stringa := _StringCrypt
 Return %_stringa%                    ;...ritorna la stringa criptata
}
;------------------------------------------------------------------------------
;---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn   DeCrypt()
;------------------------------------------------------------------------------
DeCrypt(_stringa)
{
;Uso: DeCrypt(variabile) oppure DeCrypt("stringa")
;versione 2 con decremento del carattere criptato pari o dispari
 _Len := StrLen(_stringa)             ;...in _Len la lunghezza della stringa passata alla funzione
                                      ;...la variabile _encrypt è una sequenza di numeri da 1 a 255 mescolati tra di loro e separati da virgola
_encrypt = 10,17,65,222,18,57,216,45,12,136,180,132,41,205,5,76,187,63,165,212,81,171,28,82,110,223,67,84,200,77,249,179,181,250,238,153,149,4,122,56,168,191,170,161,19,228,189,91,135,209,105,69,177,75,247,23,40,178,93,112,147,11,232,241,230,204,224,208,255,217,120,196,108,144,55,42,233,154,248,95,98,151,195,30,118,186,71,49,36,190,62,150,31,164,52,173,109,184,231,219,221,14,172,192,32,22,129,73,137,218,182,106,197,15,166,245,134,24,254,80,183,90,244,239,13,174,25,39,7,111,26,229,176,131,85,61,126,70,202,243,33,155,194,83,193,44,119,162,89,160,58,9,199,94,140,145,50,148,246,236,6,240,88,16,29,78,214,242,3,211,156,152,72,128,46,117,79,133,101,203,253,215,159,21,252,92,59,138,54,143,213,102,113,86,103,130,125,100,27,37,107,74,114,48,185,97,235,96,104,206,237,64,66,123,141,188,8,35,234,121,116,124,2,207,127,87,47,157,115,225,169,198,227,34,226,167,175,220,201,1,68,139,43,38,146,99,20,142,210,158,60,163,251,51,53
 Loop, parse, _encrypt, `,            ;...Questo loop legge ad uno ad uno i numeri contenuti in _encrypt separati da virgola
 {
 _StrEn := _StrEn chr(A_LoopField)    ;...in _StrEn saranno contenuti caratteri ascii in sequenza, corrispondenti alla sequenza numerica _encrypt
 _StrDe := _StrDe chr(A_Index)        ;...in _StrDe saranno contenuti caratteri ascii in sequenza, in ordine crescente da 1 a 255
 }

_unpercenttmp := _Len/100             ;...lunghezza stringa diviso 100 = 1 percento della lunghezza
_poipercenttmp := _unpercenttmp       ;...successive percwentuali da autoincrementare di un percentuale (_unpercenttmp)
_nn := 1                              ;...numero che si autoincrementerà per allungare la barra progressione

 Loop %_Len%                          ;...in _Len la lunghezza della stringa passata alla funzione
 {
  If (A_Index = 1)                                            ;...se il loop è = 1
  {
   _n := 1
   Progress, %_n%, Attendere..., Decrypt...,Encrypt/Decrypt   ;...crea una barra di progressione della decriptazione
  }
  If (A_Index > _poipercenttmp)                               ;...se il loop è > _poipercenttmp
  {
   _Poipercenttmp := _poipercenttmp + _unpercenttmp           ;...incrementa la percentuale di avanzamento della barra
   Progress, %_nn%, Attendere..., Decrypt...,Encrypt/Decrypt  ;...fa avanzare la barra di progressione della decriptazione
   _nn := _nn +1
  }
_Tmp1 := SubStr(_stringa, A_Index, 1)                         ;...Il carattere da processare
_Tmp2 := InStr(_StrEn, _Tmp1, true)                           ;...Posizione del carattere processato nella stringa Encrypt
_Dispari = 1,3,5,7,9                                          ;...elenco dei numeri dispari inferiori a 10
_Ult := SubStr(A_Index, StrLen(A_Index), 1)                   ;...ultima cifra a dx di A_Index
IfInString, _Dispari, %_Ult%                                  ;...se è un numero dispari si sottrae 1
    _Tmp2 := _Tmp2 - 1
  If _Tmp2 < 1                                                ;...se _Tmp2 è inferiore a 1 aggiunge 255
    _Tmp2 := _Tmp2 + 255
_Tmp3 := SubStr(_StrDe, _Tmp2, 1)                             ;...carattere corrispondente nella stringa Decrypt
_StringCrypt := _StringCrypt _Tmp3                            ;...in _StringCrypt ci sarà la stringa decriptata
 }                                                            ;...fine del loop
 _stringa := _StringCrypt
 Progress, 100, Attendere..., Decrypt...,Encrypt/Decrypt      ;...pone la barra di progressione al 100%
 Sleep, 1000                                                  ;...attende 1 secondo (per fare vedere che la barra è arrivata al 100%)
 Progress, off                                                ;...cancella la barra di progressione
 _Progrex := 0
 Return %_stringa%                                            ;...ritorna la stringa decriptata
}


Listato 3

;Funzioni per criptare e decriptare una stringa
;versione 3 con incremento/decremento progressivo dei caratteri
;Nota Bene, è chiaro che la fase di decriptazione deve ricominciare dal punto preciso dove è iniziata la encriptazione
;pena la perdita dei dati
;
;
InputBox, _Stringa_da_criptare, Input, Inserisci la frase che vuoi criptare e premi ok
_str := EnCrypt(_Stringa_da_criptare)
msgbox La frase`n"%_Stringa_da_criptare%"`ncriptata, è diventata la seguente:`n`n%_str%`n`nOra premi Ok per ridecriptarla
_str := DeCrypt(_str)
msgbox La frase`n"%_Stringa_da_criptare%"`nridecriptata:`n`n%_str%
exitapp

;------------------------------------------------------------------------------
;---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn   EnCrypt()
;------------------------------------------------------------------------------
EnCrypt(_stringa)
{
;Uso: EnCrypt(variabile) oppure EnCrypt("stringa")
;versione 3 con incremento progressivo del carattere criptato
 _Len := StrLen(_stringa)             ;...in _Len la lunghezza della stringa passata a questa funzione
                                      ;...la seguente variabile _encrypt è una sequenza di numeri da 1 a 255 mescolati tra di loro e separati da virgola
_encrypt = 10,17,65,222,18,57,216,45,12,136,180,132,41,205,5,76,187,63,165,212,81,171,28,82,110,223,67,84,200,77,249,179,181,250,238,153,149,4,122,56,168,191,170,161,19,228,189,91,135,209,105,69,177,75,247,23,40,178,93,112,147,11,232,241,230,204,224,208,255,217,120,196,108,144,55,42,233,154,248,95,98,151,195,30,118,186,71,49,36,190,62,150,31,164,52,173,109,184,231,219,221,14,172,192,32,22,129,73,137,218,182,106,197,15,166,245,134,24,254,80,183,90,244,239,13,174,25,39,7,111,26,229,176,131,85,61,126,70,202,243,33,155,194,83,193,44,119,162,89,160,58,9,199,94,140,145,50,148,246,236,6,240,88,16,29,78,214,242,3,211,156,152,72,128,46,117,79,133,101,203,253,215,159,21,252,92,59,138,54,143,213,102,113,86,103,130,125,100,27,37,107,74,114,48,185,97,235,96,104,206,237,64,66,123,141,188,8,35,234,121,116,124,2,207,127,87,47,157,115,225,169,198,227,34,226,167,175,220,201,1,68,139,43,38,146,99,20,142,210,158,60,163,251,51,53
 Loop, parse, _encrypt, `,            ;...questo loop legge ad uno ad uno i numeri contenuti in _encrypt separati da virgola
 {
 _StrEn := _StrEn chr(A_LoopField)    ;...in _StrEn saranno contenuti caratteri ascii in sequenza, corrispondenti alla sequenza numerica _encrypt
 _StrDe := _StrDe chr(A_Index)        ;...in _StrDe saranno contenuti caratteri ascii in sequenza, in ordine crescente da 1 a 255
 }
 Loop %_Len%                          ;...questo loop continua fino alla lunghezza della stringa passata a questa funzione
 {
_Tmp1 := SubStr(_stringa, A_Index, 1) ;...in _Tmp1 c'è il carattere da processare
_Tmp2 := InStr(_StrDe, _Tmp1, true)   ;...in _Tmp2 c'è la posizione del carattere processato nella stringa _StrDe

_Ult := SubStr(A_Index, StrLen(A_Index), 1) ;...ultima cifra a dx di A_Index (= numero di loop)
_Tmp2 := _Tmp2 + _Ult                 ;...aggiunge un numero progressivo da 0 a 9
If _Tmp2 > 255                        ;...se _Tmp2 è superiore a 255 sottrae 255
    _Tmp2 := _Tmp2 - 255

_Tmp3 := SubStr(_StrEn, _Tmp2,1)      ;...in _Tmp3 c'è il carattere corrispondente nella stringa _StrEn
_StringCrypt := _StringCrypt _Tmp3    ;...in _StringCrypt ci sarà la stringa criptata
 }                                    ;...fine del loop
 _stringa := _StringCrypt
 Return %_stringa%                    ;...ritorna la stringa criptata
}
;------------------------------------------------------------------------------
;---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn---Fn   DeCrypt()
;------------------------------------------------------------------------------
DeCrypt(_stringa)
{
;Uso: DeCrypt(variabile) oppure DeCrypt("stringa")
;versione 3 con decremento progressivo del carattere decriptato
 _Len := StrLen(_stringa)             ;...in _Len la lunghezza della stringa passata alla funzione
                                      ;...la seguente variabile _encrypt è una sequenza di numeri da 1 a 255 mescolati tra di loro e separati da virgola
 _encrypt = 10,17,65,222,18,57,216,45,12,136,180,132,41,205,5,76,187,63,165,212,81,171,28,82,110,223,67,84,200,77,249,179,181,250,238,153,149,4,122,56,168,191,170,161,19,228,189,91,135,209,105,69,177,75,247,23,40,178,93,112,147,11,232,241,230,204,224,208,255,217,120,196,108,144,55,42,233,154,248,95,98,151,195,30,118,186,71,49,36,190,62,150,31,164,52,173,109,184,231,219,221,14,172,192,32,22,129,73,137,218,182,106,197,15,166,245,134,24,254,80,183,90,244,239,13,174,25,39,7,111,26,229,176,131,85,61,126,70,202,243,33,155,194,83,193,44,119,162,89,160,58,9,199,94,140,145,50,148,246,236,6,240,88,16,29,78,214,242,3,211,156,152,72,128,46,117,79,133,101,203,253,215,159,21,252,92,59,138,54,143,213,102,113,86,103,130,125,100,27,37,107,74,114,48,185,97,235,96,104,206,237,64,66,123,141,188,8,35,234,121,116,124,2,207,127,87,47,157,115,225,169,198,227,34,226,167,175,220,201,1,68,139,43,38,146,99,20,142,210,158,60,163,251,51,53
 Loop, parse, _encrypt, `,            ;...Questo loop legge ad uno ad uno i numeri contenuti in _encrypt separati da virgola
 {
 _StrEn := _StrEn chr(A_LoopField)    ;...in _StrEn saranno contenuti caratteri ascii in sequenza, corrispondenti alla sequenza numerica _encrypt
 _StrDe := _StrDe chr(A_Index)        ;...in _StrDe saranno contenuti caratteri ascii in sequenza, in ordine crescente da 1 a 255
 }
 ;
 _unpercenttmp := _Len/100            ;...lunghezza stringa diviso 100 = 1 percento della lunghezza
 _poipercenttmp := _unpercenttmp      ;...successive percentuali da autoincrementare di un percentuale (_unpercenttmp)
 _nn := 1                             ;...numero che si autoincrementerà per allungare la barra progressione
 ;
 Loop %_Len%                          ;...questo loop continua fino alla lunghezza della stringa passata a questa funzione
 {
  If (A_Index = 1)                                            ;...se il loop è = 1
  {
   _n := 1
   Progress, %_n%, Attendere..., Decrypt...,Encrypt/Decrypt   ;...crea una barra di progressione della decriptazione
  }
  If (A_Index > _poipercenttmp)                               ;...se il loop è > _poipercenttmp
  {
   _Poipercenttmp := _poipercenttmp + _unpercenttmp           ;...incrementa la percentuale di avanzamento della barra
   Progress, %_nn%, Attendere..., Decrypt...,Encrypt/Decrypt  ;...fa avanzare la barra di progressione della decriptazione
   _nn := _nn +1
  }
  ;
  _Tmp1 := SubStr(_stringa, A_Index, 1)                       ;...Il carattere da processare
  _Tmp2 := InStr(_StrEn, _Tmp1, true)                         ;...Posizione del carattere processato nella stringa Encrypt
  _Ult := SubStr(A_Index, StrLen(A_Index), 1)                 ;...ultima cifra a dx di A_Index (= numero di loop)
  _Tmp2 := _Tmp2 - _Ult                                       ;...aggiunge un numero progressivo da 0 a 9
  If _Tmp2 < 1                                                ;...se _Tmp2 è inferiore a 1 aggiunge 255
    _Tmp2 := _Tmp2 + 255
  _Tmp3 := SubStr(_StrDe, _Tmp2, 1)                           ;...carattere corrispondente nella stringa Decrypt
  _StringCrypt := _StringCrypt _Tmp3                          ;...in _StringCrypt ci sarà la stringa decriptata
 }                                                            ;...fine del loop
 _stringa := _StringCrypt
 Progress, 100, Attendere..., Decrypt...,Encrypt/Decrypt      ;...pone la barra di progressione al 100%
 Sleep, 1000                                                  ;...attende 1 secondo (per fare vedere che la barra è arrivata al 100%)
 Progress, off                                                ;...cancella la barra di progressione
 _Progrex := 0
 Return %_stringa%                                            ;...ritorna la stringa decriptata
}



Listato 4

;
;crea successione numerica da 1 a 255 mescolata, separata da virgola e la salva in file di testo Successione numerica.txt
;
_contatore = 0 ;...serve a contare che vengano creati tutti i 255 numeri diversi e poi uscire dal loop
Loop                                     ;...inizio loop
{
 Random, _TmpEncrypt, 1, 255             ;...cea numeri casuali da 1 a 255
 IfInstring, _encrypt, `,%_TmpEncrypt%`, ;...se il numero casuale è già compreso nella stringa, riprende il loop per crearne un altro
    Continue
 _encrypt = %_encrypt%`,%_TmpEncrypt%`,  ;...aggiunge il nuovo numero nella stringa
 _contatore := _contatore + 1            ;...conta quanti ne sono stati aggiunti
 If _contatore = 255                     ;...se arrivati a 255 esce dal loop
    Break
}                                        ;...fine loop
;
Loop                                     ;...inizio loop
{
    StringReplace, _encrypt, _encrypt, `,`,, `,, UseErrorLevel ;...toglie tutte le virgole doppie
    if ErrorLevel = 0  ; No more replacements needed.
        break
}                                        ;...fine loop
;
StringTrimLeft, _encrypt, _encrypt, 1    ;...toglie la virgola iniziale
StringTrimRight, _encrypt, _encrypt, 1   ;...toglie la virgola finale
;
msgbox La stringa sarà salvata nel file di testo "Successione numerica.txt"`n`n"%_encrypt%
FileDelete, Successione numerica.txt
FileAppend, %_encrypt%, Successione numerica.txt
exitapp



3 commenti:

  1. Ciao Carlo , nel caso che dovessi decriptare un file che suggerimenti potresti darmi ?

    RispondiElimina
    Risposte
    1. Questo commento è stato eliminato dall'autore.

      Elimina
    2. Ciao berniebot, il sistema che descrivo serve per decriptare dei files di testo precedentemente criptati con lo stesso modo, non saprei darti consigli per decriptare files criptati con programmi diversi, Ciao, Carlo. ;-)

      Elimina