Я пытаюсь создать поток, который получает базовый поток в конструкторе и автоматически шифрует данные, когда мы их читаем. Цель состоит в том, чтобы, когда мы читаем из 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 для шифрования содержимого, что означает, что весь файл будет в памяти.