Tutorial: Cifrar y descifrar cadenas en Visual Basic
Este tutorial muestra cómo utilizar la clase DESCryptoServiceProvider para cifrar y descifrar cadenas utilizando la versión del proveedor de servicios criptográficos (CSP) del algoritmo de Triple cifrado de datos estándar (TripleDES). El primer paso consiste en crear una clase contenedora simple que encapsula el algoritmo (3DES) y almacena los datos cifrados como una cadena Base-64 codificada. A continuación, ese contenedor se utiliza para almacenar con seguridad los datos privados del usuario en un archivo de texto públicamente accesible.
Puede utilizar el cifrado para proteger secretos de usuario (por ejemplo, contraseñas) y hacer que las credenciales sean ilegibles por los usuarios no autorizados. Así se puede proteger la identidad de un usuario autorizado contra su substracción, que protege los activos del usuario y proporciona su no repudiación. El cifrado también puede proteger los datos de un usuario para que los usuarios no autorizados no puedan tener acceso a ellos.
Para obtener más información, vea Servicios criptográficos.
Nota sobre la seguridad |
---|
Los algoritmos Rijndael (denominado en la actualidad como Estándar avanzado de cifrado [AES]) y Triple cifrado de datos estándar (3DES) proporcionan una seguridad mayor que la de DES porque realizan una mayor carga computacional. Para obtener más información, vea DES y Rijndael. |
Para crear el contenedor de cifrado
Agregue una importación del espacio de nombres de criptografía al principio del archivo.
Imports System.Security.Cryptography
Cree una clase para encapsular los métodos de cifrado y descifrado.
Public NotInheritable Class Simple3Des End Class
Agregue un campo privado para almacenar el proveedor de servicios criptográficos 3DES.
Private TripleDes As New TripleDESCryptoServiceProvider
Agregar un método privado que cree una matriz de bytes de una longitud especificada 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
Agregar 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
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
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 se puede utilizar ahora para proteger los activos del usuario. En este ejemplo, se utiliza para almacenar con seguridad los datos privados del usuario en un archivo de texto públicamente accesible.
Para probar el contenedor de cifrado
En una clase independiente, agregue un método que utilice el método EncryptData del contenedor para cifrar una cadena y escribirla 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
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
Agregue el código de la interfaz de usuario para llamar a los métodos TestEncoding y TestDecoding.
Ejecute la aplicación.
Cuando pruebe la aplicación, fíjese en que no descifrará los datos si proporciona una contraseña incorrecta.