Passo a passo: Criptografando e descriptografando cadeias de caracteres no Visual Basic
Este passo a passo mostra como usar a DESCryptoServiceProvider classe para criptografar e descriptografar cadeias de caracteres usando a versão CSP (provedor de serviços de criptografia) do algoritmo Triple Data Encryption Standard (TripleDES). 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 de ser roubada, 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 o wrapper de criptografia
Crie a
Simple3Des
classe para encapsular os métodos de criptografia e descriptografia.Public NotInheritable Class Simple3Des End Class
Adicione uma importação do namespace de criptografia ao início do arquivo que contém a
Simple3Des
classe.Imports System.Security.Cryptography
Simple3Des
Na classe, adicione um campo privado para armazenar o provedor de serviços de criptografia 3DES.Private TripleDes As New TripleDESCryptoServiceProvider
Adicione um método privado que cria uma 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
Adicione um construtor para inicializar o provedor de serviços de criptografia 3DES.
O
key
parâmetro controla osEncryptData
métodos eDecryptData
.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
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
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 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 wrapper de criptografia
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
Adicione um método que leia a cadeia de caracteres criptografada da pasta Meus Documentos do usuário e descriptografe a cadeia de caracteres com o método do
DecryptData
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
Adicione o código da interface do usuário para chamar os
TestEncoding
métodos andTestDecoding
.Execute a aplicação.
Ao testar o aplicativo, observe que ele não descriptografará os dados se você fornecer a senha errada.