【问题标题】:FileStream.Read() Throws ArgumentExceptionFileStream.Read() 引发 ArgumentException
【发布时间】:2017-04-23 05:53:53
【问题描述】:

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

我现在完成了打开/保存代码,并对其进行了测试,但是,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;
            }
        }
    }

【问题讨论】:

  • 5 没有意义,它不是文件中的偏移量。改为传递 0,这样您就可以在 IV 中写入所有字节。喜欢 CryptoHandler.IV.Length 而不是 16。21 又错了。

标签: c# aes filestream


【解决方案1】:

替换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 写入所有字节)

请注意,偏移量是数组所固有的,而不是流所固有的。写入操作成功后,流游标在最后写入的位置等待。我想您指定偏移量为 5 以考虑 MagicNumber? 你会用Stream.Write(_Buffer, 21, _Buffer.Length);添加同样的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    相关资源
    最近更新 更多