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);
Прием должен использовать 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
Никто не ответил, что фактически MemoryStream.GetBuffer возвращает выделенный буфер, а не реальные данные в этом буфере. В этом случае он возвращает 256-байтовый буфер, в то время как он содержит только 32 байта зашифрованных данных.
байт [] rawData = новый байт [rawPlaintext. Длина];
необходимо считать длину буфера, который, вероятно, включает необходимое дополнение (IIRC, несколько лет).
Это исключение может быть вызвано несоответствием любого из нескольких параметров шифрования.
Я использовал интерфейс Security.Cryptography.Debug для отслеживания всех параметров, используемых в методах шифрования / дешифрования.
Наконец, я обнаружил, что моя проблема заключалась в том, что я установил свойство KeySize
после установки Key
, заставляя класс генерировать случайный ключ и не используя ключ, который я изначально установил.