CryptoStream Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Определяет поток, который связывает потоки данных с криптографическими преобразованиями.
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
- Наследование
- Наследование
- Атрибуты
- Реализации
Примеры
В следующем примере показано, как использовать CryptoStream для шифрования строки. Этот метод использует Aes класс с указанным 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
Комментарии
Среда CLR использует потокоориентированную структуру для шифрования. В основе этой структуры лежит CryptoStream. Любые криптографические объекты, реализующие CryptoStream , можно объединить в цепочку с любыми объектами, реализующими Stream, чтобы потоковые выходные данные одного объекта могли передаваться во входные данные другого объекта. Промежуточный результат (выходные данные первого объекта) не требуется хранить отдельно.
Важно!
В .NET 6 и более поздних версиях при Stream.Read
вызове или Stream.ReadAsync
с буфером длины N
операция завершается, когда из потока было считано по крайней мере 1 байт или базовый поток, который он заключает, возвращает 0 из вызова Read
, указывая, что больше нет доступных данных. До .NET 6 и Stream.ReadAsync
не возвращались, Stream.Read
пока все N
байты не были считаны из потока или базовый поток не возвращал 0 из вызова Read
. Если в коде предполагается, что методы не будут возвращены Read
до тех пор, пока не будут прочитаны все N
байты, он может не прочитать все содержимое. Дополнительные сведения см. в разделе Частичные и нулевые операции чтения в потоках.
После завершения использования объекта всегда следует явно закрывать объект CryptoStream , вызывая Clear метод . Это приведет к CryptoStream очистке базового потока и обработке всех оставшихся блоков данных объектом . Однако если перед вызовом Close метода возникает исключение, CryptoStream объект может не быть закрыт. Чтобы гарантировать, что Close метод всегда вызывается, поместите вызов Clear метода в finally
блок инструкции/try
catch
.
Этот тип реализует интерфейс IDisposable. Завершив использование типа, вы должны удалить его прямо или косвенно, вызвав его Clear метод , который, в свою очередь, вызывает его IDisposable реализацию. Чтобы сделать это прямо, вызовите его метод Clear в блоке try
/catch
. Чтобы сделать это косвенно, используйте языковые конструкции, такие как using
(в C#) или Using
(в Visual Basic).
Конструкторы
CryptoStream(Stream, ICryptoTransform, CryptoStreamMode) |
Инициализирует новый экземпляр класса CryptoStream, используя целевой поток данных, преобразования и режим потока. |
CryptoStream(Stream, ICryptoTransform, CryptoStreamMode, Boolean) |
Инициализирует новый экземпляр класса CryptoStream. |
Свойства
CanRead |
Возвращает значение, определяющее, доступен ли текущий поток CryptoStream для чтения. |
CanSeek |
Возвращает значение, указывающее, возможен ли поиск в текущем потоке CryptoStream. |
CanTimeout |
Возвращает значение, которое показывает, может ли для данного потока истечь время ожидания. (Унаследовано от Stream) |
CanWrite |
Возвращает значение, определяющее, доступен ли текущий поток CryptoStream для записи. |
HasFlushedFinalBlock |
Возвращает значение, указывающее, записан ли последний буферный блок в базовый поток. |
Length |
Получает длину потока в байтах. |
Position |
Получает или задает позицию в текущем потоке. |
ReadTimeout |
Возвращает или задает значение в миллисекундах, определяющее период времени, отведенного потоку на выполнение операции чтения. (Унаследовано от Stream) |
WriteTimeout |
Возвращает или задает значение в миллисекундах, определяющее период времени, отведенного потоку на выполнение операции записи. (Унаследовано от Stream) |
Методы
BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) |
Начинает операцию асинхронного чтения. (Рекомендуется использовать ReadAsync.) |
BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) |
Начинает операцию асинхронного чтения. (Рекомендуется использовать ReadAsync(Byte[], Int32, Int32).) (Унаследовано от Stream) |
BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) |
Начинает операцию асинхронной записи. (Рекомендуется использовать WriteAsync.) |
BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) |
Начинает операцию асинхронной записи. (Рекомендуется использовать WriteAsync(Byte[], Int32, Int32).) (Унаследовано от Stream) |
Clear() |
Освобождает все ресурсы, занятые модулем CryptoStream. |
Close() |
Закрывает текущий поток и отключает все ресурсы (например, сокеты и файловые дескрипторы), связанные с текущим потоком. |
Close() |
Закрывает текущий поток и отключает все ресурсы (например, сокеты и файловые дескрипторы), связанные с текущим потоком. Вместо вызова данного метода, убедитесь в том, что поток надлежащим образом ликвидирован. (Унаследовано от Stream) |
CopyTo(Stream) |
Считывает байты из текущего потока и записывает их в другой поток. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CopyTo(Stream, Int32) |
Считывает байты из базового потока, применяет соответствующие криптографические преобразования и записывает результат в целевой поток. |
CopyTo(Stream, Int32) |
Считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CopyToAsync(Stream) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CopyToAsync(Stream, CancellationToken) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток, используя указанный токен отмены. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CopyToAsync(Stream, Int32) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CopyToAsync(Stream, Int32, CancellationToken) |
Асинхронно считывает байты из базового потока, применяет соответствующие криптографические преобразования и записывает результат в целевой поток. |
CopyToAsync(Stream, Int32, CancellationToken) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера и токен отмены. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CreateObjRef(Type) |
Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом. (Унаследовано от MarshalByRefObject) |
CreateWaitHandle() |
Устаревшие..
Устаревшие..
Устаревшие..
Выделяет объект WaitHandle. (Унаследовано от Stream) |
Dispose() |
Освобождает все ресурсы, занятые модулем Stream. (Унаследовано от Stream) |
Dispose(Boolean) |
Освобождает неуправляемые ресурсы, используемые объектом CryptoStream, а при необходимости освобождает также управляемые ресурсы. |
DisposeAsync() |
Асинхронно освобождает неуправляемые ресурсы, используемые классом CryptoStream. |
DisposeAsync() |
Асинхронно освобождает неуправляемые ресурсы, используемые классом Stream. (Унаследовано от Stream) |
EndRead(IAsyncResult) |
Ожидает завершения отложенного асинхронного чтения. (Рекомендуется использовать ReadAsync.) |
EndRead(IAsyncResult) |
Ожидает завершения отложенного асинхронного чтения. (Рекомендуется использовать ReadAsync(Byte[], Int32, Int32).) (Унаследовано от Stream) |
EndWrite(IAsyncResult) |
Заканчивает операцию асинхронной записи. (Рекомендуется использовать WriteAsync.) |
EndWrite(IAsyncResult) |
Заканчивает операцию асинхронной записи. (Рекомендуется использовать WriteAsync(Byte[], Int32, Int32).) (Унаследовано от Stream) |
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
Finalize() |
Позволяет объекту попытаться освободить ресурсы и выполнить другие операции очистки, перед тем как он будет уничтожен во время сборки мусора. |
Flush() |
Очищает все буферы для текущего потока и вызывает запись всех буферизированных данных в базовое устройство. |
FlushAsync() |
Асинхронно очищает все буферы для этого потока и вызывает запись всех буферизованных данных в базовое устройство. (Унаследовано от Stream) |
FlushAsync(CancellationToken) |
Асинхронно очищает все буферы текущего потока, вызывает запись буферизованных данных в базовое устройство и отслеживает запросы отмены. |
FlushAsync(CancellationToken) |
Асинхронно очищает все буферы данного потока, вызывает запись буферизованных данных в базовое устройство и отслеживает запросы отмены. (Унаследовано от Stream) |
FlushFinalBlock() |
Обновляет базовый источник данных или хранилище текущим содержимым буфера, а затем очищает буфер. |
FlushFinalBlockAsync(CancellationToken) |
Асинхронно обновляет базовый источник данных или хранилище текущим состоянием буфера, а затем очищает буфер. |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetLifetimeService() |
Устаревшие..
Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра. (Унаследовано от MarshalByRefObject) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
InitializeLifetimeService() |
Устаревшие..
Получает объект службы времени существования для управления политикой времени существования для этого экземпляра. (Унаследовано от MarshalByRefObject) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
MemberwiseClone(Boolean) |
Создает неполную копию текущего объекта MarshalByRefObject. (Унаследовано от MarshalByRefObject) |
ObjectInvariant() |
Устаревшие..
Обеспечивает поддержку для Contract. (Унаследовано от Stream) |
Read(Byte[], Int32, Int32) |
Считывает последовательность байтов из текущего потока и перемещает позицию внутри потока на число считанных байтов. |
Read(Span<Byte>) |
При переопределении в производном классе считывает последовательность байтов из текущего потока и перемещает позицию в потоке на число считанных байтов. (Унаследовано от Stream) |
ReadAsync(Byte[], Int32, Int32) |
Асинхронно считывает последовательность байтов из текущего потока и перемещает позицию внутри потока на число считанных байтов. (Унаследовано от Stream) |
ReadAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно считывает последовательность байтов из текущего потока, перемещает позицию в потоке на число считанных байтов и отслеживает запросы отмены. |
ReadAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно считывает последовательность байтов из текущего потока, перемещает позицию в потоке на число считанных байтов и отслеживает запросы отмены. (Унаследовано от Stream) |
ReadAsync(Memory<Byte>, CancellationToken) |
Асинхронно считывает последовательность байтов из текущего потока, перемещает позицию в потоке на число считанных байтов и отслеживает запросы отмены. |
ReadAsync(Memory<Byte>, CancellationToken) |
Асинхронно считывает последовательность байтов из текущего потока, перемещает позицию в потоке на число считанных байтов и отслеживает запросы отмены. (Унаследовано от Stream) |
ReadAtLeast(Span<Byte>, Int32, Boolean) |
Считывает по крайней мере минимальное количество байтов из текущего потока и перемещает позицию в потоке на число прочитанных байтов. (Унаследовано от Stream) |
ReadAtLeastAsync(Memory<Byte>, Int32, Boolean, CancellationToken) |
Асинхронно считывает по крайней мере минимальное количество байтов из текущего потока, перемещает позицию в потоке на число прочитанных байтов и отслеживает запросы отмены. (Унаследовано от Stream) |
ReadByte() |
Считывает байт из потока и перемещает позицию в потоке на один байт или возвращает -1, если достигнут конец потока. |
ReadByte() |
Считывает байт из потока и перемещает позицию в потоке на один байт или возвращает -1, если достигнут конец потока. (Унаследовано от Stream) |
ReadExactly(Byte[], Int32, Int32) |
Считывает |
ReadExactly(Span<Byte>) |
Считывает байты из текущего потока и перемещает позицию в потоке |
ReadExactlyAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно считывает |
ReadExactlyAsync(Memory<Byte>, CancellationToken) |
Асинхронно считывает байты из текущего потока, перемещает позицию в потоке |
Seek(Int64, SeekOrigin) |
Задает позицию в текущем потоке. |
SetLength(Int64) |
Устанавливает длину текущего потока. |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
Write(Byte[], Int32, Int32) |
Записывает последовательность байтов в текущий CryptoStream и перемещает текущую позицию внутри потока на число записанных байтов. |
Write(ReadOnlySpan<Byte>) |
При переопределении в производном классе записывает последовательность байтов в текущий поток и перемещает текущую позицию в нем вперед на число записанных байтов. (Унаследовано от Stream) |
WriteAsync(Byte[], Int32, Int32) |
Асинхронно записывает последовательность байтов в текущий поток и перемещает текущую позицию внутри потока на число записанных байтов. (Унаследовано от Stream) |
WriteAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию внутри потока на число записанных байтов и отслеживает запросы отмены. |
WriteAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию внутри потока на число записанных байтов и отслеживает запросы отмены. (Унаследовано от Stream) |
WriteAsync(ReadOnlyMemory<Byte>, CancellationToken) |
Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию внутри потока на число записанных байтов и отслеживает запросы отмены. |
WriteAsync(ReadOnlyMemory<Byte>, CancellationToken) |
Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию внутри потока на число записанных байтов и отслеживает запросы отмены. (Унаследовано от Stream) |
WriteByte(Byte) |
Записывает байт в текущее положение в потоке и перемещает позицию в потоке вперед на один байт. |
WriteByte(Byte) |
Записывает байт в текущее положение в потоке и перемещает позицию в потоке вперед на один байт. (Унаследовано от Stream) |
Явные реализации интерфейса
IDisposable.Dispose() |
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода. Освобождает ресурсы, используемые текущим экземпляром класса CryptoStream. |
Методы расширения
CopyToAsync(Stream, PipeWriter, CancellationToken) |
Асинхронно считывает байты из Stream и записывает их в указанный PipeWriter, используя токен отмены. |
ConfigureAwait(IAsyncDisposable, Boolean) |
Настраивает способ выполнения ожиданий для задач, возвращаемых из асинхронного высвобождаемого объекта. |
Применяется к
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по