Поделиться через


Пошаговое руководство. Шифрование и расшифровка строк в Visual Basic

В этом примере демонстрируется использование DESCryptoServiceProvider класса для шифрования и расшифровки строк с помощью версии стандартного алгоритма шифрования данных Triple (TripleDES) поставщика служб шифрования (CSP).Первым шагом является создание простого класса-оболочки, который инкапсулирует алгоритм 3DES и сохраняет зашифрованные данные в виде зашифрованной строки base-64.Затем оболочка используется для безопасного хранения собственных данных пользователя в общедоступном текстовом файле.

Можно использовать шифрование для защиты секретов пользователя (например паролей) и создания учетных данных, которые недоступны для чтения неавторизованным пользователям.Это позволяет защитить от кражи удостоверения авторизованного пользователя, что защищает ресурсы пользователя и гарантирует неподдельность.Шифрование также может защитить данные пользователя от доступа неавторизованных пользователей.

Дополнительные сведения см. в разделе Службы криптографии.

Примечание о безопасностиПримечание по безопасности

Rijndael (также известный как расширенный стандарт шифрования [AES]) и стандарт шифрования данных Triple (3DES) обеспечивают более высокую степень безопасности, чем DES, из-за большего объёма вычислений.Дополнительные сведения см. в разделах DES и Rijndael.

Создание оболочки шифрования

  1. Создайте класс Simple3Des для инкапсуляции методов шифрования и расшифровки.

    Public NotInheritable Class Simple3Des
    End Class
    
  2. Добавьте импорт пространства имен шифрования к началу файла, который содержит класс Simple3Des.

    Imports System.Security.Cryptography
    
  3. В классе Simple3Des добавьте закрытое поле для хранения поставщика служб шифрования 3DES.

    Private TripleDes As New TripleDESCryptoServiceProvider
    
  4. Добавьте закрытый метод, который создает массив байтов указанной длины из хэша указанного ключа.

    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. Добавьте конструктор для инициализации поставщика служб шифрования 3DES.

    Параметр key управляет методами 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. Добавьте открытый метод, который шифрует строку.

    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. Добавьте открытый метод, который расшифровывает строку.

    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
    

    Класс-оболочку теперь можно использовать для защиты ресурсов пользователей.В данном примере он используется для безопасного хранения частных данных пользователя в общедоступном текстовом файле.

Проверка оболочки шифрования

  1. В отдельном классе добавьте метод, использующий метод EncryptData оболочки, чтобы зашифровать строку и записать ее в папку "Мои документы" пользователя.

    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. Добавьте метод, который считывает зашифрованную строку из папки "Мои документы" пользователя и расшифровывает строку с помощью метода оболочки 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. Добавьте код пользовательского интерфейса для вызова методов TestEncoding и TestDecoding.

  4. Запустите приложение.

    При тестировании приложения, обратите внимание, что оно не будет расшифровывать данные при вводе неправильного пароля.

См. также

Ссылки

System.Security.Cryptography

DESCryptoServiceProvider

DES

TripleDES

Rijndael

Другие ресурсы

Службы криптографии