Návod: Šifrování a dešifrování řetězců v jazyce Visual Basic

V tomto názorném postupu se dozvíte, jak pomocí TripleDES třídy šifrovat a dešifrovat řetězce pomocí algoritmu 3DES (Triple Data Encryption Standard). Prvním krokem je vytvoření jednoduché třídy obálky, která zapouzdřuje algoritmus 3DES a ukládá šifrovaná data jako řetězec kódovaný v base-64. Tento obal se použije k bezpečnému ukládání uživatelských privátních dat do veřejně přístupného textového souboru.

Šifrování můžete použít k ochraně tajných kódů uživatelů (například hesel) a k tomu, aby byly přihlašovací údaje nečitelné neoprávněnými uživateli. To může chránit identitu autorizovaného uživatele před odcizením, což chrání prostředky uživatele a poskytuje nepopiratelnost. Šifrování může také chránit data uživatele před přístupem neoprávněných uživatelů.

Další informace naleznete v tématu Kryptografické služby.

Důležité

Algoritmy Rijndael (nyní označované jako Advanced Encryption Standard [AES]) a Triple Data Encryption Standard (3DES) poskytují větší zabezpečení než DES, protože jsou výpočetně náročné. Pro více informací se podívejte na DES a Rijndael.

Vytvoření obálky šifrování

  1. Vytvořte třídu Simple3Des za účelem zapouzdření metod šifrování a dešifrování.

    Public NotInheritable Class Simple3Des
    End Class
    
  2. Na začátek souboru, který obsahuje třídu Simple3Des, přidejte import oboru názvů kryptografie.

    Imports System.Security.Cryptography
    
  3. Simple3Des Do třídy přidejte soukromá pole pro uložení zprostředkovatele kryptografických služeb 3DES, zadaného klíče a verze formátu, velikosti soli a počtu iterací.

    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. Přidejte privátní metodu, která vytvoří pole bajtů ze zadaného klíče a soli.

    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. Přidejte konstruktor, který ukládá zadaný klíč.

    Parametr key řídí metody EncryptData a DecryptData metody.

    Sub New(ByVal key As String)
        ' Store the key. The encryption key and IV are created per message.
        Me.Key = key
    End Sub
    
  6. Přidejte veřejnou metodu, která šifruje řetězec.

    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. Přidejte veřejnou metodu, která dešifruje řetězec.

    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
    

    Třídu obálky lze nyní použít k ochraně uživatelských aktiv. V tomto příkladu se používá k bezpečnému ukládání soukromých dat uživatelů do veřejně přístupného textového souboru.

Otestování obálky šifrování

  1. Do samostatné třídy přidejte metodu, která používá metodu obálky EncryptData k zašifrování řetězce a zápisu do složky Dokumenty uživatele.

    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. Přidejte metodu, která čte šifrovaný řetězec ze složky Dokumenty uživatele a dešifruje řetězec metodou obálky 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. Přidejte kód uživatelského rozhraní pro volání TestEncoding metod a TestDecoding metod.

  4. Aplikaci spusťte.

    Když aplikaci otestujete, všimněte si, že pokud zadáte nesprávné heslo, data nešifruje.

Viz také