исключение при расшифровке с Rijndael - PullRequest
4 голосов
/ 17 февраля 2011

У меня есть код, который расшифровывает пароль с помощью 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);
    }
}

Проблема в том, что удаление криптопотока вызывает исключение

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 ]

4 голосов
/ 21 июня 2011

Вы создаете steam в режиме CryptoStreamMode.Read и пытаетесь записать в него.

1 голос
/ 18 апреля 2012

Хотя я не мог найти хорошее решение, я нашел эти два обходных пути: О. Не делайте функцию шифрования / дешифрования статической (C #) / разделяемой (VB). (Вам нужно изменить код, чтобы создать экземпляр объекта RijndaelSimple, а затем вызвать функции Encrypt / Decrypt. Возможная причина: НЕ уверен, но, возможно, CryptoStream не использует поток памяти в поточно-ориентированном режиме Б. Кажется, что исключение выдается ТОЛЬКО, когда cipherText является пустой строкой. В версии 1.1 функция использовалась для возврата пустой строки, когда cipherText является пустой строкой. Так что просто добавьте этот код в качестве первой строки в функции Decrypt: if (string.IsNullOrEmpty (cipherText)) возврат "";

Я выбрал вариант B как // (Это был бы эффективный soln, так как он терпит неудачу только тогда, когда cipherText = "" // (Эффективно, поскольку все равно будет статической функцией, и ее не нужно будет расшифровывать, когда cipherText = "") *

...