2012-01-12 21 views
0

在花費時間閱讀本文之前,請參閱下面的自我回答。問題是無效輸入。索引超出了數組的範圍。 Rijndael加密


當我嘗試解密一些字符串,它拋出這個異常:

" at System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast) 
     at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) 
     at System.Security.Cryptography.CryptoStream.FlushFinalBlock() 
     at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing) 
     at System.IO.Stream.Close() 
     at System.IO.Stream.Dispose() 
     at EBookReader.cryptography.DecryptString(String message, String KeyString, String IVString) in C:\\Users\\XWare\\Documents\\Visual Studio 2008\\Projects\\EBookReader\\EBookReader\\cryptography.cs:line 94" 

在調試它拋出該線路上的異常:

byte[] messageBytes = Convert.FromBase64String(message); 

我覺得這個問題只是出現時,字符串解密太大,因爲當我嘗試加密和解密短字符串,如「你好,我是X-Ware「它工作正常

public static string DecryptString(string message, string KeyString, string IVString) 
    { 
     byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString); 
     byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString); 

     string decrypted = null; 
     RijndaelManaged rj = new RijndaelManaged(); 
     rj.BlockSize = 256; 
     rj.Key = Key; 
     rj.IV = IV; 
     rj.Mode = CipherMode.CBC; 
     rj.Padding = PaddingMode.PKCS7; 
     try 
     { 
      MemoryStream ms = new MemoryStream(); 
      Encoding enc = new ASCIIEncoding(); 
      using (CryptoStream cs = new CryptoStream(ms, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Write)) 
      { 
       byte[] messageBytes = Convert.FromBase64String(message); 
       cs.Write(messageBytes, 0, messageBytes.Length); 
       cs.FlushFinalBlock(); 
      }// This is line 94 
      byte[] encoded = ms.ToArray(); 
      decrypted = enc.GetString(encoded); 

      ms.Close(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("An error occurred: {0}", e.Message); 
     } 
     finally 
     { 
      rj.Clear(); 
     } 

     return decrypted; 
    } 

有什麼建議嗎?

P.S.我寫了一條評論向你展示94行//這是行94

+1

你的關鍵和IV是非常薄弱的​​。查找PasswordDeriveBytes – 2012-01-12 14:12:53

+1

'ASCIIEncoding.UTF8'是可怕的風格。使用'Encoding.UTF8'。 – CodesInChaos 2012-01-14 13:00:12

+1

你也應該遵循@ Henk的建議。您從密碼獲取密鑰的方式很糟糕。使用'Rfc2898DeriveBytes'類(它是Henk提到的類的繼承者)。 – CodesInChaos 2012-01-14 13:06:19

回答

0

的問題是,我通過爲Base64串的字符串是無效的問題,只是在輸入文件,這使得解密不可能

Thanx全部

3

FlushFinalBlock方法只用於刷新最後一個完整或部分字節塊。因此,如果您編寫的單個塊的大小不是正確的方法調用。嘗試在嘗試從內存流中讀取之前簡單地關閉加密流。

要在你的代碼的情況下做到這一點,簡單的刪除行cs.FlushFinalBlock() ...

+0

你能解釋一下這個例子嗎?! – 2012-01-12 14:01:42

+0

重新閱讀您的代碼並編輯我的答案。 – 2012-01-12 14:07:05

+0

我試過你告訴我它不工作...第91行引發異常Convert.FromBase64String(message);當我在打開cryptostream之前放置此行時,它會在Base-64字符串中引發無效字符。請注意,該字符串是在PHP中生成的,但其他字符串解密成功,而其他字符串則不成功。 – 2012-01-14 09:16:24