我使用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;
我会说,代码变得更糟。
我的问题是,是否可以优化流包装?也许创建一个委托数组来逐个包装流并在之后关闭它们?
您对此类任务的体验是什么,是否可以使此代码更易于维护?由于目前增加压缩,签署或排除装甲是痛苦的......