2016-07-07 2 views
1

난 파일 100 MB 이상의 작게 ecnrypt 수 있지만 어레이의 메모리 사용량 증가 X7 및 프로그램 패스 ​​2기가바이트 메모리 제한VB.Net는 암호화 파일 증가 바이트 배열 X7

예 Test.rar 크기 1백메가바이트

을 행 파일 바이트를 운반 암호화 한 후

프로그램 7백메가바이트 램을 사용하고

' AesCryptoServiceProvider 


    Dim aes As New AesCryptoServiceProvider() 
    aes.BlockSize = 128 
    aes.KeySize = 256 


    aes.Key = Encoding.UTF8.GetBytes("12K2K2K2K2K2K2K212K2K2K2K2K2K2K2") 
    aes.IV = Encoding.UTF8.GetBytes("12K2K2K2K2K2K2K2") 

    aes.Mode = CipherMode.CBC 
    aes.Padding = PaddingMode.PKCS7 

    ' Convert string to byte array 
    Dim src As Byte() = My.Computer.FileSystem.ReadAllBytes("C:\TestFolder\Test.rar") 


    ' encryption 
    Using enc As ICryptoTransform = aes.CreateEncryptor() 
     Dim dest As Byte() = enc.TransformFinalBlock(src, 0, src.Length) 










     Dim ms As New MemoryStream 'Create New Memory Space 

     Dim cs As New CryptoStream(ms, aes.CreateEncryptor, mode:=CryptoStreamMode.Write) 'Write İn Ms 
     cs.Write(dest, 0, dest.Length) 
     cs.Close() 

     Dim ss() As Byte = ms.ToArray 




     My.Computer.FileSystem.WriteAllBytes("C:\TestFolder\TestCopy.rar", ss, True) 



     ms.Dispose() 
     cs.Dispose() 
     src = Nothing 
     ss = Nothing 
     dest = Nothing 
+1

상수 IV는 각 메시지마다 다른 IV 점을 완전히 놓칩니다. 또한 키는 바이너리이므로 UTF-8을 사용하여 인코딩 할 수 없습니다 (16 진수 및 64 진수). – CodesInChaos

답변

2

음 그래, 당신이 읽을 수있는 300메가바이트 이상 결과 SystemOutOfMemory 예외를 통과하는 경우 전체 파일을 메모리에 저장 한 다음 모든 것을 한 번에 암호화 할 수 있습니다. 그렇게 할 필요는 없습니다. 스트리밍 방식으로 모든 것을 할 수 있습니다. 두 번째 스트림이

그럼 그냥 Stream.CopyTo를 사용하는 것이 디스크

  • 에 암호화 스트림 포장을 작성하는
  • 하나의 스트림에서 입력을 읽어

    • 한 스트림 :

      당신은 세 개의 스트림을 필요 입력 스트림에서 암호화 스트림으로 복사 할 수 있습니다.

      C#에서 그 결과는 다음과 같습니다

      using (var input = File.OpenRead(@"C:\TestFolder\Test.rar")) 
      using (var output = File.Create(@"C:\TestFolder\Test.rar.encrypted")) 
      using (var crypto = New CryptoStream(output, aes.CreateEncryptor(), CryptoStreamMode.Write)) 
      { 
          input.CopyTo(crypto); 
      } 
      

      이 희망하면 충분히 쉽게 VB 해당 변환 할 수 있습니다.

  • +0

    IV를 저장해야합니다. 그렇지 않으면 첫 번째 블록을 해독 할 수 없습니다. – CodesInChaos

    +0

    @CodesInChaos : 물론, IMO는 질문의 범위를 벗어나므로 메모리에 너무 많은 데이터가 저장되는 것을 피하는 것이 좋습니다. –

    +0

    은 파일 바이트가 응용 프로그램 메모리를 통과하고 x7이 증가하기 때문에 암호 스트림을 복사 할 수 없습니다. – MuzluPide