2016-04-04 2 views
0

Это проект окон. У меня проблема с расшифровкой зашифрованного файла. Он бросает мне исключение:Криптографическое исключение - плохие данные

  • CryptographicException
  • Дополнительная информация: Bad данных.

Вот ссылка на изображение: http://i.imgur.com/aPggrcP.png

Вот код, необходимый для дешифрования:

DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 

OpenFileDialog ofd2 = new OpenFileDialog(); 

private void button4_Click(object sender, EventArgs e) 
{ 
    if (ofd2.ShowDialog() == DialogResult.OK) 
    { 
     richTextBox4.Text = ofd2.SafeFileName; 
    } 
} private void richTextBox4_TextChanged(object sender, EventArgs e){} 

public static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[8 * 1024]; 
    int len; 
    while ((len = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, len); 
    } 
} 

private void dec_Click(object sender, EventArgs e) 
{ 
    string pathK = ofd2.FileName; 

    if (File.Exists(pathK)) 
    { 
     string dirPath = Path.GetDirectoryName(ofd2.FileName); 
     string pathH = dirPath + "/DE" + ofd2.SafeFileName; 

     if (File.Exists(pathH)) 
     { 
      using (FileStream filestream = new FileStream(pathK, FileMode.Open)) 
      { 
       using (CryptoStream stream = new CryptoStream(filestream, des.CreateDecryptor(des.Key, des.IV), CryptoStreamMode.Read)) 
       { 
        using (FileStream fsDecrypted = new FileStream(pathH, FileMode.Open, FileAccess.Write)) 
        { 
         CopyStream(stream, fsDecrypted); 
        } 
       } 
      } 
     } 
     else 
     { 
      using (FileStream filestream = new FileStream(pathK, FileMode.Open)) 
      { 
       using (CryptoStream stream = new CryptoStream(filestream, des.CreateDecryptor(des.Key, des.IV), CryptoStreamMode.Read)) 
       { 
        using (FileStream fsDecrypted = new FileStream(pathH, FileMode.CreateNew, FileAccess.Write)) 
        { 
         CopyStream(stream, fsDecrypted); 
        } 
       } 
      } 
     } 
    } 
    else 
    { 
     decTextBox.Text = "Cannot find encrypted file !"; 
    }   
} private void decTextBox_TextChanged(object sender, EventArgs e){} 

Может кто-нибудь мне помочь?

ответ

1

Из чтения кода вы создаете экземпляр var des = new DESCryptoServiceProvider(), который генерирует случайный ключ и IV и пытается передать случайно сгенерированные des.Key и des.IV в CryptoStream. Проблема в том, что ключ и IV генерируются случайным образом при использовании используемого конструктора. Вам нужно использовать соответствующие ключи и IV, которые использовались для шифрования байтов.

Так что в какой-то момент вы должны иметь такой код:

des.Key = theKeyUsedToEncrypt; 
des.IV = theIVUsedToEncrypt; 

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

+0

Спасибо. Вы решили мою проблему. – klemsi123