Share via


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 sicurezzaNota 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

  1. Creare una classe Simple3Des per incapsulare i metodi di crittografia e decrittografia.

    Public NotInheritable Class Simple3Des
    End Class
    
  2. Aggiungere un'importazione dello spazio dei nomi di crittografia all'inizio del file che contiene la classe Simple3Des.

    Imports System.Security.Cryptography
    
  3. Nella classe Simple3Des, aggiungere un campo privato per archiviare il provider di servizi crittografici 3DES.

    Private TripleDes As New TripleDESCryptoServiceProvider
    
  4. 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
    
  5. 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
    
  6. 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
    
  7. 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

  1. 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
    
  2. 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
    
  3. Aggiungere il codice dell'interfaccia dell'utente per chiamare i metodi TestEncoding e TestDecoding.

  4. Eseguire l'applicazione.

    Se viene fornita una password errata, non è possibile decrittografare i dati durante la verifica dell'applicazione.

Vedere anche

Riferimenti

System.Security.Cryptography

DESCryptoServiceProvider

DES

TripleDES

Rijndael

Altre risorse

Servizi di crittografia