Passo a passo: Criptografando e descriptografando cadeias de caracteres no Visual Basic

Este passo a passo mostra como usar a TripleDES classe para criptografar e descriptografar cadeias de caracteres usando o algoritmo Triple Data Encryption Standard (3DES). A primeira etapa é criar uma classe wrapper simples que encapsula o algoritmo 3DES e armazena os dados criptografados como uma cadeia de caracteres codificada em base 64. Em seguida, esse wrapper é usado para armazenar com segurança dados privados do usuário em um arquivo de texto acessível publicamente.

Você pode usar a criptografia para proteger segredos de usuário (por exemplo, senhas) e para tornar as credenciais ilegíveis por usuários não autorizados. Isso pode proteger a identidade de um usuário autorizado contra roubo, o que protege os ativos do usuário e fornece não repúdio. A criptografia também pode proteger os dados de um usuário de serem acessados por usuários não autorizados.

Para obter mais informações, consulte Serviços criptográficos.

Importante

Os algoritmos Rijndael (agora conhecido como Advanced Encryption Standard [AES]) e Triple Data Encryption Standard (3DES) fornecem maior segurança do que o DES porque são mais intensivos em termos computacionais. Para obter mais informações, consulte DES e Rijndael.

Para criar a capa de criptografia

  1. Crie a Simple3Des classe para encapsular os métodos de criptografia e descriptografia.

    Public NotInheritable Class Simple3Des
    End Class
    
  2. Adicione uma importação do namespace de criptografia ao início do arquivo que contém a Simple3Des classe.

    Imports System.Security.Cryptography
    
  3. Na Simple3Des classe, adicione campos privados para armazenar o fornecedor de serviço criptográfico 3DES, a chave especificada, a versão do formato, o tamanho do sal e a contagem de iterações.

    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. Adicione um método privado que crie um array de bytes a partir da chave especificada e um sal.

    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. Adicione um construtor que armazene a chave especificada.

    O key parâmetro controla os EncryptData métodos e 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. Adicione um método público que criptografa uma cadeia de caracteres.

    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. Adicione um método público que descriptografa uma cadeia de caracteres.

    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
    

    A classe wrapper agora pode ser usada para proteger os ativos do usuário. Neste exemplo, ele é usado para armazenar com segurança dados privados do usuário em um arquivo de texto acessível publicamente.

Para testar o envoltório de criptografia

  1. Em uma classe separada, adicione um método que usa o método do wrapper para criptografar uma cadeia de EncryptData caracteres e gravá-la na pasta Meus Documentos do usuário.

    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. Adicione um método que leia a cadeia de caracteres encriptada da pasta Os Meus Documentos do utilizador e desencripte a cadeia de caracteres com o método do wrapper 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. Adicione o código da interface de utilizador para chamar os métodos TestEncoding e TestDecoding.

  4. Execute o aplicativo.

    Ao testar o aplicativo, observe que ele não descriptografará os dados se você fornecer a senha errada.

Ver também