2012-03-22 34 views
0

に書き込むのと矛盾するので、問題は簡単です。私はいくつかのテキストを暗号化し、配列のバイトのようなファイルに書き込みたいと私はファイルの内容を読む必要がありますし、文字列に配列のバイトを解読する別のメソッドにparametrのようになります。 メソッド暗号化と復号化は正常に動作しますが、FILEのバイト配列を使用すると例外がスローされます。バイト配列の読み込みは、バイト配列をファイル

private static byte[] EncryptString(string text,byte[] key,byte[] vektor) 
    { 
     byte[] array=null; 
     // Check arguments. 
     if (text == null || text.Length <= 0) 
      throw new ArgumentNullException("plainText"); 
     if (key == null || key.Length <= 0) 
      throw new ArgumentNullException("Key"); 
     if (vektor == null || vektor.Length <= 0) 
      throw new ArgumentNullException("Vektor"); 
     try 
     { 
      using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider()) 
      { 
       provider.Key = key; 
       provider.IV = vektor; 
       using (MemoryStream memory = new MemoryStream()) 
       { 
        using (CryptoStream crypto = new CryptoStream(memory, provider.CreateEncryptor(provider.Key, provider.IV), CryptoStreamMode.Write)) 
        { 
         using (StreamWriter writer = new StreamWriter(crypto)) 
         { 
          writer.WriteLine(text); 
         } 
        } 
        array = memory.ToArray(); 
       } 
      } 
     } 
     catch (ArgumentNullException e) 
     { 
      Console.WriteLine("Error in EncryptString {0}", e.Message); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error in EncryptString {0}", e.Message); 
     } 
     return array; 
    } 

文字列

private static string DecryptByte(byte[] text, byte[] key, byte[] vektor) 
    { 
     string result = null; 
     // Check arguments. 
     if (text == null || text.Length <= 0) 
      throw new ArgumentNullException("plainText"); 
     if (key == null || key.Length <= 0) 
      throw new ArgumentNullException("Key"); 
     if (vektor == null || vektor.Length <= 0) 
      throw new ArgumentNullException("Key"); 
     try 
     { 
      using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider()) 
      { 
       provider.Key=key; 
       provider.IV=vektor; 
       using (MemoryStream memory = new MemoryStream(text)) 
       { 
        using (CryptoStream crypto = new CryptoStream(memory, provider.CreateDecryptor(provider.Key, provider.IV), CryptoStreamMode.Read)) 
        { 
         using (StreamReader read = new StreamReader(crypto)) 
         { 
          result=read.ReadToEnd(); 
         } 
        } 
       } 
      } 
     } 
     catch(Exception e) 
     { 
      Console.WriteLine("Error in DecryptByte:{0}"+e.Message); 
     } 
     return result; 
    } 

この方法Ecnryptバイト配列まあ、私は暗号化テキストを保存して、ボタンが

private void buttonDecrypt_Click(object sender, RoutedEventArgs e) 
    { 
     byte[] text=null,helper=null; 
     string result = null; 
     try 
     { 
      using (FileStream filestream = File.OpenRead(path)) 
      { 
       helper = new byte[filestream.Length]; 
       filestream.Read(helper, 0, (int)filestream.Length); 
      } 
        using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider()) 
        { 
         result = DecryptByte(helper, provider.Key, provider.IV); 
        } 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine("Error v ButtonDecrypt.{0}_____{1}",ex.Message,ex.Data); 
     } 
    } 

を押されたときにそのように私の問題は、私からの読み取り、そのデータでありますファイルは同じではなく、DecryptByte例外がスローされます。私たちを手伝ってくれますか? EDIT yeah例外メッセージが無効です。

+4

(ももちろん解読に必要な)暗号化されたバイト数で正しいブロックサイズを確保する何(正確に)例外だし、コードのどの行がそれを投げていますか?また、あなたのコードはちょっと混乱しています。実際には、GUIとは別に独自のメソッドに読み書きコードを抽出する必要があります。責任を分かち合うためにコードをリファクタリングすれば、この種の問題をデバッグするのに多くの手助けができます。 – tomfanning

+0

例外の内容を教えてください。 –

+0

私は賭けました!パディングは無効で、削除することはできません! – Steve

答えて

0

あなたのbuttonDecrypt_Clickのコードは、DecryptorのKeyとIVプロパティを初期化しません。
これがあなたの例外の原因であると思われます。

さらに、暗号化と復号化の方法には別の問題があると思います。 DESCryptoServiceProviderは、SymmetricAlgorithmのラッパーです。つまり、同じサイズのブロックでバイトを暗号化します。したがって、入力データはブロックサイズの倍数でなければなりません。これはいつも起こることはありません。その後、paddingを使用する必要があります。

provider.Padding = PaddingMode.PKCS7; 

+0

プロパティを初期化する必要はありません。 MEは、このコードでうまく動作します。(DESCryptoServiceProvider = new DESCryptoServiceProvider()) { byte = EncryptString(textik、prov.Key、prov.IV); テキスト= DecryptByte(bajt、prov.Key、prov.IV); } 'テキストは暗号化する前と同じです。ですから、ファイルからデータを書き込んだり読み込んだりするときに間違いが起きます。 –

+0

私は例外を複製しようとしましたが、確かに同じ例外があります。しかし、問題は私がDESCriptoServiceProviderの2つの異なるインスタンスを使用したことでした。これらの2つの尺度は、異なるキーおよびIV値を含む。つまり、同じインスタンスで暗号化してから解読すると(以前のコメントのように)例外はありませんが、別の2つのDESCryptoServiceProvider(おそらく2つの異なるbutton_clickイベント)を作成すると、解読できなくなりますファイルは最初のインスタンスで暗号化されます。 – Steve

+0

ああ私の神様、だから愚かな間違いと私は2日間これを解決しようとしました。大変ありがとうと思います。 –

関連する問題