Ошибка дешифрования DES «Плохие данные» в C # при закрытии криптопотока - PullRequest
1 голос
/ 24 мая 2011

Я пытаюсь расшифровать зашифрованный массив байтов (зашифровать с помощью K1 и расшифровать с помощью K2).Visual Studio выдает исключение «ПЛОХИЕ ДАННЫЕ», когда пытается закрыть мой криптопоток

. Вот мой фрагмент кода для дешифрования DES

public Byte[] Decrypt(Byte[] cipherData, Byte[] key, Byte[] iv)
    {
        MemoryStream ms = new MemoryStream();
        DES mDES = DES.Create();
        mDES.Key = key;
        mDES.IV = iv;
        mDES.Padding = PaddingMode.PKCS7;
        CryptoStream cs = new CryptoStream(ms, mDES.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(cipherData, 0, cipherData.Length);
        cs.Close();
        Byte[] decryptedData = ms.ToArray();
        return decryptedData;
    }

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

Добавлено: В соответствии с рекомендациями Грега Б. я выкладываю здесь свой фрагмент кода шифрования.Вывод шифрования - это ввод дешифрования (два разных ключа)

        public Byte[] Decrypt(Byte[] cipherData, Byte[] key, Byte[] iv)
    {
        MemoryStream ms = new MemoryStream();
        DES mDES = DES.Create();
        mDES.Key = key;
        mDES.IV = iv;
        mDES.Padding = PaddingMode.PKCS7;
        CryptoStream cs = new CryptoStream(ms, mDES.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(cipherData, 0, cipherData.Length);
        cs.Close();
        Byte[] decryptedData = ms.ToArray();
        return decryptedData;
    }

1 Ответ

3 голосов
/ 28 мая 2011

проблема, с которой вы столкнулись, происходит из выбранного режима заполнения.

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

если вы хотите что-то наподобие 3DES с классом DES, используйте PaddingMode NONE для вашего дешифрования и следующий шаг шифрования (так что только первое шифрование или последнее дешифрование использует заполнение)

...