我想作一些安全容器我的應用程序,並且這裏的地圖:但是FileStream.Read()拋出ArgumentException的
我說完打開/保存代碼,現在,測試它,拋出了ArgumentException
。
代碼將以這種方式運行。
- 創建
byte[]
用於包含未加密的用戶數據的類型變量。 FileStream
將Magic Number寫入前5個字節。RijndaelManaged
接受密鑰,並生成初始化向量。FileStream
將初始化向量寫入下16個字節。 < - 異常拋出!CryptoStream
從1FileStream
變換可變從第22字節的寫入數據加密後。
調試,我找到了原因FileStream.Read()
已被拋出異常。並且消息是:
偏移量和長度超出了數組的邊界,或者計數大於索引到源集合末尾的元素數。
我試圖設置流的長度爲(用戶數據)+ 21,但它不起作用。我附上保存文件的完整代碼,我希望這個問題能夠解決。
謝謝!
private bool SaveFile(string FilePath, bool IsCrypt)
{
byte[] Data = Encoding.UTF8.GetBytes(WorkspaceList[CurrentIndex]._textbox.Text);
using (var Stream = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
if (IsCrypt)
{
Stream.SetLength(Data.Length + 21); // Tried when I got Exception
Stream.Write(MagicNumber, 0, 5); //Magic Number
using (var CryptoHandler = new RijndaelManaged()) // AES256 Encryption
{
CryptoHandler.BlockSize = 128;
CryptoHandler.KeySize = 256;
CryptoHandler.Padding = PaddingMode.PKCS7;
CryptoHandler.Mode = CipherMode.CBC;
var tempKey = WorkspaceList[CurrentIndex]._cryptkey;
if(tempKey.Length < 32)
{
tempKey.PadRight(32);
}
else if (tempKey.Length > 32)
{
tempKey.Remove(33);
}
CryptoHandler.Key = Encoding.UTF8.GetBytes(WorkspaceList[CurrentIndex]._cryptkey.PadRight(32));
CryptoHandler.GenerateIV();
Stream.Write(CryptoHandler.IV, 5, 16); //IV Insertion *** ArgumentException ***
var CryptoInstance = CryptoHandler.CreateEncryptor(CryptoHandler.Key, CryptoHandler.IV);
using (var MemoryHandler = new MemoryStream())
{
using (var Crypto = new CryptoStream(MemoryHandler, CryptoInstance, CryptoStreamMode.Write))
{
byte[] _Buffer = Data;
Crypto.Read(Data, 0, Data.Length);
_Buffer = MemoryHandler.ToArray();
Stream.Write(_Buffer, 21, _Buffer.Length); // Insert Crypted Data
Stream.Close();
return true;
}
}
}
}
else
{
Stream.Write(Data, 0, Data.Length);
Stream.Close();
return true;
}
}
}
5沒有任何意義,它不是文件中的偏移量。通過0代替,所以你會寫在IV中的所有字節。青睞CryptoHandler.IV.Length而不是16,21日再次出錯。 –