2012-03-21 5 views
0

Rijndaelを使用して一部の文字列(実際にはXElementオブジェクトを暗号化する方法)を暗号化しようとしています。しかし、解読するときには、埋め込みが無効であり、削除することができないというメッセージでCryptographicExceptionがスローされます。 私はPaddingModeFlushFinalBlock()の方法などを挙げている解決策についていくつかの記事を検索してきました。 また、FileStreamから直接読み取るとストリームの長さがファイルの長さに設定されるため、パディングの余地がないため、問題の解決方法はわかりません。親切にあなたの提案をしてください。Rijndaelを使用してFileStreamから文字列データを復号しようとしたときにパディングエラーが発生しました

 var root = new XElement("Users", 
          new XElement("User", new XAttribute("id", "1"), "User1"), 
          new XElement("User", new XAttribute("id", "2"), "User2")); 
     var r = Rijndael.Create(); 
     r.Padding = PaddingMode.PKCS7; 
     using (var fs = File.Open(@"D:\user.xml", FileMode.Create)) 
     using (var cs = new CryptoStream(fs, r.CreateEncryptor(r.Key, r.IV), CryptoStreamMode.Write)) 
     using (var sw = new StreamWriter(cs, Encoding.Unicode)) 
     { 
      sw.Write(root.ToString()); 
      cs.FlushFinalBlock(); 
     } 

     var r = Rijndael.Create(); 
     r.Padding = PaddingMode.PKCS7; 
     using(var fs = File.Open(@"D:\user.xml", FileMode.Open, FileAccess.ReadWrite)) 
     using(var cs = new CryptoStream(fs, r.CreateDecryptor(r.Key, r.IV), CryptoStreamMode.Read)) 
     using (var sr = new StreamReader(cs, Encoding.Unicode)) 
     { 
      var root = sr.ReadToEnd(); 
     } 
+0

'FlushFinalBlock()'を試してください –

+0

試しました。問題は残っています。 –

答えて

0

私はあなたにもストリームライターflushが必要と信じています。 メモ:実際にランダムIVを使用していることを確認してください(ここでやっています)。時には人々がこのようなコードを書いて、後でファイルを解読するためにそれを使うと、彼らはIVを持っていないことに気がつくので、彼らはただそれをハードコードします。ファイルに追加するだけです。

{ 
     sw.Write(root.ToString()); 
     cs.FlushFinalBlock(); 
     sw.flush(); 
    } 
+0

sw.flush()を追加しましたが、まだ動作していません... –

関連する問題