2016-04-28 5 views
1

Ich versuche 500 MB Daten zu entschlüsseln, und ich bekomme eine Ausnahmebedingung für größere Dateien, so dass die Entschlüsselung für kleinere Dateien funktioniert, gibt es trotzdem, kann ich sicherstellen, dass ich ' bekomme ich diese Ausnahme nicht aus dem Speicher?Entschlüsselung großer Datei mit AES

Der erste Teil der key.file ist der IV und der zweite Teil der key.file ist der Schlüssel.

Meine Maschine hat 32 GB Speicher, es ist also kein lokales Problem.

Der Code bricht in dieser Zeile: var so = decrTransform.TransformFinalBlock (file, 0, file.Length);

private void DecryptData() {

 X509Certificate2 cert; 

     var storeLocation = (StoreLocation)Enum.Parse(typeof(StoreLocation), "LocalMachine", true); 
     var storeName = (StoreName)Enum.Parse(typeof(StoreName), "My", true); 
     var findType = (X509FindType)Enum.Parse(typeof(X509FindType), "FindByThumbprint", true); 
     string thumbprint = Thumb; 

     try 
     { 
      X509Store certStore = new X509Store(storeName, storeLocation); 
      certStore.Open(OpenFlags.ReadOnly); 
      X509Certificate2Collection certCollection = certStore.Certificates.Find(findType, 
       thumbprint, false); 
      certStore.Close(); 
      cert = new X509Certificate2(certCollection[0]); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 

     RijndaelManaged alg = new RijndaelManaged(); 

     try 
     { 
      var asd = ((RSACryptoServiceProvider)cert.PrivateKey).Decrypt("file.key.path"), true); 

      var iv = new byte[16]; 
      Buffer.BlockCopy(asd, 0, iv, 0, 16); 

      var key = new byte[32]; 
      Buffer.BlockCopy(asd, 16, key, 0, 32); 
      alg.Padding = PaddingMode.PKCS7; 
      alg.Mode = CipherMode.CBC; 



      using (ICryptoTransform decrTransform = alg.CreateDecryptor(key, iv)) 
      { 
       byte[] file = ReadFile(@"encrypted.file.path"); 


        var so = decrTransform.TransformFinalBlock(file, 0, file.Length); 
        File.WriteAllBytes(@"SavedData.path", so); 




       decrTransform.Dispose(); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 
+0

32-Bit-Betriebssystem oder 64-Bit-Betriebssystem? Kompilieren für 32bit .NET oder 64bit .NET? – davidbak

+0

Wurde die gesamte 512mb in einem Prozess verschlüsselt? –

+0

Die Sache ist, ein 32-Bit-.NET-Prozess kann nur auf 2 GB zugreifen (Benutzerbereich) und kann Schwierigkeiten bei der Zuweisung großer zusammenhängender Speicherblöcke haben. Sie haben bereits einen 500 MB großen Block zusammenhängender Speicher für die Datei gefunden, die Sie eingelesen haben. Möglicherweise haben Sie keinen zweiten 500 MB großen Block zusammenhängender Speicher in Ihrem Prozessadressraum für die dekodierten Daten. Wenn Sie 32-Bit ausführen. – davidbak

Antwort

2

Versuchen Streams mit, vor allem CryptoStream. Die Microsoft example at the bottom of this page führen tatsächlich dateibasierte Verschlüsselung mit RijndaelManaged, so dass Sie Glück haben. Sie müssten zuerst die IV aus dem Dateistrom extrahieren, z. durch Lesen genau 16 byte byte byte. Wickeln Sie den Stream erst, nachdem Sie die IV gelesen haben.

Auf diese Weise besteht keine Notwendigkeit für Speicherverbrauch außer einer Puffergröße, die in einigen KiB maximal liegen sollte.

+0

Ja, du hast Recht, ich habe versucht, Stream anstelle von Byte-Arrays zu verwenden, und jetzt funktioniert es wie vorgesehen - danke :) – Karsten