Delen via


Overzicht: Tekenreeksen versleutelen en ontsleutelen in Visual Basic

In dit scenario ziet u hoe u de klasse gebruikt voor het DESCryptoServiceProvider versleutelen en ontsleutelen van tekenreeksen met behulp van de CSP-versie (cryptografische serviceprovider) van het algoritme Triple Data Encryption Standard (TripleDES). De eerste stap is het maken van een eenvoudige wrapperklasse die het 3DES-algoritme inkapselt en de versleutelde gegevens opslaat als een met base 64 gecodeerde tekenreeks. Vervolgens wordt die wrapper gebruikt om persoonlijke gebruikersgegevens veilig op te slaan in een openbaar toegankelijk tekstbestand.

U kunt versleuteling gebruiken om gebruikersgeheimen (bijvoorbeeld wachtwoorden) te beveiligen en referenties onleesbaar te maken door onbevoegde gebruikers. Dit kan de identiteit van een geautoriseerde gebruiker beschermen tegen diefstal, waardoor de assets van de gebruiker worden beschermd en niet-afkeer wordt geboden. Versleuteling kan de gegevens van een gebruiker ook beschermen tegen toegang door onbevoegde gebruikers.

Zie Cryptografische services voor meer informatie.

Belangrijk

De Rijndael (nu aangeduid als Advanced Encryption Standard [AES]) en Triple Data Encryption Standard (3DES) bieden meer beveiliging dan DES omdat ze rekenintensief zijn. Zie voor meer informatie DES en Rijndael.

De versleutelingswikkelaar maken

  1. Maak de Simple3Des klasse om de versleutelings- en ontsleutelingsmethoden in te kapselen.

    Public NotInheritable Class Simple3Des
    End Class
    
  2. Voeg een import van de cryptografienaamruimte toe aan het begin van het bestand dat de Simple3Des klasse bevat.

    Imports System.Security.Cryptography
    
  3. Voeg in de Simple3Des klasse een privéveld toe om de cryptografische 3DES-serviceprovider op te slaan.

    Private TripleDes As New TripleDESCryptoServiceProvider
    
  4. Voeg een persoonlijke methode toe waarmee een bytematrix van een opgegeven lengte wordt gemaakt op basis van de hash van de opgegeven sleutel.

    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. Voeg een constructor toe om de cryptografische 3DES-serviceprovider te initialiseren.

    De key parameter bepaalt de EncryptData en DecryptData methoden.

    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. Voeg een openbare methode toe waarmee een tekenreeks wordt versleuteld.

    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. Voeg een openbare methode toe waarmee een tekenreeks wordt ontsleuteld.

    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
    

    De wrapper-klasse kan nu worden gebruikt om gebruikersassets te beveiligen. In dit voorbeeld wordt het gebruikt om persoonlijke gebruikersgegevens veilig op te slaan in een openbaar toegankelijk tekstbestand.

De versleutelingswikkelaar testen

  1. Voeg in een afzonderlijke klasse een methode toe die gebruikmaakt van de methode van de wrapper EncryptData om een tekenreeks te versleutelen en naar de map Mijn documenten van de gebruiker te schrijven.

    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. Voeg een methode toe waarmee de versleutelde tekenreeks uit de map Mijn documenten van de gebruiker wordt gelezen en de tekenreeks wordt ontsleuteld met de methode van DecryptData de 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. Voeg code van de gebruikersinterface toe om de TestEncoding en TestDecoding methoden aan te roepen.

  4. Voer de toepassing uit.

    Wanneer u de toepassing test, ziet u dat de gegevens niet worden ontsleuteld als u het verkeerde wachtwoord opgeeft.

Zie ook