使用Rijndael解密时的异常

时间:2011-02-17 08:55:33

标签: c# password-protection rijndaelmanaged

我有一些使用Rijndael解密密码的代码

public static string DecryptPassword(string encrypted) {
    using (MemoryStream ms = new MemoryStream())
    using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
    using (ICryptoTransform cryptoTransform = rijndaelManaged.CreateDecryptor(mGlobalKey, mGlobalVector))
    using (CryptoStream cs = new CryptoStream(ms, cryptoTransform, CryptoStreamMode.Read)) {
        byte[] encryptedBytes = Convert.FromBase64String(encrypted);
        cs.Write(encryptedBytes, 0, encryptedBytes.Length);
        cs.FlushFinalBlock();
        return Encoding.Unicode.GetString(ms.GetBuffer(), 0, (int)ms.Length);
    }
}

问题是处理cryptostream会导致异常

System.IndexOutOfRangeException : Index was outside the bounds of the array.
at System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)  
at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)  
at System.Security.Cryptography.CryptoStream.FlushFinalBlock()  
at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)  
at System.IO.Stream.Close()  
at System.IO.Stream.Dispose()  

我发现了类似问题的一些链接但没有解决方案。

只是删除隐藏流的处置是否安全,或者只会导致终结器在以后爆炸?

2 个答案:

答案 0 :(得分:4)

您正在CryptoStreamMode.Read模式下创建steam,并尝试写入它。

答案 1 :(得分:1)

虽然我找不到一个好的解决方案,但我找到了这两个解决方法: A.不要使加密/解密功能静态(C#)/共享(VB)。 (您必须更改代码以实例化RijndaelSimple对象,然后调用Encrypt / Decrypt函数。 可能的原因:不确定,但可能CryptoStream没有以线程安全的方式使用内存流 B.当cipherText为空字符串时,似乎只抛出异常。 在1.1中,当cipherText为空字符串时,该函数用于返回空字符串。 因此,只需将此代码添加为Decrypt函数中的第一行: if(string.IsNullOrEmpty(cipherText))                 返回“”;

我选择了B作为选项  //(这将是一个有效的解决方案,因为只有当cipherText =“”时它才会失败        //(效率很高,因为它仍然是一个静态函数,当cipherText =“”时它不需要解密)