2016-07-07 4 views
1

私は、ファイルに100メガバイト以下をecnryptすることができますが、私は、配列のメモリ使用量の増加X7とプログラムパス2ギガバイトのメモリ制限にファイルのバイトを輸送VB.Net暗号化ファイルの増加のバイト配列X7

例Test.rarサイズ100メガバイト

暗号化した後

プログラム700メガバイトのRAMを使用して

' 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を使用することをディスク

  • に暗号ストリームの折り返しを書くこと
  • 一つのストリームからの入力を読み取るために

    • 一つのストリーム:

      は、次の3つのストリームを必要とします入力ストリームから暗号ストリームにコピーする。

      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

    関連する問題