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 Risposta

    vecchio frac
    Moderatore
      16 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 Risposta
      albatros54
      albatros54
      Moderatore
        10 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 Risposta

        vecchio frac
        Moderatore
          16 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 Risposta
          albatros54
          albatros54
          Moderatore
            10 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 Risposta

            vecchio frac
            Moderatore
              16 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 Risposta

              vecchio frac
              Moderatore
                16 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 Risposta

                vecchio frac
                Moderatore
                  16 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 Risposta
                  albatros54
                  albatros54
                  Moderatore
                    10 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 Risposta
                    albatros54
                    albatros54
                    Moderatore
                      10 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 Risposta

                      vecchio frac
                      Moderatore
                        16 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:



                      vecchio frac - 592 risposte

                      albatros54
                      albatros54 - 507 risposte

                      Marius44
                      Marius44 - 270 risposte

                      patel
                      patel - 257 risposte

                      Luca73
                      Luca73 - 194 risposte

                      ChatBox per richiedere velocemente assistenza a semplici problematiche

                      Devi fare il login per scrivere nella chat

                      0
                      1