C # «Bad Data» исключение при расшифровке зашифрованного файла - PullRequest
2 голосов
/ 08 апреля 2011

Эй, я очень новичок в шифровании и дешифровании, или даже в языке c #, если честно. По сути, у меня есть чат-сервер tcp, который «сохраняет» логи и шифрует текстовый файл. Вот как я шифрую (на основе примера MSDN):

public static void EncryptFile(string strInputFileName, string strOutputFileName, string strKey)
{
    FileStream fsIn = new FileStream(strInputFileName, FileMode.Open, FileAccess.Read);
    FileStream fsOut = new FileStream(strOutputFileName, FileMode.Create, FileAccess.Write);

    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    des.Key = ASCIIEncoding.ASCII.GetBytes(strKey);
    des.IV = ASCIIEncoding.ASCII.GetBytes(strKey);


    ICryptoTransform desencrypt = des.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsOut, desencrypt, CryptoStreamMode.Write);

    byte[] byteArrayInput = new byte[fsIn.Length - 1];
    fsIn.Read(byteArrayInput, 0, byteArrayInput.Length);
    cryptostream.Write(byteArrayInput, 0, byteArrayInput.Length);

    fsIn.Close();
    fsOut.Close();
}

Метод успеха полностью шифрует файлы. Это мой метод расшифровки:

public static void DecryptFile(string strInputFileName, string strOutputFileName, string strKey)
{
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    des.Key = ASCIIEncoding.ASCII.GetBytes(strKey);
    des.IV = ASCIIEncoding.ASCII.GetBytes(strKey);

    byte[] te = new byte[1024];
    FileStream fsRead = new FileStream(strInputFileName, FileMode.Open, FileAccess.Read);
    ICryptoTransform desdecrypt = des.CreateDecryptor();          

    CryptoStream cryptostream = new CryptoStream(fsRead, desdecrypt, CryptoStreamMode.Read);
    StreamWriter fsDecrypted = new StreamWriter(strOutputFileName);            

    fsDecrypted.Write(new StreamReader(cryptostream).ReadToEnd());//This is where the "Bad Data" occurs.
    fsDecrypted.Flush();
    fsDecrypted.Close();
    fsRead.Close();
}

И когда я проверяю объект криптопотока, он говорит, что он выдал исключение «Поток не поддерживает поиск».

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

4 голосов
/ 08 апреля 2011

Здесь:

    cryptostream.Write(byteArrayInput, 0, byteArrayInput.Length);
    fsIn.Close();
    fsOut.Close();

Вы закрываете fsOut напрямую, без закрытия cryptostream.Это означает, что криптопоток не получает возможности сбрасывать какие-либо окончательные блоки и т. Д.

Дополнительно:

  • Используйте операторы using вместо ручного вызова Close или Dispose
  • В данный момент вы звоните Read один раз и предполагаете, что он прочитает все данные - вы не проверяете возвращаемое значение.(Вы также удаляете последний байт входного файла по какой-то причине ... почему?) В общем, вы должны выполнить циклический цикл, считывая в буфер и затем записывая сколько бы вы ни прочитали байтов, пока метод Read не вернет 0Если вы используете .NET 4, Stream.CopyTo - ваш друг.
2 голосов
/ 02 июня 2016
  objCryptStream.CopyTo(stream);

у меня сработало, полный код

 public static string DecryptString(string encriptedText, string key)
   {

       try
       {


           //Convert the text into bytest
           byte[] ecriptedBytes = System.Convert.FromBase64String(encriptedText);

           // Create a memory stream to the passed buffer
           MemoryStream objMemStream = new MemoryStream(ecriptedBytes);

           //Set the legal keys and initialization verctors
           objCrptoService.Key = GetLegalsecretKey(key);
           objCrptoService.IV = GetLegalIV();

           // Create a CryptoStream using the memory stream and the cryptographic service provider  version
           // of the Data Encryption stanadard algorithm key
           CryptoStream objCryptStream = new CryptoStream(objMemStream, objCrptoService.CreateDecryptor(), CryptoStreamMode.Read);

           // Create a StreamReader for reading the stream.
           //StreamReader objstreamReader = new StreamReader(objCryptStream);
           MemoryStream stream = new MemoryStream();
           objCryptStream.CopyTo(stream);
           stream.Position = 0;
           StreamReader R = new StreamReader(stream);
           string outputText = R.ReadToEnd();

           // Close the streams.
           R.Close();
           objCryptStream.Close();
           objMemStream.Close();

           return outputText;
       }
       catch (Exception exc)
       {
           return "";
       }
   }
0 голосов
/ 12 июля 2018

Что исправило мою проблему, вызывая FlushFinalBlock в криптопотоке, при создании файла

                CryptoStream cryptostream = new CryptoStream(memoryStream, this._encryptionKeyHelper.Encryptor(), CryptoStreamMode.Write);

            xmlser.Serialize(cryptostream, builderObject);

            cryptostream.FlushFinalBlock();
...