[英]FileStream.Read() Throws ArgumentException
我想为我的应用程序创建一些安全的容器,这是地图:
我现在完成打开/保存代码并进行了测试,但是引发了ArgumentException
。
该代码将像这样运行。
byte[]
类型变量以包含未加密的用户数据。 FileStream
将幻数写入前5个字节。 RijndaelManaged
接受密钥,并生成初始化向量。 FileStream
将初始化向量写入接下来的16个字节。 <-引发异常! CryptoStream
从1转换变量。 FileStream
从第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;
}
}
}
替换Stream.Write(CryptoHandler.IV, 5, 16); //IV Insertion
Stream.Write(CryptoHandler.IV, 5, 16); //IV Insertion
使用Stream.Write(CryptoHandler.IV, 0, CryptoHandler.IV.Length); //IV Insertion
Stream.Write(CryptoHandler.IV, 0, CryptoHandler.IV.Length); //IV Insertion
array = CryptoHandler.IV(要写入的数据)
offset = 0(您从数组的第一个字节开始写入)
count = CryptoHandler.IV.Length(您从CryptoHandler.IV写入所有字节)
请注意,偏移量是数组固有的,而不是Stream固有的。 成功执行写入操作后,流游标将等待最后写入的位置。 我想您指定了5的偏移量来考虑MagicNumber? 您可能会对Stream.Write(_Buffer, 21, _Buffer.Length);
添加相同的问题Stream.Write(_Buffer, 21, _Buffer.Length);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.