我想在.NET中以最有效的方式加密大文件(比方說64 GB)。AES-Encrypt-then-MAC與.NET的大文件
我將如何實現這一點:
- 創建的
AesManaged
一個實例文件的流(讀64 GB)加密 - 保存此流盤(因爲它是大持有存儲器)(寫64 GB)
- 創建的
HMACSHA512
一個實例計算所保存的文件的哈希值(讀64 GB) - 保存與四到磁盤加密的數據(讀寫& 64 GB)
簡體C#代碼:
using (var aesManaged = new AesManaged())
{
using (var msEncrypt = File.OpenWrite(@"C:\Temp\bigfile.bin.tmp"))
{
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
File.OpenRead(@"C:\Temp\bigfile.bin").CopyTo(csEncrypt);
new MemoryStream(iv).CopyTo(csEncrypt);
}
}
}
using (var hmac = new HMACSHA512(hmacKey))
{
hmacHash = hmac.ComputeHash(File.OpenRead(@"C:\Temp\bigfile.bin.tmp"));
}
byte[] headerBytes;
using (var memoryStream = new MemoryStream())
{
var header = new Header
{
IV = iv,
HmacHash = hmacHash
};
Serializer.Serialize(memoryStream, header);
headerBytes = memoryStream.ToArray();
}
using (var newfile = File.OpenWrite(@"C:\Temp\bigfile.bin.enc"))
{
new MemoryStream(MagicBytes).CopyTo(newfile);
new MemoryStream(BitConverter.GetBytes(headerBytes.Length)).CopyTo(newfile);
new MemoryStream(headerBytes).CopyTo(newfile);
File.OpenRead(@"C:\Temp\bigfile.bin.tmp").CopyTo(newfile);
}
實現帶有缺點我創建的第二文件和我從磁盤中多次讀取64 GB。
是必要的嗎?如何最小化磁盤IO和RAM分配?
不,這樣做沒有必要做得正確。另外,第4步很奇怪,因爲IV應該在嘗試加密之前創建。通常在文件的密文前寫入IV。 –