AES-Verschlüsselung auf große Dateien
Ich brauche, um zu verschlüsseln und zu entschlüsseln, die große Datei (~1GB).
Ich habe versucht, mit diesem Beispiel: http://www.codeproject.com/Articles/769741/Csharp-AES-bits-Encryption-Library-with-Salt
Aber mein problem ist, da die Datei sehr groß ist, ich bin immer outOfMemory-exception.
Also muss ich ersetzen Sie den Speicher-stream mit der stream-Datei, die ich gerade nicht sicher, wie zu es tun...
(Hinzufügen mein code:)
private static void AES_Encrypt(string srcFile, string encryptedFile, byte[] passwordBytes)
{
//Set your salt here, change it to meet your flavor:
//The salt bytes must be at least 8 bytes.
byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8};
FileStream fsInput = new FileStream(srcFile,
FileMode.Open,
FileAccess.Read);
FileStream fsEncrypted = new FileStream(encryptedFile,
FileMode.Create,
FileAccess.Write);
using (RijndaelManaged AES = new RijndaelManaged())
{
AES.KeySize = 256;
AES.BlockSize = 128;
var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
AES.Key = key.GetBytes(AES.KeySize / 8);
AES.IV = key.GetBytes(AES.BlockSize / 8);
AES.Mode = CipherMode.CBC;
using (var cs = new CryptoStream(fsEncrypted, AES.CreateEncryptor(), CryptoStreamMode.Write))
{
byte[] bytearrayinput = new byte[fsInput.Length - 1];
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
cs.Write(bytearrayinput, 0, bytearrayinput.Length);
cs.Close();
fsInput.Flush();
fsInput.Close();
fsEncrypted.Close();
}
}
}
public static void AES_Decrypt(string encryptedFile, string decryptedFile, byte[] passwordBytes)
{
byte[] decryptedBytes = null;
//Set your salt here, change it to meet your flavor:
//The salt bytes must be at least 8 bytes.
byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8};
FileStream fsread = new FileStream(encryptedFile,
FileMode.Open,
FileAccess.Read);
using (RijndaelManaged AES = new RijndaelManaged())
{
AES.KeySize = 256;
AES.BlockSize = 128;
var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
AES.Key = key.GetBytes(AES.KeySize / 8);
AES.IV = key.GetBytes(AES.BlockSize / 8);
AES.Mode = CipherMode.CBC;
FileStream fsDecrypted = new FileStream(decryptedFile,
FileMode.Create,
FileAccess.Write);
using (var cs = new CryptoStream(fsDecrypted, AES.CreateDecryptor(), CryptoStreamMode.Write))
{
byte[] bytearrayinput = new byte[fsread.Length - 1];
fsread.Read(bytearrayinput, 0, bytearrayinput.Length);
cs.Write(bytearrayinput, 0, bytearrayinput.Length);
cs.Close();
fsread.Close();
fsDecrypted.Close();
}
}
}
- Ich habe deine bearbeiteten Titel. Bitte sehen, "Sollten Fragen enthalten "tags" im Titel?", wo der Konsens ist ", Nein, Sie sollten nicht".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schließlich, dies ist der code, der bei mir funktioniert:
So habe ich eine ziemlich schnelle und niedrigen Speicherverbrauch version:
Ich benutze eine "temporäre buffer" und auch "use a random salt und speichern Sie es mit der Chiffretext".
Zum verschlüsseln:
Entschlüsseln:
Generieren random salt:
RNGCryptoServiceProvider
?Da Sie das Lesen aus einer Datei und schreiben in eine Datei nur ersetzen Sie den Speicher-streams von IOStream oder FileStream.
Müssen Sie umgestalten, das Verfahren ein wenig, so dass Sie nicht erwarten/return byte-arrays.