【发布时间】:2017-04-23 05:53:53
【问题描述】:
我想为我的应用程序制作一些安全容器,这是地图:
我现在完成了打开/保存代码,并对其进行了测试,但是,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;
}
}
}
【问题讨论】:
-
5 没有意义,它不是文件中的偏移量。改为传递 0,这样您就可以在 IV 中写入所有字节。喜欢 CryptoHandler.IV.Length 而不是 16。21 又错了。
标签: c# aes filestream