CryptoStream Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Define um fluxo que vincula fluxos de dados a transformações criptográficas.
public ref class CryptoStream : System::IO::Stream
public ref class CryptoStream : System::IO::Stream, IDisposable
public class CryptoStream : System.IO.Stream
[System.Runtime.InteropServices.ComVisible(true)]
public class CryptoStream : System.IO.Stream
public class CryptoStream : System.IO.Stream, IDisposable
type CryptoStream = class
inherit Stream
interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type CryptoStream = class
inherit Stream
interface IDisposable
Public Class CryptoStream
Inherits Stream
Public Class CryptoStream
Inherits Stream
Implements IDisposable
- Herança
- Herança
- Atributos
- Implementações
Exemplos
O exemplo seguinte demonstra como usar a CryptoStream para encriptar uma cadeia. Este método utiliza a Aes classe com o vetor de inicialização especificado Key e (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
Observações
O runtime da linguagem comum utiliza um design orientado a fluxos para criptografia. O núcleo deste design é CryptoStream. Quaisquer objetos criptográficos que implementem CryptoStream podem ser encadeados com quaisquer objetos que implementem Stream, pelo que a saída transmitida de um objeto pode ser alimentada para a entrada de outro objeto. O resultado intermédio (a saída do primeiro objeto) não precisa de ser armazenado separadamente.
Importante
Em versões .NET 6 e 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 quando o fluxo subjacente que ele envolve retorna 0 de uma chamada para Read, indicando que não há mais dados disponíveis. No .NET Framework, Stream.Read e Stream.ReadAsync não retornam até que todos os bytes N tenham sido lidos do fluxo ou o fluxo subjacente não retorne 0 de uma chamada para Read. Se o seu código assumir que os Read métodos não retornarão até que todos N os bytes tenham sido lidos, pode falhar em ler todo o conteúdo. Para mais informações, veja Leituras parciais e de zero bytes em fluxos.
Deves sempre fechar explicitamente o teu CryptoStream objeto depois de o usares, chamando o Clear método. Ao fazê-lo, o fluxo subjacente é eliminado e faz com que todos os blocos restantes de dados sejam processados pelo CryptoStream objeto. No entanto, se ocorrer uma exceção antes de chamar o Close método, o CryptoStream objeto pode não estar fechado. Para garantir que o Close método é sempre chamado, coloque a sua chamada ao Clear método dentro do finally bloco de uma try/catch instrução.
Este tipo implementa a interface IDisposable. Quando terminar de usar o tipo, deve descartá-lo, direta ou indiretamente, chamando o seu Clear método, que por sua vez chama a sua IDisposable implementação. Para descartar o tipo diretamente, chame seu método Clear em um bloco try/catch. Para descartá-lo indiretamente, use uma construção de linguagem como using (em C#) ou Using (em Visual Basic).
Construtores
| Name | Description |
|---|---|
| CryptoStream(Stream, ICryptoTransform, CryptoStreamMode, Boolean) |
Inicializa uma nova instância da CryptoStream classe. |
| CryptoStream(Stream, ICryptoTransform, CryptoStreamMode) |
Inicializa uma nova instância da CryptoStream classe com um fluxo de dados alvo, a transformação a usar e o modo do fluxo. |
Propriedades
| Name | Description |
|---|---|
| CanRead |
Recebe um valor que indica se a corrente CryptoStream é legível. |
| CanSeek |
Obtém um valor que indica se pode procurar dentro da corrente CryptoStream. |
| CanTimeout |
Obtém um valor que determina se o fluxo atual pode expirar. (Herdado de Stream) |
| CanWrite |
Recebe um valor que indica se a corrente CryptoStream é gravável. |
| HasFlushedFinalBlock |
Obtém um valor que indica se o bloco de buffer final foi escrito 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 |
Recebe ou define um valor, em milissegundos, que determina quanto tempo o fluxo tentará ler antes de expirar. (Herdado de Stream) |
| WriteTimeout |
Recebe ou define um valor, em milissegundos, que determina quanto tempo o fluxo tenta escrever antes de expirar. (Herdado de Stream) |
Métodos
| Name | Description |
|---|---|
| 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 escrita assíncrona. (Considere usar WriteAsync em vez disso.) |
| BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) |
Inicia uma operação de escrita assíncrona. (Considere usar WriteAsync(Byte[], Int32, Int32) em vez disso.) (Herdado de Stream) |
| Clear() |
Liberta todos os recursos utilizados pelo CryptoStream. |
| Close() |
Fecha o fluxo atual e liberta quaisquer recursos (como sockets e handles de ficheiros) associados ao fluxo atual. |
| Close() |
Fecha o fluxo atual e liberta quaisquer recursos (como sockets e handles de ficheiros) associados ao fluxo atual. Em vez de chamar este método, certifique-se de que o fluxo é devidamente descartado. (Herdado de Stream) |
| CopyTo(Stream, Int32) |
Lê os bytes do fluxo atual e escreve-os noutro fluxo, usando um tamanho de buffer especificado. As posições de ambos os fluxos são avançadas pelo número de bytes copiados. (Herdado de Stream) |
| CopyTo(Stream) |
Lê os bytes do fluxo atual e escreve-os noutro fluxo. As posições de ambos os 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 escreve-os noutro fluxo, usando um token de cancelamento especificado. As posições de ambos os 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 atual e escreve-os noutro fluxo, usando um tamanho de buffer especificado e um token de cancelamento. As posições de ambos os fluxos são avançadas pelo número de bytes copiados. (Herdado de Stream) |
| CopyToAsync(Stream, Int32) |
Lê assíncronamente os bytes do fluxo atual e escreve-os noutro fluxo, usando um tamanho de buffer especificado. As posições de ambos os 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 escreve-os noutro fluxo. As posições de ambos os fluxos são avançadas pelo número de bytes copiados. (Herdado de Stream) |
| CreateObjRef(Type) |
Cria um objeto que contém toda a informação relevante necessária para gerar um proxy usado para comunicar com um objeto remoto. (Herdado de MarshalByRefObject) |
| CreateWaitHandle() |
Obsoleto.
Aloca um WaitHandle objeto. (Herdado de Stream) |
| Dispose() |
Liberta todos os recursos utilizados pelo Stream. (Herdado de Stream) |
| Dispose(Boolean) |
Liberta os recursos não geridos usados pelo CryptoStream e opcionalmente liberta os recursos geridos. |
| DisposeAsync() |
De forma assíncrona, liberta os recursos não geridos usados pelos CryptoStream. |
| EndRead(IAsyncResult) |
Espera que a leitura assíncrona pendente seja concluída. (Considere usar ReadAsync em vez disso.) |
| EndRead(IAsyncResult) |
Espera que a leitura assíncrona pendente seja concluída. (Considere usar ReadAsync(Byte[], Int32, Int32) em vez disso.) (Herdado de Stream) |
| EndWrite(IAsyncResult) |
Termina uma operação de escrita assíncrona. (Considere usar WriteAsync em vez disso.) |
| EndWrite(IAsyncResult) |
Termina uma operação de escrita 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 libertar recursos e realizar outras operações de limpeza antes de ser recuperado pela recolha de lixo. |
| Flush() |
Limpa todos os buffers do fluxo atual e faz com que quaisquer dados em buffer sejam escritos no dispositivo subjacente. |
| FlushAsync() |
Apaga assíncronamente todos os buffers deste fluxo e faz com que quaisquer dados armazenados sejam escritos no dispositivo subjacente. (Herdado de Stream) |
| FlushAsync(CancellationToken) |
Limpa todos os buffers do fluxo atual de forma assíncrona, faz com que quaisquer dados armazenados sejam escritos no dispositivo subjacente e monitoriza pedidos de cancelamento. |
| FlushFinalBlock() |
Atualiza a fonte de dados subjacente ou repositório com o estado atual do buffer, depois limpa o buffer. |
| GetHashCode() |
Serve como função de hash predefinida. (Herdado de Object) |
| GetLifetimeService() |
Recupera o objeto de serviço de tempo de vida atual que controla a política de vida útil neste caso. (Herdado de MarshalByRefObject) |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| InitializeLifetimeService() |
Obtém-se um objeto de serviço vitalício para controlar a apólice vitalícia neste caso. (Herdado de MarshalByRefObject) |
| MemberwiseClone() |
Cria uma cópia superficial do atual Object. (Herdado de Object) |
| MemberwiseClone(Boolean) |
Cria uma cópia superficial do objeto atual MarshalByRefObject . (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 sobreposto numa 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, 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 monitoriza pedidos de cancelamento. |
| ReadAsync(Byte[], Int32, Int32) |
A leitura 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(Memory<Byte>, CancellationToken) |
A leitura 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 monitoriza pedidos de cancelamento. (Herdado de Stream) |
| ReadByte() |
Lê um byte do fluxo e avança a posição dentro do fluxo em um byte, ou devolve -1 se estiver no final do fluxo. |
| ReadByte() |
Lê um byte do fluxo e avança a posição dentro do fluxo em um byte, ou devolve -1 se estiver no final do fluxo. (Herdado de Stream) |
| Seek(Int64, SeekOrigin) |
Define a posição dentro do fluxo atual. |
| SetLength(Int64) |
Define o comprimento do fluxo atual. |
| ToString() |
Devolve uma cadeia que representa o objeto atual. (Herdado de Object) |
| Write(Byte[], Int32, Int32) |
Escreve uma sequência de bytes na corrente CryptoStream e avança a posição atual dentro do fluxo pelo número de bytes escritos. |
| Write(ReadOnlySpan<Byte>) |
Quando sobreposto numa classe derivada, escreve uma sequência de bytes no fluxo atual e avança a posição atual dentro desse fluxo pelo número de bytes escritos. (Herdado de Stream) |
| WriteAsync(Byte[], Int32, Int32, CancellationToken) |
Escreve 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 escritos e monitoriza pedidos de cancelamento. |
| WriteAsync(Byte[], Int32, Int32) |
Escreve assíncronamente uma sequência de bytes no fluxo atual e avança a posição atual dentro desse fluxo pelo número de bytes escritos. (Herdado de Stream) |
| WriteAsync(ReadOnlyMemory<Byte>, CancellationToken) |
Escreve assíncronamente uma sequência de bytes no fluxo atual, avança a posição atual dentro deste fluxo pelo número de bytes escritos e monitoriza pedidos de cancelamento. (Herdado de Stream) |
| WriteByte(Byte) |
Escreve um byte na posição atual no fluxo e avança a posição dentro do fluxo em um byte. |
| WriteByte(Byte) |
Escreve um byte na posição atual no fluxo e avança a posição dentro do fluxo em um byte. (Herdado de Stream) |
Implementações de Interface Explícita
| Name | Description |
|---|---|
| IDisposable.Dispose() |
Esta API suporta a infraestrutura de produtos e não é pressuposta para ser utilizada diretamente a partir do seu código. Liberta os recursos usados pela instância atual da CryptoStream classe. |
Métodos da Extensão
| Name | Description |
|---|---|
| ConfigureAwait(IAsyncDisposable, Boolean) |
Configura como aguarda nas tarefas devolvidas de um descartável assíncrono será realizada. |