1

他のファイル(.exe、.jpg、.imgなど)を読み取り、それをbytes[]トラフに転送しFile.ReadAllBytes()、3DESで暗号化し、.xmlで保存する小さなアプリがありますFile.WriteAllBytes()。同じ逆を行う復号化方法があります。私の問題は、メモリ不足の例外があるよりも、元のファイルが 300MB まですべて正常に動作していることです。この問題を解決する方法はありますか? 1GB を超えるファイルを操作するには? streamreader または cryptostream リーダーとライターを使用するのに役立ちますか?

ファイルの読み取りと暗号化:

 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マスターパスワードです。

4

1 に答える 1

0

最後に、cryptostreamを使用したものがあります。ノートブックで2,7GBのファイルを暗号化するために8分です。Magnusの努力に感謝します、私はあなたのコードも試してみます

暗号化方式

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の方がはるかに速いということです。

于 2012-05-08T01:26:40.070 に答える