Genomgång: Kryptera och dekryptera strängar i Visual Basic

Den här genomgången TripleDES visar hur du använder klassen för att kryptera och dekryptera strängar med algoritmen Triple Data Encryption Standard (3DES). Det första steget är att skapa en enkel omslutningsklass som kapslar in 3DES-algoritmen och lagrar krypterade data som en base-64-kodad sträng. Sedan används omslutningen för att lagra privata användardata på ett säkert sätt i en offentligt tillgänglig textfil.

Du kan använda kryptering för att skydda användarhemligheter (till exempel lösenord) och för att göra autentiseringsuppgifter olästa av obehöriga användare. Detta kan skydda en behörig användares identitet från att bli stulen, vilket skyddar användarens tillgångar och ger icke-förnekbarhet. Kryptering kan också skydda en användares data från att kommas åt av obehöriga användare.

Mer information finns i Kryptografiska tjänster.

Viktigt!

Rijndael-algoritmerna (kallas nu Advanced Encryption Standard [AES]) och Triple Data Encryption Standard (3DES) ger större säkerhet än DES eftersom de är mer beräkningsintensiva. Mer information finns i DES och Rijndael.

Så här skapar du krypteringsomslutningen

  1. Simple3Des Skapa klassen för att kapsla in krypterings- och dekrypteringsmetoderna.

    Public NotInheritable Class Simple3Des
    End Class
    
  2. Lägg till en import av kryptografinamnområdet i början av filen som innehåller Simple3Des klassen.

    Imports System.Security.Cryptography
    
  3. Simple3Des I klassen lägger du till privata fält för att lagra 3DES-kryptografitjänstprovidern, den angivna nyckeln och formatversionen, saltstorleken och antalet iteration.

    Private TripleDes As TripleDES = TripleDES.Create()
    
    Private Const FormatVersion As Byte = 1
    Private Const SaltSize As Integer = 16
    Private Const Iterations As Integer = 600000
    Private ReadOnly Key As String
    
  4. Lägg till en privat metod som skapar en bytematris från den angivna nyckeln och ett salt.

    Private Function DeriveKey(ByVal salt() As Byte) As Byte()
        ' Derive a key from the specified key and the salt.
        Using kdf As New Rfc2898DeriveBytes(
            Key, salt, Iterations, HashAlgorithmName.SHA256)
    
            Return kdf.GetBytes(TripleDes.KeySize \ 8)
        End Using
    End Function
    
  5. Lägg till en konstruktor som lagrar den angivna nyckeln.

    Parametern key styr EncryptData metoderna och DecryptData .

    Sub New(ByVal key As String)
        ' Store the key. The encryption key and IV are created per message.
        Me.Key = key
    End Sub
    
  6. Lägg till en offentlig metod som krypterar en sträng.

    Public Function EncryptData( 
        ByVal plaintext As String) As String
    
        ' Create a new salt and initialization vector for this message.
        Dim salt(SaltSize - 1) As Byte
        Using rng As RandomNumberGenerator = RandomNumberGenerator.Create()
            rng.GetBytes(salt)
        End Using
    
        TripleDes.Key = DeriveKey(salt)
        TripleDes.GenerateIV()
    
        ' 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
        ' Write the format version, salt, and initialization vector in front of
        ' the cipher text. The version identifies the salt length and iteration count.
        ms.WriteByte(FormatVersion)
        ms.Write(salt, 0, salt.Length)
        ms.Write(TripleDes.IV, 0, TripleDes.IV.Length)
    
        ' 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. Lägg till en offentlig metod som dekrypterar en sträng.

    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)
    
        ' Read the header that precedes the cipher text. Only one format
        ' version exists, so reject anything else.
        Dim ivSize As Integer = TripleDes.BlockSize \ 8
        Dim headerSize As Integer = 1 + SaltSize + ivSize
        If encryptedBytes.Length < headerSize OrElse
            encryptedBytes(0) <> FormatVersion Then
    
            Throw New CryptographicException(
                "The encrypted data is not in the expected format.")
        End If
    
        Dim salt(SaltSize - 1) As Byte
        Dim iv(ivSize - 1) As Byte
        Array.Copy(encryptedBytes, 1, salt, 0, SaltSize)
        Array.Copy(encryptedBytes, 1 + SaltSize, iv, 0, ivSize)
    
        TripleDes.Key = DeriveKey(salt)
        TripleDes.IV = iv
    
        ' 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, headerSize, 
            encryptedBytes.Length - headerSize)
        decStream.FlushFinalBlock()
    
        ' Convert the plaintext stream to a string.
        Return System.Text.Encoding.Unicode.GetString(ms.ToArray)
    End Function
    

    Omslutningsklassen kan nu användas för att säkra användardata. I det här exemplet används den för att lagra privata användardata på ett säkert sätt i en offentligt tillgänglig textfil.

Testa krypteringsomslutningen

  1. I en separat klass lägger du till en metod som använder omslutningsmetoden EncryptData för att kryptera en sträng och skriva den till användarens mapp Mina dokument.

    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. Lägg till en metod som läser den krypterade strängen från användarens mappen Mina dokument och dekrypterar strängen med omslutningsmetoden DecryptData .

    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. Lägg till användargränssnittskod för att anropa TestEncoding metoderna och TestDecoding .

  4. Kör programmet.

    När du testar programmet ser du att det inte dekrypterar data om du anger fel lösenord.

Se även