Wskazówki: szyfrowanie i odszyfrowywanie ciągów w Visual Basic

W tym przewodniku pokazano, jak używać DESCryptoServiceProvider klasy do szyfrowania i odszyfrowywania ciągów przy użyciu wersji dostawcy usług kryptograficznych (CSP) algorytmu Triple Data Encryption Standard (TripleDES). Pierwszym krokiem jest utworzenie prostej klasy otoki, która hermetyzuje algorytm 3DES i przechowuje zaszyfrowane dane jako ciąg zakodowany w formacie base-64. Następnie ta otoka służy do bezpiecznego przechowywania prywatnych danych użytkownika w publicznie dostępnym pliku tekstowym.

Szyfrowanie służy do ochrony wpisów tajnych użytkownika (na przykład haseł) i tworzenia poświadczeń nieczytelnych przez nieautoryzowanych użytkowników. Dzięki temu można chronić tożsamość autoryzowanego użytkownika przed kradzieżą, która chroni zasoby użytkownika i nie odrzuca. Szyfrowanie może również chronić dane użytkownika przed uzyskaniem dostępu przez nieautoryzowanych użytkowników.

Aby uzyskać więcej informacji, zobacz Usługi kryptograficzne.

Ważne

Algorytmy Rijndael (określane obecnie jako Advanced Encryption Standard [AES]) i Triple Data Encryption Standard (3DES) zapewniają większe bezpieczeństwo niż DES, ponieważ są bardziej intensywnie obliczeniowe. Aby uzyskać więcej informacji, zobacz tematy DES oraz Rijndael.

Aby utworzyć otokę szyfrowania

  1. Utwórz klasę Simple3Des , aby hermetyzować metody szyfrowania i odszyfrowywania.

    Public NotInheritable Class Simple3Des
    End Class
    
  2. Dodaj import przestrzeni nazw kryptografii na początku pliku zawierającego klasę Simple3Des .

    Imports System.Security.Cryptography
    
  3. Simple3Des W klasie dodaj pole prywatne do przechowywania dostawcy usług kryptograficznych 3DES.

    Private TripleDes As New TripleDESCryptoServiceProvider
    
  4. Dodaj metodę prywatną, która tworzy tablicę bajtów o określonej długości na podstawie skrótu określonego klucza.

    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. Dodaj konstruktor, aby zainicjować dostawcę usług kryptograficznych 3DES.

    Parametr key steruje metodami EncryptData i 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. Dodaj metodę publiczną, która szyfruje ciąg.

    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. Dodaj metodę publiczną, która odszyfrowuje ciąg.

    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
    

    Klasa otoki może teraz służyć do ochrony zasobów użytkowników. W tym przykładzie jest używany do bezpiecznego przechowywania prywatnych danych użytkownika w publicznie dostępnym pliku tekstowym.

Aby przetestować otokę szyfrowania

  1. W oddzielnej klasie dodaj metodę, która używa metody otoki EncryptData do szyfrowania ciągu i zapisywania go w folderze Moje dokumenty użytkownika.

    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. Dodaj metodę, która odczytuje zaszyfrowany ciąg z folderu Moje dokumenty użytkownika i odszyfrowuje ciąg za pomocą metody otoki 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. Dodaj kod interfejsu użytkownika w celu wywołania TestEncoding metod i TestDecoding .

  4. Uruchom aplikację.

    Podczas testowania aplikacji zwróć uwagę, że nie będzie ona odszyfrowywać danych, jeśli podasz nieprawidłowe hasło.

Zobacz też