CryptoStream Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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
- Herencia
- Atributos
- Implementaciones
Ejemplos
En el ejemplo siguiente se muestra cómo usar para CryptoStream cifrar una cadena. Este método usa la Aes clase con el vector de inicialización y especificado Key (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. Cualquier objeto criptográfico que implemente CryptoStream se puede 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 Stream.Read se llama a 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. En .NET Framework Stream.Read y Stream.ReadAsync no se devuelven hasta que se hayan leído todos los N bytes de la secuencia o la secuencia subyacente devuelve 0 de una llamada a Read. Si el código supone que los Read métodos no devolverán hasta que se hayan leído todos los N bytes, podría no leer todo el contenido. Para obtener más información, consulte Lecturas parciales y de cero bytes en secuencias.
Siempre debe cerrar explícitamente el CryptoStream objeto una vez que haya terminado de usarlo llamando al Clear método . Si lo hace, vacía la secuencia subyacente y hace que el CryptoStream objeto procese todos los bloques de datos restantes. Sin embargo, si se produce una excepción antes de llamar al Close método , es posible que el CryptoStream objeto no se cierre. Para asegurarse de que siempre se llama al método , coloque la Close llamada al método dentro del finallyClear bloque de una try/catch instrucción .
Este tipo implementa la IDisposable interfaz . Cuando haya terminado de usar el tipo, debe eliminarlo directamente o indirectamente mediante una llamada a su Clear método, que a su vez llama a su IDisposable implementación. 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
| Nombre | Description |
|---|---|
| CryptoStream(Stream, ICryptoTransform, CryptoStreamMode, Boolean) |
Inicializa una nueva instancia de la clase CryptoStream. |
| CryptoStream(Stream, ICryptoTransform, CryptoStreamMode) |
Inicializa una nueva instancia de la CryptoStream clase con un flujo de datos de destino, la transformación que se va a usar y el modo de la secuencia. |
Propiedades
| Nombre | Description |
|---|---|
| CanRead |
Obtiene un valor que indica si el objeto actual CryptoStream es legible. |
| CanSeek |
Obtiene un valor que indica si puede buscar dentro del objeto actual CryptoStream. |
| 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 objeto actual CryptoStream 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
| Nombre | Description |
|---|---|
| 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 .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, 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) |
| 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) |
| 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, 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) |
| 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) |
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) |
| 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 WaitHandle objeto . (Heredado de Stream) |
| Dispose() |
Libera todos los recursos usados por .Stream (Heredado de Stream) |
| Dispose(Boolean) |
Libera los recursos no administrados utilizados por CryptoStream y, opcionalmente, libera los recursos administrados. |
| DisposeAsync() |
Libera de forma asincrónica los recursos no administrados usados por .CryptoStream |
| 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. |
| 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 actual MarshalByRefObject . (Heredado de MarshalByRefObject) |
| ObjectInvariant() |
Obsoletos.
Proporciona compatibilidad con .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, 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) |
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(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) |
|
| ReadExactly(Span<Byte>) |
Lee bytes de la secuencia actual y avanza la posición dentro de la secuencia hasta |
| ReadExactlyAsync(Byte[], Int32, Int32, CancellationToken) |
Lee |
| ReadExactlyAsync(Memory<Byte>, CancellationToken) |
Lee de forma asincrónica los bytes de la secuencia actual, avanza la posición dentro de la secuencia hasta |
| 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 actual CryptoStream 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, 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) |
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(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
| Nombre | Description |
|---|---|
| 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 CryptoStream clase . |
Métodos de extensión
| Nombre | Description |
|---|---|
| ConfigureAwait(IAsyncDisposable, Boolean) |
Configura cómo se realizarán las esperas en las tareas devueltas desde un descartable asincrónico. |
| CopyToAsync(Stream, PipeWriter, CancellationToken) |
Lee asincrónicamente los bytes de Stream y los escribe en el especificado PipeWritermediante un token de cancelación. |