我想为我的应用程序制作一些安全的容器,这是地图:
我现在已经完成了打开/保存代码并对其进行了测试,然而,ArgumentException
被抛出了。
代码将像这样运行。
byte[]
类型变量以包含未加密的用户数据。FileStream
将Magic Number写入前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;
}
}
}
答案 0 :(得分:0)
替换Stream.Write(CryptoHandler.IV, 5, 16); //IV Insertion
使用Stream.Write(CryptoHandler.IV, 0, CryptoHandler.IV.Length); //IV Insertion
array = CryptoHandler.IV(您要编写的数据)
offset = 0(从数组的第一个字节写入)
count = CryptoHandler.IV.Length(你从CryptoHandler.IV写下所有字节)
请注意,偏移是数组固有的,而不是Stream。成功执行Write操作后,流游标将在最后写入的位置等待。我想你指定一个5的偏移量来考虑MagicNumber?
您可能会在Stream.Write(_Buffer, 21, _Buffer.Length);