2012-04-27 45 views
1

我試圖解密一個加密的文本文件時出現了一個奇怪的問題。基本上.txt文件的內容是「這是一個測試:)」,當解密輸出是「這是一個測試:」,發現缺少的「)」。MemoryStream和解密文本文件

當我一次解密一個字節的文件時(while循環),情況並非如此,但當使用下面的代碼時,它似乎有上述問題。

private static void DecryptFile(string inputFile, string outputFile, string skey) 
     { 
      RijndaelManaged aes = new RijndaelManaged(); 

      try 
      { 
       byte[] key = ASCIIEncoding.UTF8.GetBytes(skey); 
       byte[] file = File.ReadAllBytes(inputFile); 

       using (MemoryStream ms = new MemoryStream()) 
       { 
         using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(key, key), CryptoStreamMode.Write)) 
         { 
          cs.Write(file, 0, file.Length); 

          File.WriteAllBytes(outputFile, ms.ToArray()); 
          aes.Clear(); 
         } 
       } 

      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       aes.Clear(); 
      } 
     } 

請原諒sl code的代碼,它只是用於測試目的。

+1

請同時顯示加密代碼。 – phoog 2012-04-27 16:08:02

回答

3

分組密碼CryptoStream只能以固定塊大小加密或解密內容。你沒有給它足夠的內容來填補最後的塊,所以它正在等待更多。這部分不完整的街區正在迷路。

您需要在您的CryptoStream上調用FlushFinalBlock或者不在using之內,以便它自動關閉它。然後你的MemoryStream應該包含缺少的字符。

請注意,解密您的輸出時,現在將四捨五入到一個完整的塊,即您將得到額外的零填充數據的末尾。

+0

調用cs.FlushFinalBlock();確實解決了這個問題,謝謝。 – denied66 2012-04-27 16:20:14