Почему расшифровка не возвращает ожидаемое значение?

При использовании C# rijndael для расшифровки строки, которая была ранее зашифрована и сохранена на сервере sql ce, я ничего не получаю от расшифровки. По отладке и проверке базы данных я могу сказать, что расшифрованная строка, похоже, сохранена, как и ожидалось, с разными наборами бессмысленности для разных входных строк, поэтому я предполагаю, что проблема в коде дешифрования. Я также подтвердил, что входной параметр cipherText получил правильное количество байтов после извлечения из базы данных и преобразования в байтовый массив. Я использовал пример, найденный по адресу: http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael%28v=vs.110%29.aspx чтобы сделать это с некоторыми изменениями.

static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
    {
        // Check arguments. 
        if (cipherText == null || cipherText.Length <= 0)
            throw new ArgumentNullException("cipherText");
        if (Key == null || Key.Length <= 0)
            throw new ArgumentNullException("Key");
        if (IV == null || IV.Length <= 0)
            throw new ArgumentNullException("Key");

        // Declare the string used to hold 
        // the decrypted text. 
        string plainText = null;

        // Create an Rijndael object 
        // with the specified key and IV. 
        using (Rijndael rijAlg = Rijndael.Create())
        {
            rijAlg.Key = Key;
            rijAlg.IV = IV;
            rijAlg.Padding = PaddingMode.PKCS7;

            // Create a decrytor to perform the stream transform.
            ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
            var plainBytes = new byte[cipherText.Length];
            int plainByteCount;

            // Create the streams used for decryption. 
            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {

                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {

                    plainByteCount = csDecrypt.Read(plainBytes, 0, plainBytes.Length);

                    using (StreamReader srDecrypt = new StreamReader(csDecrypt, System.Text.Encoding.Unicode))
                    {
                        // Read the decrypted bytes from the decrypting stream 
                        // and place them in a string.
                        plainText = srDecrypt.ReadToEnd();

                    }

                }
            }
        plainText = Encoding.Unicode.GetString(plainBytes, 0, plainBytes.Length);

        }

        return plainText;

    }

В

 plainText = srDecrypt.ReadToEnd();

plainText получает значение "", где я ожидаю, что это будет расшифрованное слово.

Наконец, в

   plainText = Encoding.Unicode.GetString(plainBytes, 0, plainBytes.Length);

обычный текст становится: "\0\0\0\0\0\0\0\0"

Я пробовал различные варианты заполнения, как на этапах шифрования, так и на этапе дешифрования, и вижу, что это дает эффект, но не решает проблему. Без установки отступа в первую очередь шифруется 0 байтов, где должно быть 16 байтов. Я также пробовал разные способы колла флеша и флешфиналблока. Я храню ключ /iv в текстовых файлах (я знаю, что это может быть не лучшим решением для безопасности, моя цель на данный момент - только узнать больше об этой теме).

Пожалуйста, помогите мне найти, что я делаю не так здесь.

1 ответ

Я столкнулся с подобной проблемой в VB.NET и обнаружил, что переменные, которые будут использоваться как в процессе шифрования, так и в процессе дешифрования, должны быть одинаковыми. Предоставление функциям шифрования и дешифрования их собственных локальных переменных определенно приведет к тому, что функция дешифрования вернет неправильное значение. Попробуйте сделать ключ и iv глобальной переменной вместо локальной.

Другие вопросы по тегам