다른 파일 (예 : .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
는 일부 자비를 위해기도 마스터 비밀번호.
파일을 메모리로 읽어 들이지 말고 그냥 'FileStream'을 암호화 방법 – Magnus
에 전달하십시오. 여기서 정신적 인 실수는 암호화 공급자가 스트림이라고 가정한다는 것입니다. 그것은 아닙니다. 바이트를 변환하는 알고리즘 일뿐입니다. 당신은 CrytoStream 클래스를 사용하지 않았습니다. MSDN 예제를 따르십시오 : http://msdn.microsoft.com/en-us/library/system.security.cryptography.tripledescryptoserviceprovider.aspx –
모든 예외를 잡는 것 같습니다. 어떻게 그것이 OutOfMemoryException이라는 것을 확신 할 수 있습니까? –