2014-11-13 4 views
-1

AES로 바이트를 암호화하려고합니다. 그러나, 내가 얻는 결과는 정말로 이상하다. 여기 내 기능 (암호화 및 암호 해독)입니다. 내가 뭔가 잘못하고 있는거야? 당신은 당신이 암호화 된 버퍼로 읽어 CryptoStream을 읽을 때AES 암호화 - 바이트 암호화

public static byte[] encryptStream(byte[] plain, byte[] Key, byte[] IV) 
    { 
     byte[] encrypted; ; 
     using (MemoryStream mstream = new MemoryStream()) 
     { 
      using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider()) 
      { 
       using (CryptoStream cryptoStream = new CryptoStream(mstream, 
        aesProvider.CreateEncryptor(Key, IV), CryptoStreamMode.Write)) 
       { 
        cryptoStream.Write(plain, 0, plain.Length); 
       } 

      } 
      encrypted = mstream.ToArray(); 
     } 
     return encrypted; 
    } 

public static byte[] decryptStream(byte[] encrypted, byte[] Key, byte[] IV) 
    { 
     byte[] plain; 
     using (MemoryStream mStream = new MemoryStream()) 
     { 
      using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider()) 
      { 
       using (CryptoStream cryptoStream = new CryptoStream(mStream, 
        aesProvider.CreateDecryptor(Key, IV), CryptoStreamMode.Read)) 
       { 
        cryptoStream.Read(encrypted, 0, encrypted.Length); 
       } 
      } 
      plain = mStream.ToArray(); 
     } 
     return plain; 
    } 

답변

1

문제는, 당신의 decryptStream() 방법입니다. Read()으로 전화를 걸면 이미 메모리 스트림으로 래핑 했으므로 암호화 된 버퍼에서 읽는 중입니다. 함께 연결 한 새로운 버퍼를 해독 된 바이트로 읽으려고합니다.

public static byte[] decryptStream(byte[] encrypted, byte[] Key, byte[] IV) 
    { 
     byte[] plain; 
     byte[] buffer = new byte[32768]; 
     int totalRead = 0; 
     MemoryStream plainStream = new MemoryStream(); 
     using (MemoryStream mStream = new MemoryStream(encrypted)) 
     { 
      using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider()) 
      { 
       using (CryptoStream cryptoStream = new CryptoStream(mStream, 
        aesProvider.CreateDecryptor(Key, IV), CryptoStreamMode.Read)) 
       { 
        while (true) 
        { 
         int read = cryptoStream.Read(buffer, 0, encrypted.Length); 

         if (read == 0) 
          break; 
         else 
          plainStream.Write(buffer, totalRead, read); 

         totalRead += read; 
        } 

       } 
      } 

      plain = plainStream.ToArray(); 
     } 
     return plain; 
    } 
+0

고맙습니다. 그것은 효과가 있었다. 나는 어리석은 실수라고 생각한다. :) –