加密文件时的内存问题

亨克

我在读取文件并在 C# UWP 中对其进行加密时遇到内存问题。

这是我的代码:

using System;
using System.Text;
using System.IO;
using System.Security.Cryptography;
using Windows.Storage;
using System.Runtime.InteropServices.WindowsRuntime;

public async void encrypt_file(StorageFile file, string key, string pw_salt)
    {
        try
        {
            SymmetricAlgorithm algorithm = Aes.Create();

            DeriveBytes rgb = new Rfc2898DeriveBytes(key, Encoding.Unicode.GetBytes(pw_salt));//create password
            byte[] rgbKey = rgb.GetBytes(algorithm.KeySize >> 3);
            byte[] rgbIV = rgb.GetBytes(algorithm.BlockSize >> 3);

            ICryptoTransform transform = algorithm.CreateEncryptor(rgbKey, rgbIV);//create encrytor/decryptor

            using (MemoryStream memStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(memStream, transform, CryptoStreamMode.Write))
                {
                    byte[] plainContent = (await FileIO.ReadBufferAsync(file)).ToArray();//read bytes
                     cryptoStream.Write(plainContent, 0, plainContent.Length);
                     cryptoStream.FlushFinalBlock();
                    await FileIO.WriteBufferAsync(file, memStream.ToArray().AsBuffer());//write bytes
                    await file.RenameAsync(file.Name + ".myfile");

                    plainContent = null;
                    cryptoStream.Dispose();
                    memStream.Dispose();
                    transform.Dispose();
                }
            }
            GC.Collect();
        }
        catch { }
    }

运行此代码后,我的应用程序使用了太多内存。我究竟做错了什么?

库里

作为答案发布,因为作为评论它会难以辨认。

我没有使用 UWP 的经验,所以很遗憾我无法对您的代码进行确切的更改,但一般来说 .NET 您会这样做:

    var buffer = new byte[1024 * 1024]; // 1MB buffer
    using (var encryptedStream = new FileStream("FileName.ext.aes", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None, buffer.Length, FileOptions.Asynchronous))
    {
      using (var crypto = new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write))
      {
        using (var unencryptedStream = new FileStream("FileName.ext", FileMode.Open, FileAccess.Read, FileShare.Read, buffer.Length, FileOptions.Asynchronous))
        {
          int bytesRead;
          do
          {
            bytesRead = await unencryptedStream.ReadAsync(buffer, 0, buffer.Length);
            await crypto.WriteAsync(buffer, 0, bytesRead);
          } while (bytesRead == buffer.Length);
        }
      }
    }

因此,您从未加密的流中读取一个块并将其写入您的加密流,然后加密流将加密数据并将其写入您的输出流。然后检查读取的数据量是否等于请求的要读取的数据量 ( buffer.Length)。如果它更少,则意味着您到达了流的末尾。

这样你的内存占用就被限制在缓冲区大小(在这个例子中是 1MB)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从MySQL写入文件时出现内存问题

来自分类Dev

加密文件的问题

来自分类Dev

顺序附加文件时如何克服内存问题

来自分类Dev

抓取大文件时的PHP内存限制问题

来自分类Dev

在Spark中导入Parquet文件时出现内存问题

来自分类Dev

从内存读取抓取的csv文件时出现解码问题

来自分类Dev

使用AFNetworking下载多个文件时出现内存压力问题

来自分类Dev

Mpdf - 覆盖加密文件的问题

来自分类Dev

加密SD卡时出现问题

来自分类Dev

转换音频时读取大尺寸音频文件的内存问题

来自分类Dev

读取大文件时vbscript中的系统内存不足问题

来自分类Dev

将大型zip tsv文件导入R时出现内存问题

来自分类Dev

为Flask Web应用程序创建内存文件系统时的子目录问题

来自分类Dev

加载文件时内存问题,以及转换为十六进制

来自分类Dev

压缩和传输大量小文件(总计1TB)时出现内存问题

来自分类Dev

创建时加密tar.gz文件

来自分类Dev

解密文件的加密内容时出错

来自分类Dev

读取巨大的csv文件,将其存储为Person对象,写入多个更清洁或更小的CSV文件时出现内存问题

来自分类Dev

使用大量UIImage时出现内存问题

来自分类Dev

产生火花时出现内存问题

来自分类Dev

连续录制音频时出现内存问题

来自分类Dev

使用线程时内存分配问题

来自分类Dev

产生火花时出现内存问题

来自分类Dev

在后台睡眠时的Unix内存问题

来自分类Dev

遍历列表或数组时出现内存问题

来自分类Dev

获取 CoreData 时因内存问题而终止

来自分类Dev

文件存在内存管理问题

来自分类Dev

克隆加密磁盘时应该注意哪些问题?

来自分类Dev

撤消/重做时释放内存时出现问题

Related 相关文章

热门标签

归档