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

本文关键字:数据 加密 读取 一个 创建 | 更新日期: 2023-09-27 18:22:08

我正在尝试创建一个流,该流在构造函数中接收底层流,并在读取数据时自动加密数据。目标是,当我们从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来加密内容,这意味着整个文件将在内存中

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

与其自己滚动,不如使用标准的CryptoStream类。若要启用从中读取,请在构造函数调用中使用CryptoStreamMode.Read