Laden...

Seek and Read Crypted Stream

Letzter Beitrag vor 14 Jahren 3 Posts 823 Views
Seek and Read Crypted Stream

Hallo,

ich habe ein Problem bei, Lesen meines Streams - nicht dass es nicht funktionieren würde. Nein, ich will nur bestimmte Teile einer Datei lesen. D.h. mit Seek nach hinter, aber auch nach vorne springen.

Problem 1:
Ich muss schon die ganze Datei einlesen, um mir dann etwas herauszusuchen. Was logisch ist, um die Verschlüsselung aufzuheben. Aber es kostet zu viel Zeit. Denn bei einer 3GB-Datei, aus der ich 50 Bytes ab Offset 40, ist das etwas umständlich.

Problem 2:
Wenn ich mit dem CryptoStream arbeite, ist kein Seek möglich.

Gibt es denn eine andere Möglichkeit eine Datei zu verschlüsseln? Und zwar so, dass ich ganz frei auch wieder Teile auslesen und seeken kann?

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

Hmm.
fällt mir nur ein 2 Dateien zu nehmen

Der frühe Apfel fängt den Wurm.

Das Problem beim "Seek" in einem verschlüsselten Datenstrom hängt an der Verschlüsselungsmethode: Man kann eine Datei "blockweise" verschlüsseln, d.h. es werden jeweils z.B. 8 Bytes genommen und unabhängig von den anderen Daten in der Datei verschlüsselt (=> ECB-Modus).
Das Problem dabei: Wenn zwei identische Datenblöcke in der Datei vorkommen, dann sehen die auch in der verschlüsselten Datei identisch aus. In Bilddateien kann man so z.B. auch bei einer "verschlüsselten" Datei noch Inhalt erkennen.

Deshalb verwendet man eigentlich den CBC-Modus, der die vorhergehenden Daten miteinbezieht. Damit ist aber dann kein "Seek" mehr möglich. Selbiges gilt für Stream-Cipher: Auch die haben normalerweise einen "Zustand" um eben das Problem des ECB-Modus zu umgehen. Dafür sehen die verschlüsselten Dateien dann aber auch wirklich verschlüsselt aus...

Insofern:
Wenn du dir absolut sicher bist, dass der ECB-Modus ausreicht, dann kannst du diesen nutzen und damit zumindest blockgrößenweise innerhalb der Datei springen.

Alternativ kannst du eine Schlüsselfolge nutzen: Aus dem eigentlichen Schlüssel erzeugst du durch ein mathematisches Muster beliebig viele neue Schlüssel. Jetzt verschlüsselst du den ersten Block mit dem ersten Schlüssel, den zweiten Block mit dem zweiten Schlüssel usw.
Damit kannst du dann eine "Blockgröße" innerhalb des Datenstroms etablieren, so dass du dann an jede Blockgrenze springen kannst.

Edit:
Eine dritte Alternative wäre die Verwendungen von "Blöcken" innerhalb der Datei, d.h. die Datei wird in X Bytes große Blöcke unterteilt, und abei jedem Block wird die CBC-Verschlüsselung neu gestartet. Wird allerdings die Blockgröße "klein", dann nähert sich das ganze dem ECB-Modus an.
Aber wenn wir hier wirklich von "großen" Dateien mit nicht redundantem Inhalt sprechen, dann dürfte nichts gegen eine Partitionierung von z.B. 16K oder so sprechen.