2009-07-17 7 views
8

Ich würde gerne wissen, wenn Kompressionsalgorithmen immer eine eindeutige Ausgabe für zwei verschiedene Sätze von Dateien generieren.Können Komprimierungsalgorithmen eine identische Ausgabe für zwei verschiedene Dateien erzeugen?

Angenommen, ich habe zwei Dateien A und B und sage, dass ich für jede dieser Dateien einen Komprimierungsalgorithmus verwende (zum Beispiel PKZIP - dies könnte jeder Komprimierungsalgorithmus sein), um A.zip bzw. B.zip zu erhalten . Ist es möglich, dass A.zip für eine Kombination von A und B genau identisch mit B.zip auf der binären Ebene ist. Wenn dies nicht möglich ist, können wir sicher annehmen, dass die Komprimierung dem kryptografischen Hashing entspricht, wenn es um die Gewährleistung von Eindeutigkeiten geht ? Auf der anderen Seite, wenn es möglich ist, könnten Sie mir bitte eine Probe A und B-Datei zusammen mit dem Kompressionsalgorithmus zur Verfügung stellen, um diese Duplizität zu überprüfen?

+1

Ihre Erwähnung von "kryptographischem Hashing" hat einige Leute dazu gebracht zu glauben, dass Sie verlustfreie Komprimierung für Sicherheitszwecke verwenden wollen - ist das richtig? Wenn das so ist, ist das eine schreckliche Idee, aus all den Gründen, die sie geben. Aber wenn Sie nur daran interessiert sind, die Eindeutigkeit zu garantieren, und bereit sind, mit den Ausgaben variabler Länge umzugehen, die Ihnen die Komprimierung bietet, dann ist das eine vernünftige Wahl (obwohl für alle praktischen Zwecke die Verwendung eines kryptografischen Hashes mit fester Länge schneller und einfacher ist) gut funktionieren - die Wahrscheinlichkeit einer Schlüsselkollision mit zB 128-Bit-Schlüsseln ist unerheblich. –

Antwort

21

Verlustfreie Komprimierung (wie in ZIP-Dateien verwendet) erzeugt immer unterschiedliche Ausgaben für verschiedene Dateien - andernfalls könnten Sie die ursprünglichen Daten nicht zuverlässig wiederherstellen. Die Ausgabedaten können jedoch eine beliebige Größe haben - und für einige Eingaben ist sie größer als die ursprüngliche Eingabe. Als solches ist dies normalerweise nicht sehr nützlich als ein Hash, der im Allgemeinen eine Ausgabe fester Größe erfordert.

Verlustbehaftete Komprimierung (z. B. MP3, JPEG usw.) kann die gleiche Ausgabe für verschiedene Eingaben erzeugen. Daher können Sie die Originaldaten nicht wiederherstellen, sondern etwas ähnliches erhalten. Aus diesem Grund ist die pigeonhole principle kein Problem, und so können Sie garantieren, dass es die Ausgabegröße reduziert und oft sogar die gewünschte Ausgabegröße angibt. Da ähnliche, aber leicht unterschiedliche Eingaben oft die gleiche Ausgabe erzeugen, ist dies auch für das Hashing nicht nützlich, da das Hashing kleine Änderungen in der Eingabe erfordert, um große Änderungen in der Ausgabe zu erzeugen.

+0

+1 für Schublad Prinzip, weil ich ein Matscher bin. Allerdings adressiert das die kryptografische Hash-Frage? –

+0

Sicher. Lossless funktioniert nicht, weil es eine variable Größe hat, verlustbehaftet, weil kleine Änderungen nicht zu großen Hash-Änderungen führen (Lawineneffekt). – bdonlan

+0

@bdonian Was ist die Anforderung an Hashes mit fester Länge? Auch die Idee, Informationen zu verlieren (dh verlustbehaftet), hindert einen Algorithmus nicht daran, ein guter Hash zu sein. MD5 oder SHA-1 sind verlustbehaftete Komprimierungsalgorithmen, nicht wahr? Ich denke, die wichtige Sache, die hier zu beachten ist, ist, dass alle Crypto Hash-Funktionen Komprimierungsalgorithmen sind, aber nicht umgekehrt. (Crypto-Hash-Funktionen müssen "hart" zu invertieren sein) Und nachdem ich das gesagt habe, stelle ich fest, dass dies etwas meiner Antwort unten widerspricht: P –

14

Es ist nicht möglich. Wenn die komprimierten Dateien identisch sind, wie könnten sie beim Dekomprimieren unterschiedliche Ergebnisse erzielen?

+2

Klar und einfach: +1. Beachten Sie, dass dies nur für die verlustfreie Komprimierung gilt (was das OP unter Hinweis auf PKZIP vorschlägt, aber nicht ausdrücklich erwähnt). –

+1

Als ich die Antwort schrieb, dachte ich nicht einmal über die Möglichkeit einer verlustbehafteten Komprimierung nach, aufgrund der Art, wie die Frage formuliert wurde.Danke für die Klarstellung. –

1

Es sollte offensichtlich sein: Wenn die komprimierten Dateien identisch sind, wie könnte dann der Dekompressor wissen, ob er A oder B daraus machen soll?

Dies macht jedoch keinen verwendbaren Hashwert, da die Länge variabel ist.

1

Komprimierungsfunktionen müssen injektiv sein, dh jeder Eingang wird einem eindeutigen Ausgang zugeordnet. Wenn dies nicht der Fall wäre, wie würde der Algorithmus wissen, ob er zurück in A oder B dekomprimiert werden soll?

Beachten Sie, dass dies nur für die verlustfreie (Daten) Komprimierung gilt. Es ist beispielsweise möglich, 2 Bilder zu komprimieren und das gleiche Ergebnis zu erhalten, allerdings nur, wenn die Bilder sehr nahe beieinander liegen.

1

Nun, Ihre Frage ist irgendwie allgemein, aber da Sie dateibasierte Komprimierungsalgorithmen angeben (Ihr pkzip-Tag für eine Sache), dann nein. Es gibt keine Möglichkeit, dass zwei verschiedene verlustfreie Komprimierungsalgorithmen dieselbe Ausgabe von verschiedenen Eingaben erzeugen können.

Für verlustbehaftete Komprimierungsalgorithmen, wie JPEG, ist das natürlich eine Möglichkeit, aber dann wären die Dateien fast identisch.

Nehmen Sie zum Beispiel eine .PNG-Datei, speichern Sie sie als .JPEG, ändern Sie ein Pixel, um es in einem der Kanäle 1 Grad heller oder dunkler zu machen, speichern Sie es als .JPEG und Sie haben eine Chance, dass Sie bekam zwei identische Dateien, obwohl die Eingabe unterschiedlich war, wenn auch nur geringfügig.

Also verlustfreie Algorithmen, nein, das kann nicht passieren. Für verlustbehaftete Algorithmen, ja.

0

Es sind nur lossy compression Algorithmen möglich (im Gegensatz zu lossless data compression).Theoretisch könnten sie für ähnliche (aber immer noch unterschiedliche) Eingabedaten das gleiche Ergebnis liefern.

2

Lassen Sie f einen Komprimierungsalgorithmus sein. Wenn das Komprimieren A und B die gleiche Datei ergibt, dann f (A) = f (B) = C, für einige C. Lassen Sie nun f ' den Dekomprimierungsalgorithmus sein. dann f '(f (A)) = f' (C) = f '(f (B)). Daher f ' dekomprimiert A.zip und B.zip in derselben Datei.

Also, entweder f ist ein wertlos Kompressionsalgorithmus (weil es kein Bijektion ist), oder A und B sind in der Tat die gleiche Datei. (Wenn ich wertlos sage, meine ich für verlustfreie Kompression wertlos!)

Was Ihre andere Frage, beachten Sie, dass eine verlustfreie Komprimierung Algorithmus ist per Definition nicht als Algorithmus Hashing, da eine Hashfunktion h eine Domain abbildet A auf einer (allgemein) kleineren Domäne B. Daher hnicht eine Bijektion, während wir nur behauptet, dass unsere lossless Komprimierungsfunktion f eine Bijektion.

+0

Wertlos ist ein bisschen stark; verlustbehaftete (dh nicht-bijektive) Algorithmen werden für Audio und Bilder die ganze Zeit verwendet – bdonlan

+0

@bdonlan: Sie haben Recht. Ich habe die Antwort aktualisiert, um zu verdeutlichen, was ich unter "wertlos" verstehe: – Stephan202

3

Sicher kann verlustreiche Komprimierung die gleiche Ausgabe wie bereits erwähnt geben.

Aber ich denke, ein sehr wichtiger Punkt, der nicht erwähnt wurde, ist, dass kryptografische Hashes sehr schwer rückgängig zu machen sein sollten (oder den gleichen Hash über zwei verschiedene Eingänge zu reproduzieren). Aus diesem Grund wären verlustfreie und damit reversible Kompressionsalgorithmen wie z. B. Reißverschlüsse als kryptographischer Hash ungeeignet.

+0

+1 für die Unbrauchbarkeit der Komprimierung als Sicherheitsmaßnahme, aber ich denke, das OP war hauptsächlich daran interessiert, komprimierte Ausgaben zu verwenden, um Eindeutigkeit zu garantieren - und zu garantieren Eindeutigkeit ist etwas, das verlustfreie Komprimierung * sogar besser als * kryptografische Hashes macht (obwohl mit dem offensichtlichen Nachteil der Erzeugung einer Ausgabe variabler Länge). –

1

Kryptografische Hash-Funktionen haben eine sehr spezifische Anforderung: es sehr schwierig zu machen, sie umzukehren. Die Komprimierung ist per Definition leicht zu invertieren, daher ist sie eine sehr schlechte Wahl für einen Krypto-Hash.

EDIT:

Beachten Sie, dass, wenn ich 'per definitionem' sagen oben, ich durch herkömmliche Definition bedeuten. Streng genommen könnten MD5, SHA-1 usw. ebenfalls als Komprimierungsalgorithmen betrachtet werden.

0

Damit ein Algorithmus ein anständiger kryptografischer Hashwert ist, sollte eine kleine lokalisierte Änderung der Eingabe zu einer großen, dispersiven Änderung der Ausgabe führen. Eine Hash-Funktion ist auch eine Zuordnung von einer beliebig großen Eingabe zu einer Ausgabe fester Größe.

Verwandte Themen