C# File.ReadAllBytes占用大量RAM,有更好的方法吗?
我正忙于使用加密库,我想用AES GCM加密大文件。目前,在从CryptoStream写入临时文件Chipher后,我使用此文件加密文件:C# File.ReadAllBytes占用大量RAM,有更好的方法吗?,c#,C#,我正忙于使用加密库,我想用AES GCM加密大文件。目前,在从CryptoStream写入临时文件Chipher后,我使用此文件加密文件: 此函数工作正常,但根据文件大小,它需要大量RAM。有没有更好的办法?我尝试使用FileStream,但它开始与我的代码冲突。是否有一种方法可以使用更少的内存或不使用内存来保存Chiperbyte[]?似乎您正在尝试编写一个包含三条信息的复合文件—标记、IV和密码文本。假设在加密完成之前无法获取标记值,那么您将尝试在加密完成后合成数据 当您尝试将大型加密文件加
此函数工作正常,但根据文件大小,它需要大量RAM。有没有更好的办法?我尝试使用FileStream,但它开始与我的代码冲突。是否有一种方法可以使用更少的内存或不使用内存来保存Chiperbyte[]?似乎您正在尝试编写一个包含三条信息的复合文件—标记、IV和密码文本。假设在加密完成之前无法获取标记值,那么您将尝试在加密完成后合成数据 当您尝试将大型加密文件加载到内存中时,就会出现问题。幸运的是,streams为此提供了一个很好的简单解决方案:
byte[] authTag = encryptor.GetTag();
using (var tempfile = File.OpenRead(BUFER_PATH))
using (var outstream = File.Create(END_PATH))
{
// write tag
outstream.Write(authTag, 0, authTag.Length);
// write IV
outstream.Write(aes.IV, 0, aes.IV.Length);
// copy data from source file to output file
tempfile.CopyTo(outstream);
}
另一方面,如果提前知道标签和IV的大小,也可以将数据直接写入输出文件。只需在文件的开头为标记值分配空间,然后返回并在事实发生后将其写入即可。这就省去了使用临时文件的麻烦。有没有一种方法可以直接将加密流输出到输出文件中,而不是使用中间临时文件阶段?加密流就是为此制作的,某种类型的流就是您所需要的;这是如何“开始与我的代码冲突”的?@DourHighArch我试图获取多个参数,如长度,但似乎无法获取它们。或者我缺乏如何打开和写入缓冲区路径的代码的经验。可能有一种简单的方法可以通过稍微修改代码来编写tag和IV。
byte[] authTag = encryptor.GetTag();
using (var tempfile = File.OpenRead(BUFER_PATH))
using (var outstream = File.Create(END_PATH))
{
// write tag
outstream.Write(authTag, 0, authTag.Length);
// write IV
outstream.Write(aes.IV, 0, aes.IV.Length);
// copy data from source file to output file
tempfile.CopyTo(outstream);
}