我正在尝试创建一个在构造函数中接收基础流的流,并在读取数据时自动加密数据 . 目标是当我们从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来加密内容,这意味着整个文件将在内存中
1 回答
不要自己滚动,只需使用标准CryptoStream类 . 要启用它的读取,请在构造函数调用中使用
CryptoStreamMode.Read
.