Estás trabajando sin conexión, espera a que vuelva la conexión a Internet

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

Este artículo se publicó anteriormente con el número E301070
Para ver una versión de Microsoft Visual C# .NET de este artículo, consulte 307010.

En esta tarea

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.

Volver al principio

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
Volver al principio

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 SystemImports System.IOImports System.SecurityImports System.Security.CryptographyImports 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 BytefsInput.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).
Volver al principio

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.

Volver al principio

Lista completa de código

Imports SystemImports System.IOImports System.SecurityImports System.Security.CryptographyImports System.TextModule 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 SubEnd Module
Volver al principio

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:Volver al principio
Propiedades

Id. de artículo: 301070 - Última revisión: 01/15/2002 10:11:00 - Revisión: 1.0

  • Microsoft Visual Basic .NET 2002 Standard Edition
  • kbhowto kbhowtomaster KB301070
Comentarios
src="https://c.microsoft.com/ms.js" '="">