Ошибка CryptoStream Заполнение недопустимо и не может быть удалено

У меня проблема с моим кодом. Проблема возникает в функции Decryptor.

FlushFinalBlock throw "Padding недействителен и не может быть удален"

В функции Decryptor я получаю myData длиной 6048, когда строка cryptoStream.Write(myData, 0, myData.Length); сделано, я получаю длину 6032 в memoryStream и затем строку cryptoStream.FlushFinalBlock(); выдает ошибку "Заполнение недопустимо и не может быть удалено".

Как вы можете видеть, я использую Padding = PaddingMode.PKCS7;

static RijndaelManaged rmCrypto;
static object lockCryptoStream = new object();

public static void SetrmCrypto()
{
    rmCrypto = new RijndaelManaged();
    rmCrypto.Padding = PaddingMode.PKCS7;
    rmCrypto.KeySize = 128;
    rmCrypto.Key = new ASCIIEncoding().GetBytes("xxxxxxxxxxxxxxxx");
    rmCrypto.IV = new ASCIIEncoding().GetBytes("yyyyyyyyyyyyyyyy");
}

public static byte[] Encryptor(byte[] myData)
{
    lock (lockCryptoStream)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var cryptoStream = new CryptoStream(memoryStream, rmCrypto.CreateEncryptor(rmCrypto.Key, rmCrypto.IV), CryptoStreamMode.Write))
            {
                cryptoStream.Write(myData, 0, myData.Length);
                cryptoStream.FlushFinalBlock();
                cryptoStream.Close();
                return memoryStream.ToArray();
            }
        }
    }
}

public static byte[] Decryptor(byte[] myData)
{
    lock (lockCryptoStream)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var cryptoStream = new CryptoStream(memoryStream, rmCrypto.CreateDecryptor(rmCrypto.Key, rmCrypto.IV), CryptoStreamMode.Write))
            {
                cryptoStream.Write(myData, 0, myData.Length);
                cryptoStream.FlushFinalBlock();
                cryptoStream.Close();
                return memoryStream.ToArray();
            }
        }
    }
}

Encryptor используется на сервере, а данные отправляются через UDP. Клиент использует Decryptor, чем расшифровывает данные. Код работает для большинства пакетов и, допустим, работает в течение нескольких часов, но через некоторое время я получаю эту ошибку на Flushing.

1 ответ

Верхний код прекрасно работает. проблема в моем случае была на сервере, который был набран в C++, и у меня были проблемы с этим шифрованием (проблемы с потоками при получении и отправке)

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