2012-05-05 7 views
1

다른 파일 (예 : .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