创建一个加密数据读取的流

时间:2014-09-17 11:53:46

标签: c# .net encryption stream rijndaelmanaged

我尝试创建一个在构造函数中接收底层流的流,并在读取数据时自动加密数据。 目标是当我们从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 个答案:

答案 0 :(得分:2)

不要自己滚动,只需使用标准CryptoStream类。要启用它的读取,请在构造函数调用中使用CryptoStreamMode.Read