Partilhar via


Passo a passo: Criptografar e descriptografar seqüências de caracteres em Visual Basic

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

Você pode usar a criptografia para proteger os segredos do 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 de ser roubada, o que protege os ativos do usuário e fornece não-repúdio.A criptografia também pode proteger dados de um usuário de serem acessados por usuários não autorizados.

Para obter mais informações, consulte Serviços de criptografia.

Observação de segurançaObservação de segurança

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

Para criar o wrapper de criptografia

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

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

    Imports System.Security.Cryptography
    
  3. Em a classe de Simple3Des , adicione um campo particular para armazenar o provedor de serviços de criptografia 3DES.

    Private TripleDes As New TripleDESCryptoServiceProvider
    
  4. Adicione um método particular que cria um matriz de bytes de um comprimento especificado a partir do hash da chave especificada.

    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. Adicione um construtor para inicializar o provedor de serviços de criptografia 3DES.

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

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

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

Para testar o wrapper de criptografia

  1. Em uma classe separada, adicione um método que usa o método EncryptData do wrapper para criptografar uma cadeia de 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 lê a cadeia de caracteres criptografada na pasta Meus Documentos do usuário e descriptografa a cadeia de caracteres com o método DecryptData do wrapper.

    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 um código de interface do usuário para chamar os métodos TestEncoding e TestDecoding.

  4. Execute o aplicativo.

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

Consulte também

Referência

System.Security.Cryptography

DESCryptoServiceProvider

DES

TripleDES

Rijndael

Outros recursos

Serviços de criptografia