繁体   English   中英

FileStream.Read()引发ArgumentException

[英]FileStream.Read() Throws ArgumentException

我想为我的应用程序创建一些安全的容器,这是地图:

在此处输入图片说明

我现在完成打开/保存代码并进行了测试,但是引发了ArgumentException

该代码将像这样运行。

  1. 创建byte[]类型变量以包含未加密的用户数据。
  2. FileStream将幻数写入前5个字节。
  3. RijndaelManaged接受密钥,并生成初始化向量。
  4. FileStream将初始化向量写入接下来的16个字节。 <-引发异常!
  5. CryptoStream从1转换变量。
  6. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM