AES mit CommonCrypto verwendet zu viel Speicher - Objective-C

8

Mein Ziel ist es, in der Lage zu sein, eine Datei / einen Ordner und ein Passwort zu erhalten, sie in AES mit Objective-C zu verschlüsseln und zu entschlüsseln. Ich bin kein Krypto-Nerd oder so, aber ich entschied mich für AES, weil ich fand, dass es ziemlich normal und sehr sicher war. Ich verwende eine NSMutableData-Kategorie, die über Methoden zum Verschlüsseln und Entschlüsseln der Daten verfügt. Hier ist es:

%Vor%

Das Problem mit diesem Code ist, dass es etwa !! verwendet! 5 !! Die Größe der Datei (mit NSMutableData geöffnet), die der Benutzer auswählt. Dies ist aus der Sicht des Benutzers völlig inakzeptabel (stellen Sie sich vor, eine Datei zu verschlüsseln, die 2 GB - 10 GB im Speicher ist), aber ich bin hier wirklich ratlos.

Können Sie irgendwelche Änderungen vorschlagen, die dieses Problem lösen würden? Vermutlich einen Chunk gleichzeitig verschlüsseln (so ist nur ein Chunck oder zwei gleichzeitig im Speicher, nicht die gesamte Datei * 5). Das große Problem dabei ist, dass ich nicht weiß, wie es geht. Irgendwelche Ideen?

Danke

PS: Wenn ich diese Kategorie verwende, mache ich es so:

%Vor%

Und genau diese drei Zeilen erzeugen ein so großes Speicherproblem.

OH, übrigens: brauche ich einen Initialisierungsvektor? Ich denke, es ist sicherer oder so, aber ich weiß es nicht. Wenn es wirklich eine Notwendigkeit gibt, können Sie mir sagen, wie es geht?

BEARBEITEN

Das mache ich jetzt:

%Vor%

Und die neue Methode in der Kategorie:

%Vor%

Ich kann nicht verstehen, warum das manchmal funktioniert und manchmal nicht. Ich bin hier wirklich ratlos. Könnte jemand bitte diesen Code überprüfen?

Um nicht alle Dateien gleichzeitig in den Speicher zu laden, verwende ich -dataWithContentsOfMappedFile und rufe dann -getBytes:range: auf, weil ich hier , dass auf diese Weise nicht alle Dateien gleichzeitig in den realen Speicher geladen werden, sondern nur der angegebene Bereich.

BEARBEITEN 2

Bitte sehen Sie meine Antwort für das, was ich gerade mache.

    
Alex 29.06.2011, 21:56
quelle

2 Antworten

1

Ich entschied mich, das komfortable Objc-C-Land zu verlassen und schrieb die zweite NSMutableData-Kategorie oben mit C-Funktionen um. Ich habe mein Bestes gegeben, aber es würde mich nicht überraschen, wenn es in diesem Code Fehler gäbe, also mach bitte Vorschläge! Ich ließ auch die Kategorie "Schema" fallen und entschied mich stattdessen für eine eigenständige Methode. Hier:

%Vor%

Ich weiß, dass es keine Fehlerprüfung innerhalb der 'for' Schleife gibt, und das kann auch anderswo der Fall sein. Anregungen dazu bitte! Dort gibt es Code, der prüft, ob ein Thread abgebrochen wurde. Das liegt daran, dass dieser Code in einem separaten Thread ausgeführt wird, den meine Klasse steuert. Immer wenn der Benutzer auf die Schaltfläche "Abbrechen" klickt, wird der Thread, den ich erstellt habe, die Abbruchnachricht gesendet. Diese If's stellen sicher, dass der Thread tatsächlich abbricht. Fühlen Sie sich frei, Vorschläge (noch einmal!) Zu machen und diesen Code zu verwenden, wo immer Sie möchten:)

PS: Ich habe das sowohl mit Verschlüsselung als auch mit Entschlüsselung getestet und es hat bis jetzt einwandfrei funktioniert. Mein anfängliches Problem (zu viel Speicher) scheint ebenfalls gelöst zu sein!

    
Alex 12.07.2011, 16:26
quelle
0

Hier ist eine modifizierte Implementierung von Alex 'ursprünglichem Code mit einer Kategorie von NSMutableData. Es wurde gründlich Unit-getestet mit In-Memory-Daten, sowie [NSMutableData dataWithContentsOfMappedFile:"filePath"]; mit Datei unterschiedlicher Länge, von ein paar Bytes bis 50 MB.

NSMutableData + Crypto.h

%Vor%

Und NSMutableData + Crypto.m

%Vor%

Hinweis für Alex: Ihr ursprünglicher Versuch hat einfach nicht berücksichtigt, dass das CCCryptorUpdate bei der Ausgabe nicht die gleiche Anzahl von Bytes zurückgibt wie die Eingabe. Zum Beispiel gibt die Entschlüsselung von 1024 Bytes oft 1008 Bytes zurück, da 16 Bytes zum Auffüllen verwendet werden. Ihr Beispiel, das C-Dateifunktionen verwendet, berücksichtigte dies, indem es in eine neue Datei schrieb, anstatt den Speicher direkt zu ersetzen. Ich habe gerade einen Dateipositionszeiger implementiert, der Ihrer Dateiausgabemethode ähnelt. Danke, dass du mich angefangen hast!

    
Scott Montgomerie 03.10.2011 04:27
quelle