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

时间:2014-11-03 14:35:50

标签: c# bouncycastle

我使用Councy Castle加密API来创建加密数据的装甲输出。

代码看起来很丑,特别是这样:

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;

我会说,代码变得更糟。

我的问题是,是否可以优化流包装?也许创建一个委托数组来逐个包装流并在之后关闭它们?

您对此类任务的体验是什么,是否可以使此代码更易于维护?由于目前增加压缩,签署或排除装甲是痛苦的......

0 个答案:

没有答案