La funzioncina che presentiamo è una rivisitazione di un noto algoritmo di cifratura molto semplice, basato sull’operatore Xor. Il codice è ampiamente commentato e autoesplicativo.

Incollata in un normale modulo, la Function può essere anche richiamata nel foglio di lavoro di Excel come qualunque altra formula, ma non è legata a Excel: è scritta in normale VBA quindi funziona anche in Word, Access, eccetera.

Si può utilizzare il parametro opzionale “encrypting” impostato a False per rovesciare l’operazione di crittazione e quindi per farsi restituire la stringa originale.

Esempi d’uso:

Con

cipher("Excel VBA è il meglio")

Otteniamo la stringa #fK3O,#F[7Aap&%ga dD´\tTI #O|\J'C&Z=B.*CB-

Se adesso richiamiamo la funzione chiedendo la decrittazione:

cipher("#fK3O,#F[7Aap&%ga dD´\tTI #O|\J'C&Z=B.*CB-", False)

ci viene restituito il testo di partenza:

Excel VBA è il meglio

Provare per credere!  🙂 

Un possibile utilizzo può essere nel creare una tabella di password per i propri utenti. Chiunque non sia in possesso della funzione di decrittazione non potrà “mai” (bè perlomeno in tempi ragionevoli…) risalire alla password originale.

Option Explicit

Function cipher(ByVal sPlainText As String, Optional encrypting As Boolean = True) As String
Dim iIndex As Integer, iEncoder As Integer, iEncodedVal As Integer, iDecodedVal As Integer
 
    On Error GoTo gest_err
    Select Case encrypting
    Case True
        'ogni carattere della stringa passata in argomento viene passato a XOR con un valore
        'casuale ogni volta diverso, compreso tra 32 e 126 (range dei caratteri stampabili).
        'Il bello dell'operatore XOR è che può essere rovesciato ripetendo l'XOR con lo stesso valore.
        '
        'La stringa in output dopo la codifica è lunga il doppio dell'originale, perchè
        'è necessario memorizzare i due valori sottoposti a XOR durante la codifica.
        '
        'Poichè il risultato viene memorizzato in una stringa di testo è necessario ottenere
        'caratteri stampabili per cui l'XOR è effettuato nel range di valori da 32 a 126.
        'Ecco perchè codifichiamo ogni carattere con un codice random differente, è più
        'facile controllare questi valori piuttosto che ripetere l'intera codifica indefinitamente
        'finchè ne troviamo una buona.
        
        Randomize Timer
        cipher = ""
        For iIndex = 1 To Len(sPlainText)
            Do
                iEncoder = Int(94 * Rnd + 32)               ' Use an encoder value between 32 and 126
                iEncodedVal = Asc(Mid(sPlainText, iIndex, 1)) Xor iEncoder
            Loop While iEncodedVal = 127 Or iEncodedVal < 32
            cipher = cipher & Chr(iEncodedVal) & Chr(iEncoder)
        Next iIndex
 
    Case False
       'Questo è il rovescio della funzione di cifratura
       'Semplicemente pone in XOR il primo e il secondo carattere di ogni coppia della stringa
    
       cipher = ""
       For iIndex = 1 To Len(sPlainText) Step 2
           iDecodedVal = Asc(Mid(sPlainText, iIndex, 1)) Xor Asc(Mid(sPlainText, iIndex + 1, 1))
           cipher = cipher & Chr(iDecodedVal)
       Next iIndex
    End Select
    
exit_function:
    Exit Function
    
gest_err:
    cipher = ""
    Resume exit_function
    
End Function

 

Codici segreti con l’operatore Xor

Codici segreti con l’operatore Xor

Login Registrati
Stai vedendo 10 articoli - dal 1 a 10 (di 10 totali)
  • Autore
    Articoli
  • #6572 Score: 0 | Risposta

    vecchio frac
    Senior Moderator
      247 pts

      La funzioncina che presentiamo è una rivisitazione di un noto algoritmo di cifratura molto semplice, basato sull'operatore Xor. Il codice è ampiamente
      [Leggi tutto al seguente link: https://www.excelvba.it/forumexcel/codici-segreti-con-loperatore-xor/]

      #6576 Score: 0 | Risposta

      albatros54
      Moderatore
        83 pts

        ho provato la funzione e....Funziona,pero ho notato una cosa, lanciando ripetutamente le funzione con la stessa PW leggibile, mi ritornava sempre una PW criptata diversa,e dato dal fatto che la variabile "iEncoder" si inzializza ogni volta con valori random?

         

        Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
        Sempre il mare, uomo libero, amerai!
        ( Charles Baudelaire )
        #6577 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          247 pts

          Certamente, hai notato giusto ed è proprio lì la forza della routine. Il processo inverso funziona sempre perchè la risultante è sempre un carattere con il suo Xor, e i deu caratteri nuovamente Xor-ati tra loro restituiscono il carattere di partenza (la risultante è lunga il doppio dell'originale perchè conserva in sè codificante e xor-codificato) 🙂

          #6578 Score: 0 | Risposta

          albatros54
          Moderatore
            83 pts

            Ho notato qualche cosa che non va.

            Ho criptato il mio nickname, tutto bene, ho copiato i vari caratteri per poi risalire al nickname in chiaro, li ho dati in pasto alla funzione ...non funziona, perche tra i caratteri criptati si trovano il segno "=" e il segno doppie virgolette  " . E un Bug ho sono io con il mio nickname a farlo andare in errore? Excel 2007 win 7

             

            Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
            Sempre il mare, uomo libero, amerai!
            ( Charles Baudelaire )
            #6579 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              247 pts

              Non è un bug, il problema è delle virgolette che quando le dai in pasto a una funzione devi raddoppiarle altrimenti il parser di VBA non le interpreta (o meglio le interpreta come fine del corpo argomenti e invece vanno "escapate").

              In generale, se una funzione accetta un argomento di tipo stringa, puoi passarle qualsiasi carattere ma il carattere " deve essere raddoppiato perchè venga inteso come semplice.

              Option Explicit
              
              Function myFunc(s As String) As String
                  myFunc = s
              End Function

              In immediata il test:

              ?myfunc("topolino")
              pippo
              ?myfunc("topolino ""ama"" pluto")
              topolino "ama" pluto
              #6580 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                247 pts

                Lo dico anche se non c'entra niente, è lo stesso problema dei doppi apici nella SQL injection, tecnica che non si dovrebbe usare (meglio usare i parametri) ma è il metodo più semplice e veloce per costruire stringhe SQL da far eseguire al motore Jet di Access (o via DAO o via ADO).

                #6581 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  247 pts

                  Ho fatto un test col tuo nick (ho dovuto farne tanti per ottenere un carattere virgolette 🙂 perchè ogni volta la funzione dà un risultato diverso).

                  cipher("albatros54") = !@[7"@F'C7H:&I;HfSbV

                  e quindi

                  cipher("!@[7""@F'C7H:&I;HfSbV", 0) = albatros54

                  Dobbiamo raddopppiare quel carattere virgolette (l'ho evidenziato in grassetto, spero che si veda) perchè altrimenti VBA crede che sia finita la parte della funzione passata in argomento.

                  #6582 Score: 0 | Risposta

                  albatros54
                  Moderatore
                    83 pts

                    Non voglio mettere in dubbio quello che dici, pero non riesco a decriptare il mio nickname,ho messo fra doppi apici le virgolette, ho messo fra doppi apici il segno = manon funziona 😀 

                    prova con questa stringa

                    cipher("D%@,=YR7#Q9XO/F>P/J";0)

                     

                    Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                    Sempre il mare, uomo libero, amerai!
                    ( Charles Baudelaire )
                    #6584 Score: 0 | Risposta

                    albatros54
                    Moderatore
                      83 pts

                      ALLA VOCE 

                      nella striga che ti ho postato mancano dei caratteri :mrgreen: 

                      sembra funzionare

                       

                      Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                      Sempre il mare, uomo libero, amerai!
                      ( Charles Baudelaire )
                      #6586 Score: 0 | Risposta

                      vecchio frac
                      Senior Moderator
                        247 pts

                        albatros54 wrote:ho messo fra doppi apici il segno =

                        Perché? il segno di uguale non dà problemi, solo quello delle virgolette 🙂

                      Login Registrati
                      Stai vedendo 10 articoli - dal 1 a 10 (di 10 totali)
                      Rispondi a: Codici segreti con l’operatore Xor
                      Gli allegati sono permessi solo ad utenti REGISTRATI
                      Le tue informazioni: