Compartir a través de


Tutorial: Cifrar y descifrar cadenas en Visual Basic

En este tutorial se muestra cómo usar la clase DESCryptoServiceProvider para cifrar y descifrar cadenas mediante la versión del proveedor de servicios criptográficos (CSP) del algoritmo Triple Data Encryption Standard (TripleDES). El primer paso es crear una clase contenedora sencilla que encapsule el algoritmo 3DES y almacene los datos cifrados como una cadena codificada en base 64. Luego, ese contenedor se usa para almacenar de forma segura los datos de usuario privados en un archivo de texto accesible públicamente.

Puede usar cifrado para proteger secretos de usuario (por ejemplo, contraseñas) y para que los usuarios no autorizados no puedan leer las credenciales. El cifrado puede evitar el robo de la identidad de un usuario autorizado, lo que protege los recursos de ese usuario y evita el repudio. El cifrado también puede evitar el acceso a los datos de un usuario por parte de usuarios no autorizados.

Para más información, vea Servicios criptográficos.

Importante

Los algoritmos Rijndael (ahora conocido como Estándar de cifrado avanzado [AES]) y Triple Data Encryption Standard (3DES) proporcionan más seguridad que DES porque tienen más recursos de computación. Para obtener más información, vea DES y Rijndael.

Para crear el contenedor de cifrado

  1. Cree la clase Simple3Des para encapsular los métodos de cifrado y descifrado.

    Public NotInheritable Class Simple3Des
    End Class
    
  2. Agregue una importación del espacio de nombres de criptografía al principio del archivo que contiene la clase Simple3Des.

    Imports System.Security.Cryptography
    
  3. En la clase Simple3Des, agregue un campo privado para almacenar el proveedor de servicios criptográficos 3DES.

    Private TripleDes As New TripleDESCryptoServiceProvider
    
  4. Agregue un método privado que cree una matriz de bytes de una longitud determinada a partir del hash de la clave 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. Agregue un constructor para inicializar el proveedor de servicios criptográficos 3DES.

    El parámetro key controla los métodos EncryptData y 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. Agregue un método público que cifre una cadena.

    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. Agregue un método público que descifre una cadena.

    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
    

    La clase contenedora ya se puede usar para proteger los recursos del usuario. En este ejemplo se usa para almacenar de forma segura los datos de usuario privados en un archivo de texto accesible públicamente.

Para probar el contenedor de cifrado

  1. En una clase independiente, agregue un método que use el método EncryptData del contenedor para cifrar una cadena y escríbala en la carpeta Mis documentos del usuario.

    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. Agregue un método que lea la cadena cifrada de la carpeta Mis documentos del usuario y descifre la cadena con el método DecryptData del contenedor.

    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. Agregue código de interfaz de usuario para llamar a los métodos TestEncoding y TestDecoding.

  4. Ejecute la aplicación.

    Al probar la aplicación, observe que no descifra los datos si se proporciona la contraseña incorrecta.

Consulte también