2016-12-08 81 views
0

我想作一些安全容器我的應用程序,並且這裏的地圖:但是FileStream.Read()拋出ArgumentException的

enter image description here

我說完打開/保存代碼,現在,測試它,拋出了ArgumentException

代碼將以這種方式運行。

  1. 創建byte[]用於包含未加密的用戶數據的類型變量。
  2. FileStream將Magic Number寫入前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; 
      } 
     } 
    } 
+0

5沒有任何意義,它不是文件中的偏移量。通過0代替,所以你會寫在IV中的所有字節。青睞CryptoHandler.IV.Length而不是16,21日再次出錯。 –

回答

0

替換Stream.Write(CryptoHandler.IV, 5, 16); //IV Insertion

隨着Stream.Write(CryptoHandler.IV, 0, CryptoHandler.IV.Length); //IV Insertion

陣列= CryptoHandler.IV(要寫入數據)

偏移= 0(從陣列的第一個字節寫)

count = CryptoHandler.IV.Length(你從CryptoHandler.IV中寫入所有字節)

請注意,偏移是數組內部的,而不是流。在成功寫入操作之後,流遊標將在最後寫入的位置等待。我想你指定了5的偏移量來考慮MagicNumber? 您應該增加相同的問題Stream.Write(_Buffer, 21, _Buffer.Length);

相關問題