Post by Daniel AlbuschatPost by Andre SokolewDas sehe ich anders. Ich habe das Verfahren beschrieben. Die eigentliche
Verschlüsselung geschieht mit einem 32-Byte-Schlüssel, an dem nichts
obskures ist.
Dieser 32-Byte Schlüssel lässt sich aber doch ganz einfach aus dem
Startwert und dem Passwort generieren.
Das ist nun einmal so und gehört zum Prinzip. Das Geheimnis ist das
Passwort. Man könnte stattdessen auch eine Chipkarte oder einen
Magnetstreifen verwenden oder was auch immer, wenn die Technik zur Verfügung
stünde, grundsätzlich würde sich am Verfahren nichts ändern.
Post by Daniel AlbuschatUnd für die Passwörter kann man Bruteforce anwenden.
Nein, eben nicht. Du verwechselst da was. Es ist etwas anderes, die
Hashwerte in der SAM des Betriebssystems auszulesen und so lange zu
probieren, bis sich eine Übereinstimmung ergibt, als hier Brute Force
anzuwenden.
Brute Force ist immer eine Frage des Aufwandes. Der wurde hier recht hoch
gelegt, zum Beispiel dadurch, dass der Angreifer erst sehr aufwendig
ermitteln muss, nach welcher "Übereinstimmung" er überhaupt suchen soll.
Auch der zufällige Startwert erschwert einen solchen Angriff ungemein, weil
eine vorbereitete Tabelle mit den Hashwerten der "gängigen" Passwörter
(darauf beruhen die Passwortknacker, die Du in den Zeitschriften an der
Tankstelle findest) nicht greift.
Ich behaupte nicht, dass es unmöglich wäre, aber der Aufwand ist hoch. Sehr
hoch.
Post by Daniel AlbuschatPost by Andre SokolewPost by Daniel AlbuschatPost by Andre SokolewPost by Heiko NoconBeim Disassemblieren fallen dann mit einiger Wahrscheinlichkeit auch
noch Informationen über den Aufbau der verschlüsselten Headerstruktur
ab, mit denen sich zumindest ein Teil der 128Bit zukünftig mit einigen
wenigen einfachen Operationen ermitteln lassen.
So blond bin ich nun auch wieder nicht, dass ich den Header mit
demselben Schlüssel belege wie die eigentlichen Daten.
Ob nun 1 Schlüssel, 2 oder 5, das Problem bleibt dasselbe.
Sorry, Du hast das Problem nicht verstanden, das Heiko ansprach.
Doch,
Nein.
Meiner ersten Beschreibung nach verwende ich _einen_ (recht kurzen)
Schlüssel immer wieder. Heiko merkte an, dass Header-Daten in der Regel
deutlich strukturiert sind und deshalb an bestimmten Stellen vorhersehbare
Bytes zu stehen haben. Dies zu verschleiern macht keinen großen Sinn, weil
man diese Verschleierung mit einem Disassembler leicht rekonstruieren kann.
Wenn man aber das Klar-Ergebnis und die Verschlüsselung dieses Ergebnisses
kennt, dann hat man daraus mit XOR sofort den Schlüssel - zumindest für
diese Bits, wenn nicht gar Bytes.
Durch eine wiederholte Anwendung dieses Schlüssels wären damit zumindest
Teile der Daten bereits geknackt, bevor die richtigen Waffen zum Einsatz
kommen. Somit hätte man vielleicht eine Chance, durch logische Analyse der
Daten - insbesondere unterstützt durch die fortlaufende Wiederholung des
recht kurzen Schlüssels - den Schlüssel zu erraten.
Sorry, dass ich anfangs dieses wichtige Detail vergessen hatte. Aber ich
habe mich schon berichtigt. Der Schlüssel für den Header wird nur einmal
angewandt. Die eigentlichen Daten werden mit einem anderen Schlüssel
verschlüsselt. Und da ist die Wiederholung des Schlüssels kein Problem, weil
durch die vorherige Komprimierung die Datenstruktur völlig unbekannt ist.
Der Angreifer weiß nicht, ob er ein x oder ein u sucht.
Post by Daniel Albuschatwas ich jedoch sagen wollte ist nur, dass verschiedene Layer
des gleichen Verfahrens zwar mehr Verwirrung, aber nicht mehr Sicherheit
mit sich bringen.
Heikos Einwurf bezog sich auf das, was ich eben noch einmal erklärte, da
trifft Dein Argument nicht zu.
Post by Daniel AlbuschatPost by Andre SokolewPost by Daniel AlbuschatAm besten wäre ein asynchrones Verfahren mit im Programm vergebenen
privaten und öffentlichen Schlüsseln, die irgendwo "sicher" abgelegt
werden.
Ich habe es mir vorhin verkniffen, aber jetzt muss ich es doch loswerden:
Abgesehen davon, dass kein vernünftiger Mensch größere Datenmengen mit einem
unsymmetrischen Verfahren verschlüsseln würde (es dauert schlicht zu
lange...), kann ich auch überhaupt nicht erkennen, was ein
Public-Key-Verfahren hier soll. Du hast selbst richtig erkannt, dass man den
privaten Schlüssel irgendwo sicher unterbringen muss. Das ist hier nicht
möglich, Smartcard etc. scheiden definitiv aus.
Post by Daniel AlbuschatDu möchtest Daten mit Hilfe eines Geheimnisses (dem Passwort)
verschlüsseln. Da das Passwort nur wenige Bytes bietet, erweiterst du
es um einen zufälligen Wert. Soweit sogut.
Was ich daran bemängelt habe ist, dass bei jedem Verschlüsselungsvorgang
ein anderes Resultat bei raus kommt.
Das ist zwingend erforderlich.
Post by Daniel AlbuschatDas kann je nach Situation gegebenenfallls nachteilhaft sein.
Dann ist halt die Situation falsch.
Post by Daniel AlbuschatDa könnte man gegenwirken, indem man das Geheimnis statt mit einem
Zufallswert mit einem weiteren geheimen Wert, der im Programm steckt,
erweitert.
Nein, nein, nein!
Im Programm darf nichts stecken, was mit der Schlüsselerzeugung zu tun hat,
außer dem Algorithmus natürlich. Kein geheimer Wert! Wenn er im Programm
steckt, ist es kein Geheimnis mehr, das Programm hat der Kunde doch in der
Hand, der kann es untersuchen und wird den Wert finden.
Post by Daniel AlbuschatWas jedoch viel wichtiger ist, ist dass die künstliche Verlängerung
wieder revidiert werden kann, wenn man herausfindet, wo sich der nicht
verschlüsselte Startwert befindet.
Auch das ist falsch.
Der Startwert ist ja nicht geheim und wird deshalb nicht verschlüsselt. Er
dient auch nicht der Verlängerung des Schlüssels, sondern nur dazu, dass
jedesmal ein anderer Schlüssel erzeugt wird.
Beispiel: Der Normal-Benutzer wählt als Passwort "Sonne". Der zufällige
Startwert ist "&x4TG=#81Pgm".
Damit wird der Schlüssel aus "&xS4ToG=n#8n1Pegm" erzeugt. Du wirst zugeben,
dass eine solche Zeichenkette nicht in der Tabelle der gängigsten Passwörter
zu finden ist.
Der Witz am MD5-Hash ist, dass die Veränderung nur eines Bits bei der
Eingabe einen ganz anderen Hash-Wert ergibt. Viel Spaß beim Suchen nach
Übereinstimmungen.
Post by Daniel AlbuschatHier ist wieder nur ein Layer an Obskurität hinzugekommen.
Keineswegs. Der zufällige Startwert ist ja auch nicht meine Erfindung,
höchstens meine Wortschöpfung. In der Literatur firmiert der unter dem Namen
"Salt" (Salz in die Suppe des Angreifers streuen...)
Post by Daniel AlbuschatAußer bei einem Public-Key-Verfahren ist jede Verschlüsselung relativ
simpel durch Bruteforce knackbar [1].
Grundfalsch.
Public-Key-Verfahren nicht per Definition sicherer als symmetrische
Verfahren, sie dienen einem anderen Zweck, weil damit das
Schlüsseltausch-Problem gelöst werden kann. Um Schlüsseltausch geht es hier
aber gar nicht.
Ich schrieb schon, dass Du über Public-Key-Verfahren erst nachdenken musst,
wenn Du weißt, wo und wie Du den privaten Schlüssel aufbewahrst.
Gängige PK-Verschlüsselungsverfahren (PGP etwa) sind Hybrid-Verfahren: Auch
hier wird jedesmal neu ein zufälliger symmetrischer Schlüssel erzeugt
(allerdings erheblich aufwendiger als ich das tat) und damit die Nachricht
verschlüsselt. Dieser symmetrische Schlüssel wird an die Datei angehängt(!)
und - jetzt kommt's - mit dem öffentlichen Schlüssel verschlüsselt. Nur wer
den privaten Schlüssel hat, kann den symmetrischen Schlüssel entschlüsseln.
Und dann wird der Rest der Datei durch ein ganz normales symmetrisches
Verfahren wieder entschlüsselt.
Post by Daniel AlbuschatWenn du "berechtigterweise" erwähnst, fällt mir noch folgender Punkt
Muss es eine Möglichkeit der Entschlüsselung geben, wenn das Passwort
verloren wird?
Diese Möglichkeit darf es nicht geben.
Post by Daniel AlbuschatPost by Andre SokolewMeine Frage im OP bezieht sich darauf, ob ein MD5-Hash prinzipiell als
symmetrischer Schlüssel geeignet ist oder nicht.
Er ist genau so geeignet wie jeder andere 128-Bit-Wert.
Na, jeder andere sicher nicht.
Ein paar Mindestanforderungen müssen schon erfüllt sein...
Post by Daniel AlbuschatMeiner Meinung nach nicht besonders.
Warum nicht?
Post by Daniel AlbuschatIch würde dir empfehlen, vielleicht andere Standard-
Verschlüsselungsverfahren wie AES und Komponenten/Bibliotheken, die diese
implementieren, anzuschaun.
Mir ist schon klar, dass man XOR nur unter bestimmten Bedingungen für die
Verschlüsselung nehmen kann. Die sind hier meiner Meinung nach gegeben.
Das Problem ist aus meiner Sicht nicht das Verschlüsselungsverfahren,
sondern die Implementierung des Verfahrens. Auch mit so einer
Fertig-Komponente, die idealerweise auch fehlerfrei arbeitet, kann man bei
der Implementierung noch fürchterlich viel falsch machen.
Das XOR-Verfahren wäre das sicherste aller denkbaren
Verschlüsselungsverfahren und man bräuchte an alle anderen Verfahren keinen
Gedanken verschwenden, wenn beim Entschlüsseln
- derselbe geheime Schlüssel zur Verfügung steht wie bei der Verschlüsselung
und
- der Schlüssel absolut zufällig, gleichverteilt und
- genausolang wie die Nachricht ist,
- außerdem nur einmal verwendet wird,
- ansonsten aber sicher geheim bleibt.
Das zu schaffen oder anzunähern ist Aufgabe der Implementation.
Für mich hat sich gezeigt, dass die Schlüsselerzeugung eines der
gravierendsten Probleme ist. Deshalb meine Frage im OP.
Andre