C# ';流不支持查找';使用CryptoStream对象

C# ';流不支持查找';使用CryptoStream对象,c#,encryption,cryptography,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", "M

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

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();
}
但是,当它到达初始化my CryptoStream对象时,会抛出以下错误:

“流不支持查找。” 为了澄清这一点,上面的代码中没有错误处理,所以只要运行它就不会“中断”,persay。但在代码中单步执行时,CryptoStream对象在初始化后将在其属性中显示此错误


为什么会这样?我怎样才能避免呢

您可以在MemoryStream上使用其中一个构造函数,将“true”传递给可写参数吗?

因此代码实际上运行时没有异常,但问题是当您在调试器中查看属性时?如果是这样,那就很容易了——一些属性(
位置
)依赖于能够在流中查找。使用
加密流
,您无法做到这一点,因此属性评估失败


您无需避免此问题-这很好。

要避免此问题,它更易于使用:

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

我可以通过这个构造器推送什么字节数组仍然可以工作?我相信MD5散列到16字节。这是因为这个流不支持查找。你为什么要避免它?只要不使用Seek,一切都应该正常。因此,发生异常仅仅是因为尝试查看流上的Position属性无效,所以它只是向我确认我无法查看它?抛出
加密异常:填充无效,无法删除。