FileStream.Read()抛出ArgumentException

时间:2016-12-08 04:35:10

标签: c# aes filestream

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

enter image description here

我现在已经完成了打开/保存代码并对其进行了测试,然而,ArgumentException被抛出了。

代码将像这样运行。

  1. 创建byte[]类型变量以包含未加密的用户数据。
  2. FileStream将Magic Number写入前5个字节。
  3. RijndaelManaged接受密钥,并生成初始化向量。
  4. FileStream将初始化向量写入下一个16字节。 < - 抛出异常!
  5. CryptoStream将变量从1转换。
  6. FileStream写入第22个字节的加密数据。
  7. 调试,我发现了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;
                }
            }
        }
    

1 个答案:

答案 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);

中添加相同的问题