Procedura dettagliata: crittografia e decrittografia di stringhe in Visual Basic
In questa procedura dettagliata viene illustrato l'utilizzo della classe DESCryptoServiceProvider per la crittografia e decrittografia di stringhe mediante la versione del provider di servizi di crittografia (CSP) dell'algoritmo Triple Data Encryption Standard (TripleDES). Il primo passo è la creazione di una classe wrapper semplice che incapsula l'algoritmo 3DES e memorizza i dati crittografati come stringa con codifica Base 64. Il wrapper viene quindi utilizzato per archiviare in modo protetto i dati personali dell'utente in un file di testo pubblicamente accessibile.
È possibile utilizzare la crittografia per proteggere informazioni riservate dell'utente (ad esempio, la password) e impedire a utenti non autorizzati la lettura delle credenziali. È possibile impedire che l'identità di un utente autorizzato venga prelevata, proteggere le risorse dell'utente e fornire il non ripudio. La crittografia consente inoltre di proteggere i dati dell'utente dall'accesso di utenti non autorizzati.
Per ulteriori informazioni, vedere Servizi di crittografia.
Nota sulla sicurezza |
---|
Gli algoritmi Rijndael, noto ora come Advanced Encryption Standard (AES), e Triple Data Encryption Standard (3DES) garantiscono una maggiore sicurezza rispetto al DES in quanto più complessi dal punto di vista del calcolo. Per ulteriori informazioni, vedere DES e Rijndael. |
Per creare il wrapper di crittografia
Aggiungere un import dello spazio dei nomi della crittografia all'inizio del file.
Imports System.Security.Cryptography
Creare una classe per incapsulare i metodi di crittografia e decrittografia.
Public NotInheritable Class Simple3Des End Class
Aggiungere un campo privato per memorizzare il provider di servizi crittografici 3DES.
Private TripleDes As New TripleDESCryptoServiceProvider
Aggiungere un metodo privato per creare una matrice di byte di lunghezza specificata dall'hash della chiave indicata.
Private Function TruncateHash( ByVal key As String, ByVal length As Integer) As Byte() Dim sha1 As New SHA1CryptoServiceProvider ' Hash the key. Dim keyBytes() As Byte = System.Text.Encoding.Unicode.GetBytes(key) Dim hash() As Byte = sha1.ComputeHash(keyBytes) ' Truncate or pad the hash. ReDim Preserve hash(length - 1) Return hash End Function
Aggiungere un costruttore per inizializzare il provider di servizi crittografici 3DES.
Il parametro key controlla i metodi EncryptData e DecryptData.
Sub New(ByVal key As String) ' Initialize the crypto provider. TripleDes.Key = TruncateHash(key, TripleDes.KeySize \ 8) TripleDes.IV = TruncateHash("", TripleDes.BlockSize \ 8) End Sub
Aggiungere un metodo pubblico per la crittografia della stringa.
Public Function EncryptData( ByVal plaintext As String) As String ' Convert the plaintext string to a byte array. Dim plaintextBytes() As Byte = System.Text.Encoding.Unicode.GetBytes(plaintext) ' Create the stream. Dim ms As New System.IO.MemoryStream ' Create the encoder to write to the stream. Dim encStream As New CryptoStream(ms, TripleDes.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write) ' Use the crypto stream to write the byte array to the stream. encStream.Write(plaintextBytes, 0, plaintextBytes.Length) encStream.FlushFinalBlock() ' Convert the encrypted stream to a printable string. Return Convert.ToBase64String(ms.ToArray) End Function
Aggiungere un metodo pubblico per la decrittografia della stringa.
Public Function DecryptData( ByVal encryptedtext As String) As String ' Convert the encrypted text string to a byte array. Dim encryptedBytes() As Byte = Convert.FromBase64String(encryptedtext) ' Create the stream. Dim ms As New System.IO.MemoryStream ' Create the decoder to write to the stream. Dim decStream As New CryptoStream(ms, TripleDes.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Write) ' Use the crypto stream to write the byte array to the stream. decStream.Write(encryptedBytes, 0, encryptedBytes.Length) decStream.FlushFinalBlock() ' Convert the plaintext stream to a string. Return System.Text.Encoding.Unicode.GetString(ms.ToArray) End Function
È ora possibile utilizzare la classe wrapper per proteggere le risorse dell'utente. Nel seguente esempio, la classe viene utilizzata per archiviare in modo protetto i dati personali dell'utente in un file di testo accessibile pubblicamente.
Per verificare il funzionamento del wrapper di crittografia
Aggiungere in un'altra classe un metodo che utilizza il metodo EncryptData del wrapper per crittografare una stringa e scriverla nella cartella Documenti dell'utente.
Sub TestEncoding() Dim plainText As String = InputBox("Enter the plain text:") Dim password As String = InputBox("Enter the password:") Dim wrapper As New Simple3Des(password) Dim cipherText As String = wrapper.EncryptData(plainText) MsgBox("The cipher text is: " & cipherText) My.Computer.FileSystem.WriteAllText( My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\cipherText.txt", cipherText, False) End Sub
Aggiungere un metodo con cui è possibile leggere la stringa crittografata nella cartella Documenti dell'utente e decrittografare tale stringa con il metodo DecryptData del wrapper.
Sub TestDecoding() Dim cipherText As String = My.Computer.FileSystem.ReadAllText( My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\cipherText.txt") Dim password As String = InputBox("Enter the password:") Dim wrapper As New Simple3Des(password) ' DecryptData throws if the wrong password is used. Try Dim plainText As String = wrapper.DecryptData(cipherText) MsgBox("The plain text is: " & plainText) Catch ex As System.Security.Cryptography.CryptographicException MsgBox("The data could not be decrypted with the password.") End Try End Sub
Aggiungere il codice dell'interfaccia dell'utente per chiamare i metodi TestEncoding e TestDecoding.
Eseguire l'applicazione.
Se viene fornita una password errata, non è possibile decrittografare i dati durante la verifica dell'applicazione.