2012-05-05 37 views
1

私は、他のファイル(ie .exe、.jpg、.imgなど)を読み込み、bytes[]トラフFile.ReadAllBytes()に転送し、3DESで暗号化して保存しますFile.WriteAllBytes()となります。同じ逆を行う方法を解読するよりも。私の問題は、メモリの例外を抱えているよりも300MBのオリジナルファイルがすべて正常に動作していることです。任意の提案どのようにこの問題を解決するには? 1GBを超えるファイルを扱うには?それはstreamreaderまたはcryptostreamリーダーと作家をむしろ使用するのを助けることができますか?File.ReadAllBytes()メモリ不足例外

リーディングと暗号化ファイル:

try 
{ 
    saveFileDialog1.FileName = ""; 
    DialogResult result = openFileDialog1.ShowDialog(); 
    if (result == DialogResult.OK) 
    { 
     byte[] Results; 
     System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 
     fileToEncrypt = File.ReadAllBytes(openFileDialog1.FileName); 
     MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
     byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(textBox1.Text)); 
     TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 
     TDESAlgorithm.Key = TDESKey; 
     TDESAlgorithm.Mode = CipherMode.ECB; 
     TDESAlgorithm.Padding = PaddingMode.PKCS7; 
     ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor(); 
     Results = Encryptor.TransformFinalBlock(fileToEncrypt, 0, fileToEncrypt.Length); 
     saveFileDialog1.FileName = openFileDialog1.SafeFileName; 
     saveFileDialog1.ShowDialog(); 
     if (saveFileDialog1.FileName != "") 
     { 
      File.WriteAllBytes(saveFileDialog1.FileName, Results); 
     } 
     TDESAlgorithm.Clear(); 
     HashProvider.Clear(); 
    } 
} 
catch 
{ 
    MessageBox.Show("Your system has not enough memory.", "", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 

復号化と保存:

try 
{ 
    openFileDialog1.FileName = ""; 
    DialogResult result = openFileDialog1.ShowDialog(); 
    if (result == DialogResult.OK) // Test result. 
    { 
     byte[] Results; 
     System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 
     fileToDecrypt = File.ReadAllBytes(openFileDialog1.FileName); 
     MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
     byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(textBox1.Text)); 
     TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 
     TDESAlgorithm.Key = TDESKey; 
     TDESAlgorithm.Mode = CipherMode.ECB; 
     TDESAlgorithm.Padding = PaddingMode.PKCS7; 
     ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor(); 
     Results = Decryptor.TransformFinalBlock(fileToDecrypt, 0, fileToDecrypt.Length); 
     saveFileDialog1.FileName = Path.GetFileName(openFileDialog1.FileName); 
     saveFileDialog1.ShowDialog(); 
     if (saveFileDialog1.FileName != "") 
     { 
      File.WriteAllBytes(saveFileDialog1.FileName, Results); 
     } 
     TDESAlgorithm.Clear(); 
     HashProvider.Clear(); 
    } 
} 
catch 
{ 
    MessageBox.Show("Master password is wrong", "", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 

私は唯一の趣味コーダだので、私は自分のコード:)

textbox1.Textがあるといくつかの慈悲のために祈りますマスターパスワード。

+15

'FileStream'を暗号化メソッド – Magnus

+1

に渡すだけで、ファイルをメモリに読み込まないでください。ここでは、暗号化プロバイダもストリームであると想定しています。そうではありません、それは単にバイトを変換するアルゴリズムです。あなたはCrytoStreamクラスを使用しませんでした。 MSDNの例に従ってください:http://msdn.microsoft.com/en-us/library/system.security.cryptography.tripledescryptoserviceprovider.aspx –

+0

すべての例外をキャッチしているようです。それがOutOfMemoryExceptionであることをどのように確かめることができますか? –

答えて

0

最後に私はcryptostreamを使って何かを持っています - 私のノートブックで8分、2,7GBのファイルを暗号化してください。 おかげマグナス努力のために、私はあなたのコードをしようとするも

暗号化方式

DialogResult result = openFileDialog1.ShowDialog(); 
     if (result == DialogResult.OK) 
     { 
      saveFileDialog1.FileName = openFileDialog1.SafeFileName; 
      saveFileDialog1.ShowDialog(); 
      FileStream readFile = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read); 
      FileStream writeFile = new FileStream(saveFileDialog1.FileName, FileMode.OpenOrCreate, FileAccess.Write); 
      writeFile.SetLength(0); 

      byte[] storage = new byte[100]; 
      long fileWritten = 0; 
      long totlen = readFile.Length; 
      int bytesToWrite; 

      System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 
      MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
      byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(textBox1.Text)); 
      TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider(); 
      TDES.Key = TDESKey; 
      TDES.Mode = CipherMode.ECB; 
      TDES.Padding = PaddingMode.PKCS7; 
      CryptoStream cryptStream = new CryptoStream(writeFile, TDES.CreateEncryptor(), CryptoStreamMode.Write); 
      while (fileWritten < totlen) 
      { 
       bytesToWrite = readFile.Read(storage, 0, 100); 
       cryptStream.Write(storage, 0, bytesToWrite); 
       fileWritten = fileWritten + bytesToWrite; 

      } 

      cryptStream.Close(); 
      TDES.Clear(); 
      HashProvider.Clear(); 
     } 

は、復号化方法は、代わりにTDES.CreateDecryptor()TDES.CreateEncryptor()を使用して同じです。 File.ReadAllBytes()File.WriteAllBytes()は、ストリームよりファイル300MBの方がはるかに高速です。

+0

サイズ100のバッファは小さく、パフォーマンスを上げるためにバッファを増やします。少なくとも4096。 – Magnus

関連する問題