在CanWrite = False上由流修改的缓冲区?

时间:2012-08-10 05:17:39

标签: .net encryption stream memorystream

我正在玩加密,我发现这会修改我的缓冲区。我没想到。

如果你用aesbuf查看MemoryStream,你可以清楚地看到我将CanWrite设置为false。然而aesbuf被修改了。我知道因为b1是真的但是b2是假的。

WTF!?这是怎么回事?

byte[] unencrypted_array;
var a1 = (byte[])aesbuf.Clone();
var b1 = a1.ArraysEqual(aesbuf);

using (MemoryStream ms2 = new MemoryStream(aesbuf))
using (var aes = new RijndaelManaged())
{
    using (var dec = aes.CreateDecryptor(aeskey, aesiv))
    using (MemoryStream ms = new MemoryStream(aesbuf, false))
    using (CryptoStream sr = new CryptoStream(ms, dec, CryptoStreamMode.Read))
    {
        byte[] buf = new byte[1024 * 4];
        int l;
        while ((l = sr.Read(buf, 0, buf.Length)) != 0)
        {
            ms2.Write(buf, 0, l);
        }
    }
    ms2.Flush();
    unencrypted_array = ms2.ToArray();
}
var b2 = a1.ArraysEqual(aesbuf);

1 个答案:

答案 0 :(得分:2)

你有:

using (MemoryStream ms2 = new MemoryStream(aesbuf))

ms2.Write(buf, 0, l);

所以......你自己的代码写入了一个可写的MemoryStream,它使用aesbuf作为底层缓冲区。自己造成。