2011-01-13 6 views
51

Wenn ich eine Datei AES-verschlüsseln und dann ZLIB-komprimieren würde, wäre die Komprimierung weniger effizient als wenn ich zuerst komprimiert und dann verschlüsselt würde?Muss ich beim Komprimieren und Verschlüsseln zuerst komprimieren oder zuerst verschlüsseln?

Mit anderen Worten, sollte ich zuerst komprimieren oder zuerst verschlüsseln, oder spielt es eine Rolle?

+1

Sie sind nicht die gleiche Frage überhaupt. Bei dieser Frage geht es um Effizienz, bei der anderen geht es um Sicherheit. – Ferruccio

Antwort

56

Zuerst komprimieren. Sobald Sie die Datei verschlüsselt haben, erzeugen Sie einen Strom von zufälligen Daten, die nicht komprimiert werden können. Der Komprimierungsprozess hängt davon ab, komprimierbare Muster in den Daten zu finden.

+5

Es ist nicht wirklich zufällig. Es ist nur so, dass kein Komprimierungsalgorithmus das Muster nach der Verschlüsselung mehr erkennen kann. – finnw

+0

Wahr genug. Es sieht zufällig aus. Der Prozess ist deterministisch. Wenn Sie dieselben Daten und denselben Schlüssel erhalten, erhalten Sie das gleiche Ergebnis. – Ferruccio

+1

@finnw Unter der Annahme, dass der Verschlüsselungsalgorithmus Schritte zum Entfernen von Mustern ausführt (z. B. die Verwendung einer Blockchiffre im CBC-Modus mit einer zufälligen IV), sind verschlüsselte Daten nicht von Zufallsdaten zu unterscheiden. – yfeldblum

7

Zuerst komprimieren. Wenn Sie verschlüsseln, werden Ihre Daten (im Wesentlichen) zu einem Strom zufälliger Bits. Zufallsbits sind inkompressibel, da die Komprimierung nach Mustern in den Daten sucht und ein zufälliger Stream per Definition keine Muster enthält.

13

Wenn Ihr Verschlüsselungsalgorithmus gut ist (und AES, mit einem richtigen Verkettungsmodus, ist gut), dann kann kein Komprimierer den verschlüsselten Text verkleinern. Oder, wenn Sie es vorziehen, umgekehrt verschlüsselter Text, dann ist es höchste Zeit, die Qualität des Verschlüsselungsalgorithmus in Frage zu stellen ...

Das ist, weil die Ausgabe eines Verschlüsselungssystems nicht unterscheidbar sein sollte aus rein zufälligen Daten, selbst von einem entschlossenen Angreifer. Ein Komprimierer ist kein böswilliger Angreifer, aber er versucht, nicht zufällige Muster zu finden, die er mit weniger Bits darstellen kann. Der Kompressor sollte kein solches Muster in verschlüsseltem Text finden können.

Also sollten Sie zuerst Daten komprimieren, dann das Ergebnis verschlüsseln, nicht umgekehrt. Dies wird zum Beispiel in der OpenPGP format gemacht.

0

Es ist wahr, dass Kompressor nur auf Datensätzen mit gut definierten Mustern funktioniert, aber es ist explorativ, Daten zuerst zu verschlüsseln, die nicht zufällige Muster gut definiert, die von Kompressor mit weniger Zeitaufwand verarbeitet werden können.

1

Natürlich ist es wichtig. Es ist normalerweise besser zuerst zu komprimieren und dann zu verschlüsseln.

ZLib verwendet Huffman coding and LZ77 compression. Der Huffman-Baum wird ausgewogener und optimaler, wenn er zum Beispiel im Klartext ausgeführt wird, und so wird die Kompressionsrate besser sein.

Verschlüsselung kann nach der Komprimierung folgen, auch wenn das Komprimierungsergebnis "verschlüsselt" zu sein scheint, aber leicht als komprimiert erkannt werden kann, da die Datei normalerweise mit PK beginnt.

ZLib bietet keine native Verschlüsselung. Deshalb habe ich ZeusProtection implementiert. Der Quellcode ist auch unter github verfügbar.

0

Aus einer praktischen Perspektive, ich denke, Sie sollten zuerst komprimieren, einfach weil viele Dateien vorkomprimiert sind. Zum Beispiel beinhaltet Videokodierung normalerweise eine starke Komprimierung. Wenn Sie diese Videodatei verschlüsseln und dann komprimieren, wurde sie jetzt zweimal komprimiert. Die zweite Komprimierung wird nicht nur eine düstere Komprimierungsrate aufweisen, sondern das erneute Komprimieren erfordert eine große Menge an Ressourcen, um große Dateien oder Streams zu komprimieren. Wie in Thomas Pornin und Ferruccio angegeben, kann die Komprimierung von verschlüsselten Dateien wegen der Zufälligkeit der verschlüsselten Dateien sowieso wenig Wirkung haben.

Ich denke, die beste und einfachste Richtlinie kann sein, Dateien nur bei Bedarf zu komprimieren (mithilfe einer Whitelist oder einer Blacklist) und dann unabhängig davon zu verschlüsseln.

31

Komprimierung vor der Verschlüsselung ist sicherlich platzsparender, aber gleichzeitig weniger sicher. Deshalb würde ich anderen Antworten nicht zustimmen.

Die meisten Komprimierungsalgorithmen verwenden "magische" Dateiköpfe und könnten für statistische Angriffe verwendet werden.

Zum Beispiel gibt es eine CRIME SSL/TLS attack.

+7

Sie gewinnen. Siehe http://blog.appcanary.com/2016/encrypt-or-compress.html – manuell

+0

Also, ist es ein Kompromiss, dann? Sieht aus wie die zwei Möglichkeiten sind: 1) verschlüsseln, dann komprimieren für mehr Sicherheit, aber weniger effektive Kompression. 2) Komprimieren, dann für eine effektivere Komprimierung verschlüsseln, aber eine Sicherheitslücke einführen. –