CÓMO: Cifrar y descifrar un archivo mediante Visual Basic .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 301070 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E301070
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo se muestra cómo utilizar las clases de cifrado proporcionadas por Microsoft .NET Framework para cifrar un archivo de texto en un estado ilegible y después descifrar esa información para devolverla a su formato original.

Requisitos

La lista siguiente describe el hardware, el software, la infraestructura de red y los Service Pack recomendados que necesitará:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server o Windows NT 4.0 Server
  • Microsoft Visual Studio .NET

Cifrado y descifrado

El espacio de nombres System.Security.Cryptographic de Microsoft .NET Framework proporciona diversas herramientas que ayudan al cifrado y el descifrado. La clase CryptoStream es una de las numerosas clases que se proporcionan y está diseñada para cifrar o descifrar el contenido a medida que se transmite en secuencias a un archivo.

Para cifrar un archivo, siga estos pasos:
  1. Abra Visual Studio .NET.
  2. Cree una nueva aplicación de consola en Microsoft Visual Basic .NET. Visual Basic .NET creará un módulo y un procedimiento Main() vacío.
  3. Utilice la instrucción Imports de los espacios de nombres System, System.Security, System.Security.Cryptography, System.Text y System.IO de forma que no tenga que suministrar declaraciones de estos espacios de nombres más adelante en el código. Debe utilizar estas instrucciones antes que cualquier otra declaración.
    Imports System
    Imports System.IO
    Imports System.Security
    Imports System.Security.Cryptography
    Imports System.Text
  4. Agregue a la clase o al módulo una constante que represente la clave secreta de cifrado y descifrado.
    'Debe ser 64 bits, 8 bytes.
    Private Const sSecretKey As String = "Password"
  5. Cree un método dentro de la clase llamado EncryptFile, con tres parámetros: sInputFile , sOutputFile y sKey (la clave secreta que se utiliza para cifrar y descifrar el archivo).
        Sub EncryptFile(ByVal sInputFilename As String, _
                       ByVal sOutputFilename As String, _
                       ByVal sKey As String)
        End Sub
  6. En el procedimiento EncryptFile, cree objetos FileStream de entrada y de salida para controlar la lectura y la escritura de los archivos de destino.
            Dim fsInput As New FileStream(sInputFilename, _
                                        FileMode.Open, FileAccess.Read)
            Dim fsEncrypted As New FileStream(sOutputFilename, _
                                        FileMode.Create, FileAccess.Write)
  7. Declare una instancia de la clase DESCryptoServiceProvider, que representa la tecnología real de cifrado y descifrado que se utilizará en los archivos. En este momento puede crear otro proveedor diferente si prefiere utilizar RSA u otra técnica de cifrado.
    Dim DES As New DESCryptoServiceProvider()
  8. El proveedor de cifrado debe proporcionarle la clave secreta como una matriz de bytes. El espacio de nombres System.Text proporciona una útil función GetBytes(), que toma una cadena y devuelve una matriz de bytes, como parte de sus características de codificación. El tamaño de la clave es diferente para cada técnica de cifrado; DES utiliza una clave de 64 bits, es decir, 8 bytes u 8 caracteres.

    Si no proporciona ninguna clave, el proveedor generará una de forma aleatoria, de manera que se codificará un archivo sin que exista ninguna manera de descifrarlo. Además, debe proporcionar el vector de inicialización (IV). Este valor se utiliza como parte del cifrado y, al igual que la clave, se genera de forma aleatoria si no lo proporciona. Como tiene que ser el mismo para el cifrado y el descifrado, no resulta útil dejar que se genere de forma aleatoria.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
  9. Cree una instancia de la clase CryptoStream, utilizando el proveedor de cifrado para obtener un objeto de cifrado (CreateEncryptor) y el objeto de salida FileStream existente como parte del constructor.
    Dim cryptostream As New CryptoStream(fsEncrypted, _
                                         desencrypt, _
                                         CryptoStreamMode.Write)
  10. Por último, lea en el archivo de entrada y escriba en el archivo de salida que se está pasando al objeto CryptoStream, en el que se cifrará con la clave que proporcionó.
    Dim bytearrayinput(fsInput.Length - 1) As Byte
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
  11. Cree un método llamado DecryptFile. El proceso de descifrado es muy similar al proceso de cifrado, pero hay dos diferencias importantes entre los procedimientos DecryptFile y EncryptFile. En primer lugar, se utiliza CreateDecryptor en lugar de CreateEncryptor para la creación del objeto CryptoStream, especificando cómo se utilizará el objeto. En segundo lugar, al escribir el texto descifrado en el archivo de destino, el objeto CryptoStream es ahora el origen en vez de la secuencia de destino.
    Sub DecryptFile(ByVal sInputFilename As String, _
        ByVal sOutputFilename As String, _
        ByVal sKey As String)
    
        Dim DES As New DESCryptoServiceProvider()
        'Se requiere una clave de 64 bits y IV para este proveedor.
        'Establecer la clave secreta para el algoritmo DES.
        DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
        'Establecer el vector de inicialización.
        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    
        'crear la secuencia de archivos para volver a leer el archivo cifrado
        Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
        'crear descriptor DES a partir de nuestra instancia de DES
        Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
        'crear conjunto de secuencias de cifrado para leer y realizar 
        'una transformación de descifrado DES en los bytes entrantes
        Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
        'imprimir el contenido de archivo descifrado
        Dim fsDecrypted As New StreamWriter(sOutputFilename)
        fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
        fsDecrypted.Flush()
        fsDecrypted.Close()
    End Sub
  12. Agregue líneas al procedimiento Main() para llamar tanto a EncryptFile como a DecryptFile.
    Public Sub Main()
        EncryptFile("c:\temp\test.txt", _
                        "c:\temp\Encrypted.txt", _
                        sSecretKey)
        DecryptFile("c:\temp\Encrypted.txt", _
                    "c:\temp\Decrypted.txt", _
                    sSecretKey)
    End Sub
  13. Guarde y ejecute la aplicación, y asegúrese de que la ruta utilizada para el nombre de archivo de entrada señala a un archivo existente (y que no sea excesivamente importante).

Comprobar que funciona

Pruebe este código con un archivo de texto (.txt) para confirmar que realmente cifró y descifró el archivo correctamente. Asegúrese de que descifra el archivo en un archivo nuevo (como en el procedimiento Sub Main() de este artículo) en lugar de en el archivo original. Examine el archivo descifrado y compárelo con el original.

Lista completa de código

Imports System
Imports System.IO
Imports System.Security
Imports System.Security.Cryptography
Imports System.Text


Module Module1
    'Debe ser 64 bits, 8 bytes.
    Private Const sSecretKey As String = "Password"

    Public Sub Main()
        EncryptFile("c:\temp\test.txt", _
                        "c:\temp\Encrypted.txt", _
                        sSecretKey)
        DecryptFile("c:\temp\Encrypted.txt", _
                    "c:\temp\Decrypted.txt", _
                    sSecretKey)
    End Sub

    Sub EncryptFile(ByVal sInputFilename As String, _
                   ByVal sOutputFilename As String, _
                   ByVal sKey As String)

        Dim fsInput As New FileStream(sInputFilename, _
                                    FileMode.Open, FileAccess.Read)
        Dim fsEncrypted As New FileStream(sOutputFilename, _
                                    FileMode.Create, FileAccess.Write)

        Dim DES As New DESCryptoServiceProvider()

        'Establecer la clave secreta para el algoritmo DES.
        'Se necesita una clave de 64 bits y IV para este proveedor
        DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)

        'Establecer el vector de inicialización.
        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

        'crear cifrado DES a partir de esta instancia
        Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
        'Crear una secuencia de cifrado que transforma la secuencia
	'de archivos mediante cifrado DES
        Dim cryptostream As New CryptoStream(fsEncrypted, _
                                            desencrypt, _
                                            CryptoStreamMode.Write)

        'Leer el texto del archivo en la matriz de bytes
        Dim bytearrayinput(fsInput.Length - 1) As Byte
        fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
        'Escribir el archivo cifrado con DES
        cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
        cryptostream.Close()
    End Sub

    Sub DecryptFile(ByVal sInputFilename As String, _
        ByVal sOutputFilename As String, _
        ByVal sKey As String)

        Dim DES As New DESCryptoServiceProvider()
        'Se requiere una clave de 64 bits y IV para este proveedor.
        'Establecer la clave secreta para el algoritmo DES.
        DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
        'Establecer el vector de inicialización.
        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

        'crear la secuencia de archivos para volver a leer el archivo cifrado
        Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
        'crear descriptor DES a partir de nuestra instancia de DES
        Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
	'crear conjunto de secuencias de cifrado para leer y realizar 
	'una transformación de descifrado DES en los bytes entrantes
        Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
        'imprimir el contenido de archivo descifrado
        Dim fsDecrypted As New StreamWriter(sOutputFilename)
        fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
        fsDecrypted.Flush()
        fsDecrypted.Close()
    End Sub

End Module

REFERENCIAS

Para obtener más información acerca de cómo utilizar las características de cifrado de .NET y la criptografía en general, consulte los siguientes sitios Web:

Propiedades

Id. de artículo: 301070 - Última revisión: martes, 15 de enero de 2002 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palabras clave: 
kbhowto kbhowtomaster KB301070

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com