2016-04-04 20 views
0

これはWindowsフォームプロジェクトです。私は暗号化されたファイルの解読に問題があります。暗号例外 - 不正なデータ

  • CryptographicException
  • 追加情報:不良データそれは私に例外をスローします。ここで

画像リンクされています 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

あなたのコードを読むと、ランダムなKeyとIVを生成し、ランダムに生成されたdes.Keyとdes.IVをCryptoStreamに渡そうとするvar des = new DESCryptoServiceProvider()の新しいインスタンスをインスタンス化しているようです。問題は、あなたが使用しているコンストラクタでKeyとIVがランダムに生成されるということです。バイトを暗号化するために使用された一致するKeyとIVを使用する必要があります。ランダムに生成されたキーとIVを暗号化するために使用したものと一致しないため、復号化が失敗しているので、あなたが悪いデータ例外を取得している

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

だから、いくつかの点で、あなたのようなコードを持っている必要があります。

+0

ありがとうございます。あなたは私の問題を解決しました。 – klemsi123

関連する問題