.NETで最も効率的な方法で大きなファイル(64 GBと言う)を暗号化したい。私はこれを実装する方法をAES-Encrypt-then-MACの大容量ファイル
:
- を、それが中に保持するために大になるため(ディスクに保存
- (64ギガバイトを読む)ファイルのストリームを暗号化するために、このストリームを
AesManaged
のインスタンスを作成します。メモリ)(64ギガバイトを書く) - 保存されたファイルのハッシュを計算するために
HMACSHA512
のインスタンスを作成します(64ギガバイトを読む) - 保存ディスクにIVを使用してデータを暗号化(&書き込み64ギガバイトを読む)
簡体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);
}
この実装では、私2番目のファイルを作成し、私は、ディスクからの複数回の64ギガバイトを読んその欠点を持っています。
必要ですか?ディスクIOとRAM割り当てを最小限に抑えるには?
いいえ、正しく行われている必要はありません。また、暗号化しようとする前にIVを作成する必要があるため、手順4は奇妙です。暗号文の前のIVをファイルに書き込むのは一般的です。 –