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
Наследование
Атрибуты
Реализации

Примеры

В следующем примере показано, как использовать 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. Если в коде предполагается, что методы не будут возвращены до тех пор, пока не будут прочитаны все N байтыRead, может произойти сбой при чтении всего содержимого. Дополнительные сведения см. в разделе Частичные и нулевые операции чтения в потоках.

После завершения работы с ним всегда следует явно закрывать CryptoStream объект, вызывая Clear метод . Это приведет к CryptoStream очистке базового потока и обработке всех оставшихся блоков данных объектом . Однако если перед вызовом Close метода возникает исключение, CryptoStream объект может не быть закрыт. Чтобы гарантировать, что Close метод всегда вызывается, поместите вызов Clear метода в finally блок инструкции/trycatch .

Этот тип реализует интерфейс 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)

Считывает count количество байтов из текущего потока и перемещает позицию в потоке.

(Унаследовано от Stream)
ReadExactly(Span<Byte>)

Считывает байты из текущего потока и перемещает позицию в потоке buffer до заполнения .

(Унаследовано от Stream)
ReadExactlyAsync(Byte[], Int32, Int32, CancellationToken)

Асинхронно считывает count количество байтов из текущего потока, перемещает позицию в потоке и отслеживает запросы отмены.

(Унаследовано от Stream)
ReadExactlyAsync(Memory<Byte>, CancellationToken)

Асинхронно считывает байты из текущего потока, перемещает позицию в потоке buffer до заполнения и отслеживает запросы отмены.

(Унаследовано от Stream)
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.

Методы расширения

ConfigureAwait(IAsyncDisposable, Boolean)

Настраивает способ выполнения ожиданий для задач, возвращаемых из асинхронного высвобождаемого объекта.

Применяется к

См. также раздел