Eigenes Dateiformat für eine XOR-Verschlüsselung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cruel0r
User
Beiträge: 8
Registriert: Montag 7. Juli 2008, 19:33
Wohnort: Innerschweiz

Hi python-Forum
Ein paar Kollegen und ich haben einen Webspace gemietet, und möchten darauf nun Dateien hosten, welche aber verschlüsselt sein sollen. Wir haben uns als Spiel ausgedacht, dass jeder von uns eine simple XOR-Verschlüsselung programmiert (mit vorgegebenem Keyfile), und wer zuerst ein funktionnierendes Programm hat, gewinnt.
Ich habe nun gewonnen, und möchte mein Programm nun etwas weiter verfeinern, indem ich noch die Dateinamen verschlüssle und eine Checksumme für das Keyfile und das Originalfile einbaue.
Dabei haben sich mir folgende Fragen gestellt:

1. Könnte man eine mit XOR verschlüsselte Datei (Key hat man nicht) und ihrer md5/sha Summe entschlüsseln, wenn ich jetzt in meine verschlüsselte Datei alles hineinschreibe? (den Key natürlich nicht)

2. Da jedes Keyfile (pseudo)zufällig ist, würde es Sinn machen die md5/sha summe mitzuschicken vom keyfile, damit man weiss, ob die Datei mit dem richtigen Keyfile entpackt wird?

3. Welches ist die sicherste/beste Methode Text zu verschlüsseln? XOR darf ich nicht auf einen Dateinamen anwenden, weil es ja auch nicht zulässige Zeichen (z.B. "/") oder nicht ASCII-Zeichen geben kann.
Die Caesar-Methode dünkt mich ein wenig unsicher.

4. Gibt es etwas zu beachten, wenn ich mit Markern (Markerbytes, bei JPEG z.B. xFFD8) in einer Datei umgehe?

Vielen Dank für eure Antworten
Gruss cruel0r
Zuletzt geändert von cruel0r am Sonntag 26. Oktober 2008, 15:19, insgesamt 1-mal geändert.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Meinst du sowas?

Code: Alles auswählen

import itertools

def transcode(m, k):
    return "".join(chr(ord(a) ^ ord(b)) for a, b in itertools.izip(m, itertools.cycle(k)))

k = "geheim"
m = "the truth is out there"
c = transcode(m, k)

print `c`
print `transcode(c, k)`
Das wäre jedenfalls, was ich unter einer XOR-Verschlüsselung verstehen würde. "k" ist der Schlüssel, "m" die Nachricht und "c" das verschlüsselte Ergebnis. Das das ganze ein symmetrisches Verfahren ist, dient "transcode" zum Ver- und Entschlüsseln.

Das ist keine Cäsar-Methode.

Beides ist kryptographisch gesehen total unsicher. Wenn du eine sichere Verschlüsselung haben willst, benutze ein etabliertes Verfahren wie AES. Das benötigt einen Schlüssel aus 128-Bits.

Ich verstehe nicht, was du wohin schreiben willst und was das mit MD5 oder SHA1 zu tun hat, aber wenn du Schlüssel und verschlüsselten Text zusammen transportierst (oder ablegt) kannst du auch gleich den unverschlüsselten Text transportieren.

Zu 2 würde ich sagen: Wozu den Test. Wenn glibberisch herauskommt, merkt man schon, das da was falsch war. Wieso willst du es dem Angreifer noch einfacher machen? Statt jetzt mögliche Schlüssel am Text durchzuprobieren und da diesem zu erkennen, ob der Schlüssel gepasst hat, muss ich dann nur noch Schlüssel erzeugen, die Prüfsumme berechnen und diese vergleichen. Das geht doch viel schneller, wenn die Schlüssel nicht sehr lang im Vergleich zum Text sind.

Zu 4: Du etwas verschlüsseln und trotzdem noch als JPEG-Bild erkennen? Wozu? Das wird im allgemeinen nicht gemacht. Falls du das doch machen willst, wird es deutlich komplizierter, denn du musst ja den Aufbau dieser Dateien (der nicht-trivial ist) erhalten und nur die Nutzdaten verschlüsseln.

Stefan
lunar

cruel0r hat geschrieben:1. Könnte man eine mit XOR verschlüsselte Datei (Key hat man nicht) und ihrer md5/sha Summe entschlüsseln, wenn ich jetzt in meine verschlüsselte Datei alles hineinschreibe? (den Key natürlich nicht)
Es vereinfacht das Brechen zumindest, da die Prüfsumme den Klartext eindeutig definiert. Um zu überprüfen, ob ein (wie auch immer) berechneter Klartext "richtig" ist, muss man nur die Prüfsumme berechnen und vergleichen.

Eine Verschlüsselungsverfahren sollte außer dem Chiffretext keinerlei weitere Informationen über den Klartext verraten. Genau das tust du aber, indem du die Prüfsumme im Klartext beilegst.
2. Da jedes Keyfile (pseudo)zufällig ist, würde es Sinn machen die md5/sha summe mitzuschicken vom keyfile, damit man weiss, ob die Datei mit dem richtigen Keyfile entpackt wird?
Es ist unsicher. Richtig wäre es, die Prüfsumme des Klartexts dem Klartext voranzustellen, und das Ergebnis dieser Konkatenation anschließend zu chiffrieren. Dann kann man nach der Dechiffrierung die Prüfsumme mit dem Klartext vergleichen und so die Integrität überprüfen.
3. Welches ist die sicherste/beste Methode Text zu verschlüsseln? XOR darf ich nicht auf einen Dateinamen anwenden, weil es ja auch nicht zulässige Zeichen (z.B. "/") oder nicht ASCII-Zeichen geben kann.
Wo hast du denn das her? Wieso sollte man Dateinamen oder Nicht-ASCII-Zeichen nicht auch mit einer XOR-Verknüpfung verschlüsseln können?
4. Gibt es etwas zu beachten, wenn ich mit Markern (Markerbytes, bei JPEG z.B. xFFD8) in einer Datei umgehe?
Grundsätzlich ist die Existenz allgemein bekannter Bytes im Klartext immer ein Ansatz für Known-Plaintext-Angriffe. Ob diese nun eine Gefahr darstellen, hängt von der Art der Chiffre ab.

Bei einem One-Time-Pad ist die Gefahr eher gering, da der Schlüssel endlos und zufällig ist, und das Wissen um ein Schlüsselbyte somit keinerlei Rückschlüsse auf andere Bytes in Klartext oder Schlüssel ermöglicht. Bei Stromchiffren mit endlichem Schlüssel oder Blockchiffren sieht das wieder anders aus.
Sind die so etwas wie "fälschungssicher"?
Was immer du damit jetzt auch meinst ...
BlackJack

Zu 3.: Damit der verschlüselte Dateiname wieder einen gültigen Dateinamen ergibt, kannst Du ihn ja einfach Base64 kodieren. Er ist dann zwar etwas länger, aber enthält keine "verbotenen" Bytewerte mehr.

Ansonsten würde ich auch eher einen etablierten Algorithmus vorschlagen. XOR ist nur als "one time pad" sicher. Also wenn ihr persönlich eine DVD mit einer riesigen Zufallsdatei austauscht und bei den Dateien dann noch angebt, ab welchem Offset die Daten zur Verschlüsselung genommen wurden und die in dem Bereich nur einmal verwendet, dann ist das ein sicheres Vefahren. Sonst eher nicht…
cruel0r
User
Beiträge: 8
Registriert: Montag 7. Juli 2008, 19:33
Wohnort: Innerschweiz

Vielen Dank für eure Antworten, ich werde eure Vorschläge einmal versuchen auszuführen.
Gruss cruel0r
Antworten