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

Tento názorný postup ukazuje, jak pomocí třídy šifrovat a dešifrovat řetězce pomocí verze zprostředkovatele kryptografických služeb DESCryptoServiceProvider (CSP) algoritmu Triple Data Encryption Standard ( TripleDES ). Prvním krokem je vytvoření jednoduché obálkové třídy, která zapouzdřuje algoritmus 3DES a ukládá šifrovaná data jako řetězec s kódováním base-64. Potom se tato obálka použije k bezpečnému uložení soukromých uživatelský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 nečitelným přihlašovacím údajům neoprávněným uživatelům. To může chránit identitu autorizovaného uživatele před odcizením, což chrání prostředky uživatele a zajišťuje nepochycení. Šifrování může také chránit data uživatele před tím, než k nim budou mít přístup neoprávnění uživatelé.

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

Důležité

Algoritmy Ovindael (nyní označové jako standard AES (Advanced Encryption Standard) [AES]) a 3DES (Triple Data Encryption Standard) poskytují vyšší zabezpečení než DES, protože jsou výpočetně náročnější. Další informace naleznete v tématech DES a Rijndael.

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

  1. Vytvořte třídu Simple3Des pro zapouzdření metod šifrování a dešifrování.

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

    Imports System.Security.Cryptography
    
  3. Do třídy Simple3Des přidejte privátní pole pro uložení zprostředkovatele kryptografických služeb 3DES.

    Private TripleDes As New TripleDESCryptoServiceProvider
    
  4. Přidejte privátní metodu, která vytvoří pole bajtů zadané délky z hodnoty hash zadaného klíče.

    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. Přidejte konstruktor pro inicializaci zprostředkovatele kryptografických služeb 3DES.

    Parametr key řídí metody a EncryptData 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. Přidejte veřejnou metodu, která zašifruje řetězec.

    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. 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)
    
        ' 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
    

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

Testování obálky šifrování

  1. Do samostatné třídy přidejte metodu, která používá metodu obálky k zašifrování řetězce a zápisu do Dokumenty EncryptData složky 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á přečte zašifrovaný řetězec ze složky Dokumenty uživatele a dešifruje řetězec pomocí metody DecryptData obálky.

    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 TestDecoding a .

  4. Spusťte aplikaci.

    Při testování aplikace si všimněte, že pokud zadáte nesprávné heslo, data se dešifrují.

Viz také