在花費時間閱讀本文之前,請參閱下面的自我回答。問題是無效輸入。索引超出了數組的範圍。 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
你的關鍵和IV是非常薄弱的。查找PasswordDeriveBytes – 2012-01-12 14:12:53
'ASCIIEncoding.UTF8'是可怕的風格。使用'Encoding.UTF8'。 – CodesInChaos 2012-01-14 13:00:12
你也應該遵循@ Henk的建議。您從密碼獲取密鑰的方式很糟糕。使用'Rfc2898DeriveBytes'類(它是Henk提到的類的繼承者)。 – CodesInChaos 2012-01-14 13:06:19