Compartir a través de


CryptoStream Clase

Definición

Define una secuencia que vincula flujos de datos a transformaciones criptográficas.

public ref class CryptoStream : System::IO::Stream
public class CryptoStream : System.IO.Stream
[System.Runtime.InteropServices.ComVisible(true)]
public class CryptoStream : System.IO.Stream
type CryptoStream = class
    inherit Stream
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type CryptoStream = class
    inherit Stream
    interface IDisposable
Public Class CryptoStream
Inherits Stream
Herencia
CryptoStream
Herencia
Atributos
Implementaciones

Ejemplos

En el ejemplo siguiente se muestra cómo usar un CryptoStream para cifrar una cadena. Este método usa la clase Aes con el vector de inicialización y Key especificados (IV).

using System;
using System.IO;
using System.Security.Cryptography;

class AesExample
{
    public static void Main()
    {
        try
        {
            string original = "Here is some data to encrypt!";

            // Create a new instance of the Aes class.
            // This generates a new key and initialization vector (IV).
            using (Aes myAes = Aes.Create())
            {
                // Encrypt the string to an array of bytes.
                byte[] encrypted = EncryptStringToBytes(original, myAes.Key, myAes.IV);

                // Decrypt the bytes to a string.
                string roundtrip = DecryptStringFromBytes(encrypted, myAes.Key, myAes.IV);

                // Display the original data and the decrypted data.
                Console.WriteLine("Original:   {0}", original);
                Console.WriteLine("Round trip: {0}", roundtrip);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: {0}", e.Message);
        }
    }

    static byte[] EncryptStringToBytes(string plainText, byte[] Key, byte[] IV)
    {
        // Check arguments.
        if (plainText == null || plainText.Length <= 0)
            throw new ArgumentNullException(nameof(plainText));
        if (Key == null || Key.Length <= 0)
            throw new ArgumentNullException(nameof(Key));
        if (IV == null || IV.Length <= 0)
            throw new ArgumentNullException(nameof(IV));
        byte[] encrypted;

        // Create a Aes object with the specified key and IV.
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;

            // Create an encryptor to perform the stream transform.
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            // Create the streams used for encryption.
            using (MemoryStream msEncrypt = new())
            {
                using (CryptoStream csEncrypt = new(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new(csEncrypt))
                    {
                        // Write all data to the stream.
                        swEncrypt.Write(plainText);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
        }

        // Return the encrypted bytes from the memory stream.
        return encrypted;
    }

    static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
    {
        // Check arguments.
        if (cipherText == null || cipherText.Length <= 0)
            throw new ArgumentNullException(nameof(cipherText));
        if (Key == null || Key.Length <= 0)
            throw new ArgumentNullException(nameof(Key));
        if (IV == null || IV.Length <= 0)
            throw new ArgumentNullException(nameof(IV));

        // Declare the string used to hold the decrypted text.
        string plaintext = null;

        // Create a Aes object with the specified key and IV.
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;

            // Create a decryptor to perform the stream transform.
            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            // Create the streams used for decryption.
            using (MemoryStream msDecrypt = new(cipherText))
            {
                using (CryptoStream csDecrypt = new(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new(csDecrypt))
                    {

                        // Read the decrypted bytes from the decrypting stream
                        // and place them in a string.
                        plaintext = srDecrypt.ReadToEnd();
                    }
                }
            }
        }

        return plaintext;
    }
}
Imports System.IO
Imports System.Security.Cryptography

Class AesExample

    Public Shared Sub Main()
        Try
            Dim original As String = "Here is some data to encrypt!"

            ' Create a new instance of the Aes class.
            ' This generates a new key and initialization vector (IV).
            Using myAes = Aes.Create()

                ' Encrypt the string to an array of bytes.
                Dim encrypted As Byte() = EncryptStringToBytes(original, myAes.Key, myAes.IV)

                ' Decrypt the bytes to a string.
                Dim roundtrip As String = DecryptStringFromBytes(encrypted, myAes.Key, myAes.IV)

                'Display the original data and the decrypted data.
                Console.WriteLine("Original:   {0}", original)
                Console.WriteLine("Round Trip: {0}", roundtrip)
            End Using
        Catch e As Exception
            Console.WriteLine("Error: {0}", e.Message)
        End Try
    End Sub

    Shared Function EncryptStringToBytes(ByVal plainText As String, ByVal Key() As Byte, ByVal IV() As Byte) As Byte()
        ' Check arguments.
        If plainText Is Nothing OrElse plainText.Length <= 0 Then
            Throw New ArgumentNullException(NameOf(plainText))
        End If
        If Key Is Nothing OrElse Key.Length <= 0 Then
            Throw New ArgumentNullException(NameOf(Key))
        End If
        If IV Is Nothing OrElse IV.Length <= 0 Then
            Throw New ArgumentNullException(NameOf(IV))
        End If
        Dim encrypted() As Byte

        ' Create an Aes object with the specified key and IV.
        Using aesAlg = Aes.Create()

            aesAlg.Key = Key
            aesAlg.IV = IV

            ' Create an encryptor to perform the stream transform.
            Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)
            ' Create the streams used for encryption.
            Using msEncrypt As New MemoryStream()
                Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
                    Using swEncrypt As New StreamWriter(csEncrypt)

                        ' Write all data to the stream.
                        swEncrypt.Write(plainText)
                    End Using
                    encrypted = msEncrypt.ToArray()
                End Using
            End Using
        End Using

        ' Return the encrypted bytes from the memory stream.
        Return encrypted

    End Function 'EncryptStringToBytes

    Shared Function DecryptStringFromBytes(
        ByVal cipherText() As Byte,
        ByVal Key() As Byte,
        ByVal IV() As Byte) As String
        ' Check arguments.
        If cipherText Is Nothing OrElse cipherText.Length <= 0 Then
            Throw New ArgumentNullException(NameOf(cipherText))
        End If
        If Key Is Nothing OrElse Key.Length <= 0 Then
            Throw New ArgumentNullException(NameOf(Key))
        End If
        If IV Is Nothing OrElse IV.Length <= 0 Then
            Throw New ArgumentNullException(NameOf(IV))
        End If

        ' Declare the string used to hold the decrypted text.
        Dim plaintext As String = Nothing

        ' Create an Aes object with the specified key and IV.
        Using aesAlg = Aes.Create()
            aesAlg.Key = Key
            aesAlg.IV = IV

            ' Create a decryptor to perform the stream transform.
            Dim decryptor As ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV)

            ' Create the streams used for decryption.
            Using msDecrypt As New MemoryStream(cipherText)
                Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)
                    Using srDecrypt As New StreamReader(csDecrypt)
                        ' Read the decrypted bytes from the decrypting stream
                        ' and place them in a string.
                        plaintext = srDecrypt.ReadToEnd()
                    End Using
                End Using
            End Using
        End Using

        Return plaintext

    End Function 'DecryptStringFromBytes 
End Class

Comentarios

Common Language Runtime usa un diseño orientado a secuencias para la criptografía. El núcleo de este diseño es CryptoStream. Los objetos criptográficos que implementan CryptoStream se pueden encadenar junto con cualquier objeto que implemente Stream, por lo que la salida transmitida de un objeto se puede introducir en la entrada de otro objeto. El resultado intermedio (la salida del primer objeto) no tiene que almacenarse por separado.

Importante

En .NET 6 y versiones posteriores, cuando se llama a Stream.Read o Stream.ReadAsync con un búfer de longitud N, la operación se completa cuando se han leído al menos 1 byte de la secuencia o la secuencia subyacente que encapsula devuelve 0 de una llamada a Read, lo que indica que no hay más datos disponibles. Antes de .NET 6, Stream.Read y Stream.ReadAsync no devolvieron hasta que todos los bytes N se habían leído de la secuencia o la secuencia subyacente devolvió 0 de una llamada a Read. Si el código supone que los métodos Read no devolverán hasta que se hayan leído todos los bytes de N, podría no leer todo el contenido. Para obtener más información, consulte lecturas parciales y de bytes cero en secuencias.

Siempre debe cerrar explícitamente el objeto CryptoStream una vez que haya terminado de usarlo llamando al método Clear. Si lo hace, vacía la secuencia subyacente y hace que el objeto CryptoStream procese todos los bloques de datos restantes. Sin embargo, si se produce una excepción antes de llamar al método Close, es posible que el objeto CryptoStream no se cierre. Para asegurarse de que siempre se llama al método Close, coloque la llamada al método Clear dentro del bloque finally de una instrucción try/catch.

Este tipo implementa la interfaz IDisposable. Cuando haya terminado de usar el tipo, debe eliminarlo directa o indirectamente llamando a su método Clear, que a su vez llama a su implementación de IDisposable. Para eliminar el tipo directamente, llame a su método Clear en un bloque try/catch. Para eliminarlo indirectamente, use una construcción de lenguaje como using (en C#) o Using (en Visual Basic).

Constructores

CryptoStream(Stream, ICryptoTransform, CryptoStreamMode)

Inicializa una nueva instancia de la clase CryptoStream con un flujo de datos de destino, la transformación que se va a usar y el modo de la secuencia.

CryptoStream(Stream, ICryptoTransform, CryptoStreamMode, Boolean)

Inicializa una nueva instancia de la clase CryptoStream.

Propiedades

CanRead

Obtiene un valor que indica si el CryptoStream actual es legible.

CanSeek

Obtiene un valor que indica si puede buscar dentro del CryptoStreamactual.

CanTimeout

Obtiene un valor que determina si la secuencia actual puede agotar el tiempo de espera.

(Heredado de Stream)
CanWrite

Obtiene un valor que indica si el CryptoStream actual se puede escribir.

HasFlushedFinalBlock

Obtiene un valor que indica si el bloque de búfer final se ha escrito en la secuencia subyacente.

Length

Obtiene la longitud en bytes de la secuencia.

Position

Obtiene o establece la posición dentro de la secuencia actual.

ReadTimeout

Obtiene o establece un valor, en milisegundos, que determina cuánto tiempo intentará leer la secuencia antes de que se agote el tiempo de espera.

(Heredado de Stream)
WriteTimeout

Obtiene o establece un valor, en milisegundos, que determina cuánto tiempo intentará escribir la secuencia antes de que se agote el tiempo de espera.

(Heredado de Stream)

Métodos

BeginRead(Byte[], Int32, Int32, AsyncCallback, Object)

Inicia una operación de lectura asincrónica. (Considere la posibilidad de usar ReadAsync en su lugar).

BeginRead(Byte[], Int32, Int32, AsyncCallback, Object)

Inicia una operación de lectura asincrónica. (Considere la posibilidad de usar ReadAsync(Byte[], Int32, Int32) en su lugar).

(Heredado de Stream)
BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object)

Comienza una operación de escritura asincrónica. (Considere la posibilidad de usar WriteAsync en su lugar).

BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object)

Comienza una operación de escritura asincrónica. (Considere la posibilidad de usar WriteAsync(Byte[], Int32, Int32) en su lugar).

(Heredado de Stream)
Clear()

Libera todos los recursos usados por el CryptoStream.

Close()

Cierra la secuencia actual y libera los recursos (como sockets y identificadores de archivo) asociados a la secuencia actual.

Close()

Cierra la secuencia actual y libera los recursos (como sockets y identificadores de archivo) asociados a la secuencia actual. En lugar de llamar a este método, asegúrese de que la secuencia se elimina correctamente.

(Heredado de Stream)
CopyTo(Stream)

Lee los bytes de la secuencia actual y los escribe en otra secuencia. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

(Heredado de Stream)
CopyTo(Stream, Int32)

Lee los bytes de la secuencia subyacente, aplica las transformaciones criptográficas pertinentes y escribe el resultado en la secuencia de destino.

CopyTo(Stream, Int32)

Lee los bytes de la secuencia actual y los escribe en otra secuencia mediante un tamaño de búfer especificado. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

(Heredado de Stream)
CopyToAsync(Stream)

Lee asincrónicamente los bytes de la secuencia actual y los escribe en otra secuencia. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

(Heredado de Stream)
CopyToAsync(Stream, CancellationToken)

Lee asincrónicamente los bytes de la secuencia actual y los escribe en otra secuencia, mediante un token de cancelación especificado. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

(Heredado de Stream)
CopyToAsync(Stream, Int32)

Lee de forma asincrónica los bytes de la secuencia actual y los escribe en otra secuencia mediante un tamaño de búfer especificado. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

(Heredado de Stream)
CopyToAsync(Stream, Int32, CancellationToken)

Lee asincrónicamente los bytes de la secuencia subyacente, aplica las transformaciones criptográficas pertinentes y escribe el resultado en la secuencia de destino.

CopyToAsync(Stream, Int32, CancellationToken)

Lee asincrónicamente los bytes de la secuencia actual y los escribe en otra secuencia, mediante un tamaño de búfer y un token de cancelación especificados. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

(Heredado de Stream)
CreateObjRef(Type)

Crea un objeto que contiene toda la información pertinente necesaria para generar un proxy usado para comunicarse con un objeto remoto.

(Heredado de MarshalByRefObject)
CreateWaitHandle()
Obsoletos.
Obsoletos.
Obsoletos.

Asigna un objeto WaitHandle.

(Heredado de Stream)
Dispose()

Libera todos los recursos usados por el Stream.

(Heredado de Stream)
Dispose(Boolean)

Libera los recursos no administrados usados por el CryptoStream y, opcionalmente, libera los recursos administrados.

DisposeAsync()

Libera asincrónicamente los recursos no administrados usados por el CryptoStream.

DisposeAsync()

Libera asincrónicamente los recursos no administrados usados por el Stream.

(Heredado de Stream)
EndRead(IAsyncResult)

Espera a que se complete la lectura asincrónica pendiente. (Considere la posibilidad de usar ReadAsync en su lugar).

EndRead(IAsyncResult)

Espera a que se complete la lectura asincrónica pendiente. (Considere la posibilidad de usar ReadAsync(Byte[], Int32, Int32) en su lugar).

(Heredado de Stream)
EndWrite(IAsyncResult)

Finaliza una operación de escritura asincrónica. (Considere la posibilidad de usar WriteAsync en su lugar).

EndWrite(IAsyncResult)

Finaliza una operación de escritura asincrónica. (Considere la posibilidad de usar WriteAsync(Byte[], Int32, Int32) en su lugar).

(Heredado de Stream)
Equals(Object)

Determina si el objeto especificado es igual al objeto actual.

(Heredado de Object)
Finalize()

Permite a un objeto intentar liberar recursos y realizar otras operaciones de limpieza antes de que la recolección de elementos no utilizados la recupere.

Flush()

Borra todos los búferes de la secuencia actual y hace que los datos almacenados en búfer se escriban en el dispositivo subyacente.

FlushAsync()

Borra de forma asincrónica todos los búferes de esta secuencia y hace que los datos almacenados en búfer se escriban en el dispositivo subyacente.

(Heredado de Stream)
FlushAsync(CancellationToken)

Borra todos los búferes de la secuencia actual de forma asincrónica, hace que los datos almacenados en búfer se escriban en el dispositivo subyacente y supervisa las solicitudes de cancelación.

FlushAsync(CancellationToken)

Borra de forma asincrónica todos los búferes de esta secuencia, hace que los datos almacenados en búfer se escriban en el dispositivo subyacente y supervisa las solicitudes de cancelación.

(Heredado de Stream)
FlushFinalBlock()

Actualiza el origen de datos o el repositorio subyacentes con el estado actual del búfer y, a continuación, borra el búfer.

FlushFinalBlockAsync(CancellationToken)

Actualiza de forma asincrónica el origen de datos o el repositorio subyacentes con el estado actual del búfer y, a continuación, borra el búfer.

GetHashCode()

Actúa como función hash predeterminada.

(Heredado de Object)
GetLifetimeService()
Obsoletos.

Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia.

(Heredado de MarshalByRefObject)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
InitializeLifetimeService()
Obsoletos.

Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia.

(Heredado de MarshalByRefObject)
MemberwiseClone()

Crea una copia superficial del Objectactual.

(Heredado de Object)
MemberwiseClone(Boolean)

Crea una copia superficial del objeto MarshalByRefObject actual.

(Heredado de MarshalByRefObject)
ObjectInvariant()
Obsoletos.

Proporciona compatibilidad con un Contract.

(Heredado de Stream)
Read(Byte[], Int32, Int32)

Lee una secuencia de bytes de la secuencia actual y avanza la posición dentro de la secuencia por el número de bytes leídos.

Read(Span<Byte>)

Cuando se reemplaza en una clase derivada, lee una secuencia de bytes de la secuencia actual y avanza la posición dentro de la secuencia por el número de bytes leídos.

(Heredado de Stream)
ReadAsync(Byte[], Int32, Int32)

Lee de forma asincrónica una secuencia de bytes de la secuencia actual y avanza la posición dentro de la secuencia por el número de bytes leídos.

(Heredado de Stream)
ReadAsync(Byte[], Int32, Int32, CancellationToken)

Lee una secuencia de bytes de la secuencia actual de forma asincrónica, avanza la posición dentro de la secuencia por el número de bytes leídos y supervisa las solicitudes de cancelación.

ReadAsync(Byte[], Int32, Int32, CancellationToken)

Lee de forma asincrónica una secuencia de bytes de la secuencia actual, avanza la posición dentro de la secuencia por el número de bytes leídos y supervisa las solicitudes de cancelación.

(Heredado de Stream)
ReadAsync(Memory<Byte>, CancellationToken)

Lee de forma asincrónica una secuencia de bytes de la secuencia actual, avanza la posición dentro de la secuencia por el número de bytes leídos y supervisa las solicitudes de cancelación.

ReadAsync(Memory<Byte>, CancellationToken)

Lee de forma asincrónica una secuencia de bytes de la secuencia actual, avanza la posición dentro de la secuencia por el número de bytes leídos y supervisa las solicitudes de cancelación.

(Heredado de Stream)
ReadAtLeast(Span<Byte>, Int32, Boolean)

Lee al menos un número mínimo de bytes de la secuencia actual y avanza la posición dentro de la secuencia por el número de bytes leídos.

(Heredado de Stream)
ReadAtLeastAsync(Memory<Byte>, Int32, Boolean, CancellationToken)

Lee de forma asincrónica al menos un número mínimo de bytes de la secuencia actual, avanza la posición dentro de la secuencia por el número de bytes leídos y supervisa las solicitudes de cancelación.

(Heredado de Stream)
ReadByte()

Lee un byte de la secuencia y avanza la posición dentro de la secuencia por un byte, o devuelve -1 si está al final de la secuencia.

ReadByte()

Lee un byte de la secuencia y avanza la posición dentro de la secuencia por un byte, o devuelve -1 si está al final de la secuencia.

(Heredado de Stream)
ReadExactly(Byte[], Int32, Int32)

Lee count número de bytes de la secuencia actual y avanza la posición dentro de la secuencia.

(Heredado de Stream)
ReadExactly(Span<Byte>)

Lee bytes de la secuencia actual y avanza la posición dentro de la secuencia hasta que se rellena el buffer.

(Heredado de Stream)
ReadExactlyAsync(Byte[], Int32, Int32, CancellationToken)

Lee de forma asincrónica count número de bytes de la secuencia actual, avanza la posición dentro de la secuencia y supervisa las solicitudes de cancelación.

(Heredado de Stream)
ReadExactlyAsync(Memory<Byte>, CancellationToken)

Lee de forma asincrónica bytes de la secuencia actual, avanza la posición dentro de la secuencia hasta que se rellena el buffer y supervisa las solicitudes de cancelación.

(Heredado de Stream)
Seek(Int64, SeekOrigin)

Establece la posición dentro de la secuencia actual.

SetLength(Int64)

Establece la longitud de la secuencia actual.

ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)
Write(Byte[], Int32, Int32)

Escribe una secuencia de bytes en el CryptoStream actual y avanza la posición actual dentro de la secuencia por el número de bytes escritos.

Write(ReadOnlySpan<Byte>)

Cuando se reemplaza en una clase derivada, escribe una secuencia de bytes en la secuencia actual y avanza la posición actual dentro de esta secuencia por el número de bytes escritos.

(Heredado de Stream)
WriteAsync(Byte[], Int32, Int32)

Escribe de forma asincrónica una secuencia de bytes en la secuencia actual y avanza la posición actual dentro de esta secuencia por el número de bytes escritos.

(Heredado de Stream)
WriteAsync(Byte[], Int32, Int32, CancellationToken)

Escribe una secuencia de bytes en la secuencia actual de forma asincrónica, avanza la posición actual dentro de la secuencia por el número de bytes escritos y supervisa las solicitudes de cancelación.

WriteAsync(Byte[], Int32, Int32, CancellationToken)

Escribe de forma asincrónica una secuencia de bytes en la secuencia actual, avanza la posición actual dentro de esta secuencia por el número de bytes escritos y supervisa las solicitudes de cancelación.

(Heredado de Stream)
WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

Escribe de forma asincrónica una secuencia de bytes en la secuencia actual, avanza la posición actual dentro de esta secuencia por el número de bytes escritos y supervisa las solicitudes de cancelación.

WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

Escribe de forma asincrónica una secuencia de bytes en la secuencia actual, avanza la posición actual dentro de esta secuencia por el número de bytes escritos y supervisa las solicitudes de cancelación.

(Heredado de Stream)
WriteByte(Byte)

Escribe un byte en la posición actual de la secuencia y avanza la posición dentro de la secuencia por un byte.

WriteByte(Byte)

Escribe un byte en la posición actual de la secuencia y avanza la posición dentro de la secuencia por un byte.

(Heredado de Stream)

Implementaciones de interfaz explícitas

IDisposable.Dispose()

Esta API admite la infraestructura de producto y no está pensada para usarse directamente en el código.

Libera los recursos usados por la instancia actual de la clase CryptoStream.

Métodos de extensión

CopyToAsync(Stream, PipeWriter, CancellationToken)

Lee asincrónicamente los bytes de la Stream y los escribe en el PipeWriterespecificado mediante un token de cancelación.

ConfigureAwait(IAsyncDisposable, Boolean)

Configura cómo se realizarán las esperas en las tareas devueltas desde un descartable asincrónico.

Se aplica a

Consulte también