CryptoStream Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Define um fluxo que vincula fluxos de dados a transformações 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
- Herança
- Herança
- Atributos
- Implementações
Exemplos
O exemplo a seguir demonstra como usar um CryptoStream para criptografar uma cadeia de caracteres. Esse método usa a classe Aes com o Key e o vetor de inicialização 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
Comentários
O common language runtime usa um design orientado a fluxo para criptografia. O núcleo desse design é CryptoStream. Todos os objetos criptográficos que implementam CryptoStream podem ser encadeados com qualquer objeto que implemente Stream, de modo que a saída transmitida de um objeto possa ser alimentada na entrada de outro objeto. O resultado intermediário (a saída do primeiro objeto) não precisa ser armazenado separadamente.
Importante
No .NET 6 e versões posteriores, quando Stream.Read
ou Stream.ReadAsync
é chamado com um buffer de comprimento N
, a operação é concluída quando pelo menos 1 byte foi lido do fluxo ou o fluxo subjacente que ele encapsula retorna 0 de uma chamada para Read
, indicando que não há mais dados disponíveis. Antes do .NET 6, Stream.Read
e Stream.ReadAsync
não retornavam até que todos os N
bytes tivessem sido lidos do fluxo ou o fluxo subjacente retornasse 0 de uma chamada para Read
. Se o código pressupõe que os métodos Read
não retornarão até que todos os N
bytes tenham sido lidos, ele poderá falhar ao ler todo o conteúdo. Para obter mais informações, consulte leituras parciais e de bytes zero em fluxos.
Você sempre deve fechar explicitamente seu objeto CryptoStream depois de terminar de usá-lo chamando o método Clear. Isso libera o fluxo subjacente e faz com que todos os blocos de dados restantes sejam processados pelo objeto CryptoStream. No entanto, se ocorrer uma exceção antes de você chamar o método Close, o objeto CryptoStream poderá não ser fechado. Para garantir que o método Close sempre seja chamado, coloque sua chamada para o método Clear dentro do bloco finally
de uma instrução try
/catch
.
Esse tipo implementa a interface IDisposable. Quando terminar de usar o tipo, você deverá descartá-lo direta ou indiretamente chamando seu método Clear, que, por sua vez, chama sua implementação de IDisposable. Para descartar o tipo diretamente, chame seu método Clear em um bloco de try
/catch
. Para descartá-lo indiretamente, use um constructo de linguagem como using
(em C#) ou Using
(no Visual Basic).
Construtores
CryptoStream(Stream, ICryptoTransform, CryptoStreamMode) |
Inicializa uma nova instância da classe CryptoStream com um fluxo de dados de destino, a transformação a ser usada e o modo do fluxo. |
CryptoStream(Stream, ICryptoTransform, CryptoStreamMode, Boolean) |
Inicializa uma nova instância da classe CryptoStream. |
Propriedades
CanRead |
Obtém um valor que indica se o CryptoStream atual é legível. |
CanSeek |
Obtém um valor que indica se você pode procurar dentro do CryptoStreamatual. |
CanTimeout |
Obtém um valor que determina se o fluxo atual pode acabar. (Herdado de Stream) |
CanWrite |
Obtém um valor que indica se o CryptoStream atual é gravável. |
HasFlushedFinalBlock |
Obtém um valor que indica se o bloco de buffer final foi gravado no fluxo subjacente. |
Length |
Obtém o comprimento em bytes do fluxo. |
Position |
Obtém ou define a posição dentro do fluxo atual. |
ReadTimeout |
Obtém ou define um valor, em milissegundos, que determina quanto tempo o fluxo tentará ler antes do tempo limite. (Herdado de Stream) |
WriteTimeout |
Obtém ou define um valor, em milissegundos, que determina por quanto tempo o fluxo tentará gravar antes do tempo limite. (Herdado de Stream) |
Métodos
BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) |
Inicia uma operação de leitura assíncrona. (Considere usar ReadAsync em vez disso.) |
BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) |
Inicia uma operação de leitura assíncrona. (Considere usar ReadAsync(Byte[], Int32, Int32) em vez disso.) (Herdado de Stream) |
BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) |
Inicia uma operação de gravação assíncrona. (Considere usar WriteAsync em vez disso.) |
BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) |
Inicia uma operação de gravação assíncrona. (Considere usar WriteAsync(Byte[], Int32, Int32) em vez disso.) (Herdado de Stream) |
Clear() |
Libera todos os recursos usados pelo CryptoStream. |
Close() |
Fecha o fluxo atual e libera todos os recursos (como soquetes e identificadores de arquivo) associados ao fluxo atual. |
Close() |
Fecha o fluxo atual e libera todos os recursos (como soquetes e identificadores de arquivo) associados ao fluxo atual. Em vez de chamar esse método, verifique se o fluxo foi descartado corretamente. (Herdado de Stream) |
CopyTo(Stream) |
Lê os bytes do fluxo atual e os grava em outro fluxo. Ambas as posições de fluxos são avançadas pelo número de bytes copiados. (Herdado de Stream) |
CopyTo(Stream, Int32) |
Lê os bytes do fluxo subjacente, aplica as transformações criptográficas relevantes e grava o resultado no fluxo de destino. |
CopyTo(Stream, Int32) |
Lê os bytes do fluxo atual e os grava em outro fluxo, usando um tamanho de buffer especificado. Ambas as posições de fluxos são avançadas pelo número de bytes copiados. (Herdado de Stream) |
CopyToAsync(Stream) |
Lê assíncronamente os bytes do fluxo atual e os grava em outro fluxo. Ambas as posições de fluxos são avançadas pelo número de bytes copiados. (Herdado de Stream) |
CopyToAsync(Stream, CancellationToken) |
Lê assíncronamente os bytes do fluxo atual e os grava em outro fluxo, usando um token de cancelamento especificado. Ambas as posições de fluxos são avançadas pelo número de bytes copiados. (Herdado de Stream) |
CopyToAsync(Stream, Int32) |
Lê de forma assíncrona os bytes do fluxo atual e os grava em outro fluxo, usando um tamanho de buffer especificado. Ambas as posições de fluxos são avançadas pelo número de bytes copiados. (Herdado de Stream) |
CopyToAsync(Stream, Int32, CancellationToken) |
Lê assíncronamente os bytes do fluxo subjacente, aplica as transformações criptográficas relevantes e grava o resultado no fluxo de destino. |
CopyToAsync(Stream, Int32, CancellationToken) |
Lê assíncronamente os bytes do fluxo atual e os grava em outro fluxo, usando um token de cancelamento e tamanho de buffer especificado. Ambas as posições de fluxos são avançadas pelo número de bytes copiados. (Herdado de Stream) |
CreateObjRef(Type) |
Cria um objeto que contém todas as informações relevantes necessárias para gerar um proxy usado para se comunicar com um objeto remoto. (Herdado de MarshalByRefObject) |
CreateWaitHandle() |
Obsoleto.
Obsoleto.
Obsoleto.
Aloca um objeto WaitHandle. (Herdado de Stream) |
Dispose() |
Libera todos os recursos usados pelo Stream. (Herdado de Stream) |
Dispose(Boolean) |
Libera os recursos não gerenciados usados pelo CryptoStream e, opcionalmente, libera os recursos gerenciados. |
DisposeAsync() |
Libera de forma assíncrona os recursos não gerenciados usados pelo CryptoStream. |
DisposeAsync() |
Libera de forma assíncrona os recursos não gerenciados usados pelo Stream. (Herdado de Stream) |
EndRead(IAsyncResult) |
Aguarda a conclusão da leitura assíncrona pendente. (Considere usar ReadAsync em vez disso.) |
EndRead(IAsyncResult) |
Aguarda a conclusão da leitura assíncrona pendente. (Considere usar ReadAsync(Byte[], Int32, Int32) em vez disso.) (Herdado de Stream) |
EndWrite(IAsyncResult) |
Encerra uma operação de gravação assíncrona. (Considere usar WriteAsync em vez disso.) |
EndWrite(IAsyncResult) |
Encerra uma operação de gravação assíncrona. (Considere usar WriteAsync(Byte[], Int32, Int32) em vez disso.) (Herdado de Stream) |
Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
Finalize() |
Permite que um objeto tente liberar recursos e executar outras operações de limpeza antes de ser recuperado pela coleta de lixo. |
Flush() |
Limpa todos os buffers do fluxo atual e faz com que todos os dados em buffer sejam gravados no dispositivo subjacente. |
FlushAsync() |
Limpa de forma assíncrona todos os buffers para esse fluxo e faz com que todos os dados em buffer sejam gravados no dispositivo subjacente. (Herdado de Stream) |
FlushAsync(CancellationToken) |
Limpa todos os buffers do fluxo atual de forma assíncrona, faz com que todos os dados em buffer sejam gravados no dispositivo subjacente e monitora solicitações de cancelamento. |
FlushAsync(CancellationToken) |
Limpa de forma assíncrona todos os buffers para esse fluxo, faz com que todos os dados em buffer sejam gravados no dispositivo subjacente e monitora solicitações de cancelamento. (Herdado de Stream) |
FlushFinalBlock() |
Atualiza a fonte de dados ou o repositório subjacente com o estado atual do buffer e limpa o buffer. |
FlushFinalBlockAsync(CancellationToken) |
Atualiza de forma assíncrona a fonte de dados subjacente ou o repositório com o estado atual do buffer e limpa o buffer. |
GetHashCode() |
Serve como a função de hash padrão. (Herdado de Object) |
GetLifetimeService() |
Obsoleto.
Recupera o objeto de serviço de tempo de vida atual que controla a política de tempo de vida para essa instância. (Herdado de MarshalByRefObject) |
GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
InitializeLifetimeService() |
Obsoleto.
Obtém um objeto de serviço de tempo de vida para controlar a política de tempo de vida dessa instância. (Herdado de MarshalByRefObject) |
MemberwiseClone() |
Cria uma cópia superficial do Objectatual. (Herdado de Object) |
MemberwiseClone(Boolean) |
Cria uma cópia superficial do objeto MarshalByRefObject atual. (Herdado de MarshalByRefObject) |
ObjectInvariant() |
Obsoleto.
Fornece suporte para um Contract. (Herdado de Stream) |
Read(Byte[], Int32, Int32) |
Lê uma sequência de bytes do fluxo atual e avança a posição dentro do fluxo pelo número de bytes lidos. |
Read(Span<Byte>) |
Quando substituído em uma classe derivada, lê uma sequência de bytes do fluxo atual e avança a posição dentro do fluxo pelo número de bytes lidos. (Herdado de Stream) |
ReadAsync(Byte[], Int32, Int32) |
Lê de forma assíncrona uma sequência de bytes do fluxo atual e avança a posição dentro do fluxo pelo número de bytes lidos. (Herdado de Stream) |
ReadAsync(Byte[], Int32, Int32, CancellationToken) |
Lê uma sequência de bytes do fluxo atual de forma assíncrona, avança a posição dentro do fluxo pelo número de bytes lidos e monitora solicitações de cancelamento. |
ReadAsync(Byte[], Int32, Int32, CancellationToken) |
Lê de forma assíncrona uma sequência de bytes do fluxo atual, avança a posição dentro do fluxo pelo número de bytes lidos e monitora solicitações de cancelamento. (Herdado de Stream) |
ReadAsync(Memory<Byte>, CancellationToken) |
Lê de forma assíncrona uma sequência de bytes do fluxo atual, avança a posição dentro do fluxo pelo número de bytes lidos e monitora solicitações de cancelamento. |
ReadAsync(Memory<Byte>, CancellationToken) |
Lê de forma assíncrona uma sequência de bytes do fluxo atual, avança a posição dentro do fluxo pelo número de bytes lidos e monitora solicitações de cancelamento. (Herdado de Stream) |
ReadAtLeast(Span<Byte>, Int32, Boolean) |
Lê pelo menos um número mínimo de bytes do fluxo atual e avança a posição dentro do fluxo pelo número de bytes lidos. (Herdado de Stream) |
ReadAtLeastAsync(Memory<Byte>, Int32, Boolean, CancellationToken) |
Lê de forma assíncrona pelo menos um número mínimo de bytes do fluxo atual, avança a posição dentro do fluxo pelo número de bytes lidos e monitora solicitações de cancelamento. (Herdado de Stream) |
ReadByte() |
Lê um byte do fluxo e avança a posição dentro do fluxo por um byte ou retorna -1 se estiver no final do fluxo. |
ReadByte() |
Lê um byte do fluxo e avança a posição dentro do fluxo por um byte ou retorna -1 se estiver no final do fluxo. (Herdado de Stream) |
ReadExactly(Byte[], Int32, Int32) |
Lê |
ReadExactly(Span<Byte>) |
Lê bytes do fluxo atual e avança a posição dentro do fluxo até que a |
ReadExactlyAsync(Byte[], Int32, Int32, CancellationToken) |
Lê de forma assíncrona |
ReadExactlyAsync(Memory<Byte>, CancellationToken) |
Lê bytes de forma assíncrona do fluxo atual, avança a posição dentro do fluxo até que o |
Seek(Int64, SeekOrigin) |
Define a posição dentro do fluxo atual. |
SetLength(Int64) |
Define o comprimento do fluxo atual. |
ToString() |
Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object) |
Write(Byte[], Int32, Int32) |
Grava uma sequência de bytes no CryptoStream atual e avança a posição atual dentro do fluxo pelo número de bytes gravados. |
Write(ReadOnlySpan<Byte>) |
Quando substituído em uma classe derivada, grava uma sequência de bytes no fluxo atual e avança a posição atual dentro desse fluxo pelo número de bytes gravados. (Herdado de Stream) |
WriteAsync(Byte[], Int32, Int32) |
Grava de forma assíncrona uma sequência de bytes no fluxo atual e avança a posição atual dentro desse fluxo pelo número de bytes gravados. (Herdado de Stream) |
WriteAsync(Byte[], Int32, Int32, CancellationToken) |
Grava uma sequência de bytes no fluxo atual de forma assíncrona, avança a posição atual dentro do fluxo pelo número de bytes gravados e monitora solicitações de cancelamento. |
WriteAsync(Byte[], Int32, Int32, CancellationToken) |
Grava de forma assíncrona uma sequência de bytes no fluxo atual, avança a posição atual dentro desse fluxo pelo número de bytes gravados e monitora solicitações de cancelamento. (Herdado de Stream) |
WriteAsync(ReadOnlyMemory<Byte>, CancellationToken) |
Grava de forma assíncrona uma sequência de bytes no fluxo atual, avança a posição atual dentro desse fluxo pelo número de bytes gravados e monitora solicitações de cancelamento. |
WriteAsync(ReadOnlyMemory<Byte>, CancellationToken) |
Grava de forma assíncrona uma sequência de bytes no fluxo atual, avança a posição atual dentro desse fluxo pelo número de bytes gravados e monitora solicitações de cancelamento. (Herdado de Stream) |
WriteByte(Byte) |
Grava um byte na posição atual no fluxo e avança a posição dentro do fluxo por um byte. |
WriteByte(Byte) |
Grava um byte na posição atual no fluxo e avança a posição dentro do fluxo por um byte. (Herdado de Stream) |
Implantações explícitas de interface
IDisposable.Dispose() |
Esta API dá suporte à infraestrutura do produto e não deve ser usada diretamente do seu código. Libera os recursos usados pela instância atual da classe CryptoStream. |
Métodos de Extensão
CopyToAsync(Stream, PipeWriter, CancellationToken) |
Lê assíncronamente os bytes do Stream e os grava no PipeWriterespecificado usando um token de cancelamento. |
ConfigureAwait(IAsyncDisposable, Boolean) |
Configura como as esperas nas tarefas retornadas de um descartável assíncrono serão executadas. |
Aplica-se a
Confira também
- dos Serviços Criptográficos
- leituras de bytes parciais e zero em DeflateStream, GZipStream e CryptoStream