'Stream不支持使用CryptoStream对象'

时间:2009-10-26 16:03:51

标签: c# encryption cryptography

我正在尝试使用以下代码加密某些数据:

public static byte[] EncryptString(byte[] input, string password)
{
    PasswordDeriveBytes pderiver = new PasswordDeriveBytes(password, null);
    byte[] ivZeros = new byte[8];
    byte[] pbeKey = pderiver.CryptDeriveKey("RC2", "MD5", 128, ivZeros);

    RC2CryptoServiceProvider RC2 = new RC2CryptoServiceProvider();

    byte[] IV = new byte[8];
    ICryptoTransform encryptor = RC2.CreateEncryptor(pbeKey, IV);

    MemoryStream msEncrypt = new MemoryStream();
    CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
    csEncrypt.Write(input, 0, input.Length);
    csEncrypt.FlushFinalBlock();

    return msEncrypt.ToArray();
}

但是,当它初始化我的CryptoStream对象时,它会抛出以下错误:

  

“Stream不支持搜索。”   为了澄清,上面的代码中没有错误处理,所以只是运行它不会“破坏”,坚持。但是,单步执行代码,CryptoStream对象在初始化后会在其属性中显示此错误。

这是为什么?我怎么能避免它呢?

3 个答案:

答案 0 :(得分:7)

因此代码实际上没有异常地运行,但问题是当你在调试器中查看属性时?如果是这样,那很容易 - 一些属性(例如Position)依赖于能够在流中寻找。您不能使用CryptoStream执行此操作 - 因此属性评估失败。

你不需要避免这种情况 - 这完全没问题。

答案 1 :(得分:0)

你可以使用MemoryStream中的一个构造函数将'true'传递给可写参数吗?

答案 2 :(得分:0)

为了避免这个问题,它更容易使用:

    using (var reader = new StreamReader(csEncrypt))
    {
        return reader.ReadToEnd();
    }