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