“Дополнение недопустимо и не может быть удалено” с помощью AesManaged

cout << "Enter the number: ";
int number;
cin >> number;

cin.ignore(256, '\n'); // remaining input characters up to the next newline character
                       // are ignored

cout << "Enter names: ";
string names;
getline(cin, names);
29
задан AviD 2 March 2009 в 23:44
поделиться

4 ответа

Прием должен использовать MemoryStream.ToArray(). Я также изменил Ваш код так, чтобы он использовал CryptoStream для Записи, и в шифровании и в дешифровании. И Вы не должны звонить CryptoStream.FlushFinalBlock() явно, потому что у Вас есть он в using() оператор, и тот сброс произойдет на Dispose(). Следующие работы для меня.

byte[] rawPlaintext = System.Text.Encoding.Unicode.GetBytes("This is all clear now!");

using (Aes aes = new AesManaged())
{
    aes.Padding = PaddingMode.PKCS7;
    aes.KeySize = 128;          // in bits
    aes.Key = new byte[128/8];  // 16 bytes for 128 bit encryption
    aes.IV = new byte[128/8];   // AES needs a 16-byte IV
    // Should set Key and IV here.  Good approach: derive them from 
    // a password via Cryptography.Rfc2898DeriveBytes 
    byte[] cipherText= null;
    byte[] plainText= null;

    using (MemoryStream ms = new MemoryStream())
    {
        using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
        {
            cs.Write(rawPlaintext, 0, rawPlaintext.Length);
        }

        cipherText= ms.ToArray();
    }


    using (MemoryStream ms = new MemoryStream())
    {
        using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write))
        {
            cs.Write(cipherText, 0, cipherText.Length);
        }

        plainText = ms.ToArray();
    }
    string s = System.Text.Encoding.Unicode.GetString(plainText);
    Console.WriteLine(s);
}

кроме того, я предполагаю, что Вы знаете, что захотите явно установить Режим из экземпляра AesManaged и использование Система. Безопасность. Криптография. Rfc2898DeriveBytes для получения Ключа и IV от пароля и соли.

см. также:
- AesManaged

50
ответ дан Patrick D'Souza 14 October 2019 в 07:18
поделиться

Никто не ответил, что фактически MemoryStream.GetBuffer возвращает выделенный буфер, а не реальные данные в этом буфере. В этом случае он возвращает 256-байтовый буфер, в то время как он содержит только 32 байта зашифрованных данных.

1
ответ дан Nickolay Olshevsky 14 October 2019 в 07:18
поделиться

байт [] rawData = новый байт [rawPlaintext. Длина];

необходимо считать длину буфера, который, вероятно, включает необходимое дополнение (IIRC, несколько лет).

1
ответ дан leppie 14 October 2019 в 07:18
поделиться

Это исключение может быть вызвано несоответствием любого из нескольких параметров шифрования.

Я использовал интерфейс Security.Cryptography.Debug для отслеживания всех параметров, используемых в методах шифрования / дешифрования.

Наконец, я обнаружил, что моя проблема заключалась в том, что я установил свойство KeySize после установки Key, заставляя класс генерировать случайный ключ и не используя ключ, который я изначально установил.

24
ответ дан tanascius 14 October 2019 в 07:18
поделиться
Другие вопросы по тегам:

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