Создайте поток, который шифрует прочитанные данные

Я пытаюсь создать поток, который получает базовый поток в конструкторе и автоматически шифрует данные, когда мы их читаем. Цель состоит в том, чтобы, когда мы читаем из EncryptingStream: - он читает базовый поток - он шифрует байты, прочитанные из базового потока - он возвращает зашифрованные байты

Мой текущий код выглядит так:

public class EncryptingStream : BaseCryptographicStream
{
    protected CryptoStream _current;
    protected ICryptoTransform _transform;
    protected Stream _underlyingStream;

    #region CTor
    public EncryptingStream(Stream source, string encryptionKey)
        : base(target)
    {
        this._underlyingStream = source;
        this.Initialize(encryptionKey);
    }
    #endregion


    protected void Initialize(string encryptionKey)
    {
        var input = CryptoTools.GenerateAlgorithmInputs(encryptionKey);

        RijndaelManaged rijndael = new RijndaelManaged();
        rijndael.Mode = CipherMode.CBC;
        rijndael.Key = input[0];
        rijndael.IV = input[1];

        this._transform = rijndael.CreateEncryptor();
        this._current = new CryptoStream(this._underlyingStream, this._transform, CryptoStreamMode.Write);
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        ??
    }
}

Примечание: BaseCryptographicStream наследуют Stream и реализуют абстрактные члены Stream, не реализованные указанным выше классом.

Моя проблема в том, что я застрял в реализации метода Read.
Я не могу использовать CryptoStream, поскольку этот поток записывает в выходной поток.
Я думаю, что мне нужно использовать объект ICryptoTransform, но у меня нет идея о том, как правильно читать. Проблема здесь в несоответствии длины зашифрованных и незашифрованных данных. поэтому буфер, прочитанный из базового потока, будет иметь размер, отличный от размера буфера, предоставленного EncryptingStream.

Кто-нибудь знает, что такой поток возможен, и есть идеи, как это сделать?

Обновление 1. Проблема, которую я пытаюсь решить, связана с потоковой передачей WCF. Я передаю (большие) файлы в WCF и не хочу помещать весь файл в память. Использование CryptoStream означает, что я должен использовать промежуточный MemoryStream для шифрования содержимого, что означает, что весь файл будет в памяти.


person Fabske    schedule 17.09.2014    source источник
comment
Вы рассматривали возможность использования стандартного CryptoStream? См. msdn.microsoft.com/en-us/library /   -  person Kris Vandermotten    schedule 17.09.2014
comment
Да, CryptoStream записывает в выходной поток, что противоположно тому, что я пытаюсь сделать здесь. Цель состоит в том, чтобы передавать большие файлы через сеть, а не помещать все в память перед шифрованием.   -  person Fabske    schedule 17.09.2014
comment
Я отредактировал свой вопрос, чтобы добавить дополнительную информацию по контексту   -  person Fabske    schedule 17.09.2014
comment
Чтобы использовать CryptoStream для чтения, просто создайте его с помощью CryptoStreamMode.Read. См. msdn.microsoft.com/en-us/library / и msdn.microsoft. ru / en-us / library /   -  person Kris Vandermotten    schedule 17.09.2014
comment
Каждый образец, который я нашел в сети, использует запись для шифрования и чтение для дешифрования. Вы имеете в виду, что мы можем использовать чтение + шифрование?   -  person Fabske    schedule 17.09.2014
comment
Протестировал, работает :). Поместите свой комментарий как ответ, чтобы я мог отметить его как ответ   -  person Fabske    schedule 17.09.2014


Ответы (1)