Вопрос по c#, c#-4.0 – Заполнение является недопустимым и не может быть удалено Исключение при расшифровке строки с помощью «AesManaged» C #

5

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

Следующая строка выдает исключение

using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
     // Read the decrypted bytes from the decrypting stream
     // and place them in a string.
     plaintext = srDecrypt.ReadToEnd();
}

public string EncryptAuthenticationTokenAes(string plainText)
{

    byte[] encrypted;
    // Create an AesManaged object
    // with the specified key and IV.
    using (AesManaged aesAlg = new AesManaged())
    {

        // Create a decrytor to perform the stream transform.
        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
        aesAlg.Padding = PaddingMode.None;
        // Create the streams used for encryption.
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {

                    //Write all data to the stream.
                    swEncrypt.Write(plainText);
                }
                encrypted = msEncrypt.ToArray();
            }
        }
    }


    // Return the encrypted bytes from the memory stream.
    return Convert.ToBase64String(encrypted);

}

public string DecryptPasswordAes(string encryptedString)
{
    //Convert cipher text back to byte array
    byte[] cipherText = Convert.FromBase64String(encryptedString);

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

    // Create an AesManaged object
    // with the specified key and IV.
    using (AesManaged aesAlg = new AesManaged())
    {
        // Create a decrytor to perform the stream transform.
        ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
        aesAlg.Padding = PaddingMode.None;
        // Create the streams used for decryption.
        using (MemoryStream msDecrypt = new MemoryStream(cipherText))
        {
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                {

                    // Read the decrypted bytes from the decrypting stream
                    // and place them in a string.
                    plaintext = srDecrypt.ReadToEnd();
                }
            }
        }

    }

    return plaintext;

}
На самом деле я обнаружил проблему при вызове методов шифрования и дешифрования, поскольку оба используют разныеKey а такжеIV, когда я прошел то же самоеKey а такжеIV проблема решена. aamir sajjad

Ваш Ответ

1   ответ
16

вы забыли заставить его шифровать последние байты потока. Он хранит байты во внутреннем буфере до тех пор, пока их не будет достаточно для создания блока. Вы должны вытеснить последние несколько байтов. Fix:

    using (var msEncrypt = new MemoryStream())
    using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
    using (var swEncrypt = new StreamWriter(csEncrypt)) {
        swEncrypt.Write(plainText);
        csEncrypt.FlushFinalBlock();
        encrypted = msEncrypt.ToArray();
    }

Вы получили исключение при расшифровке, потому чтоencrypted отсутствует финальный отступ. Настоящая проблема вызванаusing Заявление, у вас не будет этой проблемы, если вы ждете получения зашифрованных байтов до тех пор, пока CryptoStream не будет закрыт. Но это не очень хорошо работает, потому чтоusing Оператор на StreamWriter также закрывает CryptoStream и MemoryStream. Явное использование FlushFinalBlock () - лучший обходной путь.

@ Астрогатор: Это не имеет смысла и не было источником / исправить. Curlies являются необязательными и не изменяют (в данном случае) семантику.
@EdS. Не причина дляthis один, но проверьтеmy linked вопрос. Я также решил, что кудрявые{} были ненужными - и были укушены этим. Они могут не изменять семантику, но они определенно влияли на порядок выполнения, потому что восстановление их исправило мой код. Это все, о чем я хотел предупредить.
@EdS. Порядок выполнения финализаторов (и = & gt; закрытие объектов) зависит от наличия или отсутствия фигурных скобок{}был важен в моем вопросе. Я спросил об этом, ответил сам, поделился своим опытом и предупредил других, кто наткнулся на этот вопрос.4 years later you just came to this one, dissed my comment, and then downvoted my answer. Not cool, dude!
@ Астрогатор: О, конечно же; Вы переместили линию, близкую к совершенно другой области.
По какой-то причине этот подход не работал для меня в C # 4.0 / 4.5 - пришлось ставить фигурные скобки после каждогоusing( ), Чем нет.FlushFinalBlock( ) звонок нужен. Увидетьstackoverflow.com/questions/29809687/#29835039.

Похожие вопросы