2016-12-08 8 views
0
나는 내 응용 프로그램에 대한 몇 가지 보안 컨테이너를하고 싶습니다

예외, 여기지도이다 : 나는 그러나, 지금 코드를 저장/열기를 완료하고 테스트FileStream.Read()가 ArgumentException이

enter image description here

, ArgumentException이 발생했습니다.

코드는 다음과 같이 실행됩니다.

  1. 암호화되지 않은 사용자 데이터를 포함하기위한 유형 변수 byte[]을 만듭니다.
  2. FileStream 처음 5 바이트에 매직 번호를 씁니다.
  3. RijndaelManaged은 key를 받아들이고 초기화 벡터를 생성합니다.
  4. FileStream 다음 16 바이트에 초기화 벡터를 씁니다. < - 예외가 발생했습니다.
  5. CryptoStream는 22 바이트 데이터로부터 암호화 되 기입 1.
  6. FileStream로부터 변수를 변환.

디버깅 및 그 이유를 발견했습니다. 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, 0, CryptoHandler.IV.Length); //IV Insertion

배열 Stream.Write(CryptoHandler.IV, 5, 16); //IV Insertion

= CryptoHandler.IV (데이터 쓰려)

오프셋 = 0 (는 어레이의 첫번째 바이트부터 물품)

count = CryptoHandler.IV.Length (CryptoHandler.IV의 모든 바이트를 쓰십시오)

오프셋은 배열이 아니라 스트림에 내재되어 있습니다. 쓰기 작업이 완료된 후 스트림 커서는 마지막으로 기록 된 위치에서 대기합니다. MagicNumber를 고려하여 5의 오프셋을 지정했다고 가정합니다. 같은 문제를 추가했을 것입니다. Stream.Write(_Buffer, 21, _Buffer.Length);