Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以正确的方式完成流链包装_C#_Bouncycastle - Fatal编程技术网

C# 以正确的方式完成流链包装

C# 以正确的方式完成流链包装,c#,bouncycastle,C#,Bouncycastle,我正在使用Bouncy Castle cryptographic API for C#创建加密数据的装甲输出 代码看起来很难看,尤其是这样: string result = string.Empty; using (var outputStream = new MemoryStream()) { using (var armoredStream = AddArmorWrappingTo(outputStream)) { using (var encryptedS

我正在使用Bouncy Castle cryptographic API for C#创建加密数据的装甲输出

代码看起来很难看,尤其是这样:

string result = string.Empty;

using (var outputStream = new MemoryStream())
{
    using (var armoredStream = AddArmorWrappingTo(outputStream))
    {
        using (var encryptedStream = AddEncryptionWrappingTo(armoredStream))
        {
            using (var literalStream = AddLiteralWrappingTo(encryptedStream))
            {
                using (var inputStream = new MemoryStream(input))
                {
                    this.Write(inputStream, literalStream);
                }
            }
        }
    }

    result = Encoding.ASCII.GetString(outputStream.ToArray());
}

return result;
这里的问题是,如果我需要添加数据压缩,我不能更改这段代码,我需要编写新的代码,因为在Bouncy Castle的世界中,压缩是作为未来输出流的另一个流包装器来完成的

要正常工作,需要以正确的顺序包装流,并正确关闭流,否则此操作将没有可用的结果

此外,所有这些中间流也应该存在(我不能一遍又一遍地覆盖同一个流变量)

我已经为流包装器创建者创建了扩展方法,现在看起来是这样的:

string result = string.Empty;

Stream[] pack = new Stream[3];

var outputStream = new MemoryStream();
var inputStream = new MemoryStream(input);

pack[0] = outputStream.Armor();
pack[1] = pack[0].EncryptWith(PublicKey);
pack[2] = pack[1].SplitByLiterals();

this.Write(inputStream, pack[2]);

pack[2].Close();
pack[1].Close();
pack[0].Close();

result = Encoding.ASCII.GetString(outputStream.ToArray());

return result;
我会说,代码变得更糟了

我的问题是,是否可以优化流包装?也许创建代理数组来逐个包装流,然后关闭它们


您在这类任务中有什么经验,有没有可能使这段代码更易于维护?由于当前添加压缩、签名或排除armoring是一件痛苦的事情…

我对您的“我不能一遍又一遍地覆盖同一个流变量”的评论感到有点困惑-原因是什么?通常,如果将一个流包装到另一个流中,则假定外部流将对内部流执行它喜欢的任何操作,之后您不应该亲自触摸它。我正在考虑使用单个流,而不是
armoredStream
encryptedStream
literalStream
。但它显然不起作用。