Vieles wurde ja schon beantwortet, also nur par Hints von mir.
1.) Das Passwort wird in einen pseudozufälligen und sicheren Sessionkey umgewandelt. Dazu benutzt man sogenannte KDFs -> Key Derivation Functions -> Schlüsselableitungsfunktionen. Diese benutzen das Passwort + einen > = 128Bit Zufallswert im Zusammenhang mit einer Hashfunktion um aus dem immer gleichen Passwort einen sicheren, nicht rückrechenbaren und immer anderen, pseudozufälligen, Sessionkey zu erzeugen. Mit diesem Sessionkey wird der Cipher initialisiert und die Daten verschlüsselt.
2.) Mit einer MGF = Mask Generation Function, wird aus dem Passwort und einem Zufallswert = Salt, eine "Prüfsumme" erzeugt. Diese Prüfsumme + dem Zufallssalt, beides >= 128 Bit groß, wird noch vor der Verschlüsselung an den Anfang der Daten gehängt.
also
Salt_1 = RandomBinary(16);
Salt_2 = RandomBinary(16);
SessonKey = KDF(Salt_1, Passwort);
Checksum = MGF(Salt_2, SessionKey);
CipherText = ENCYPT(SessionKey, Salt_2 + Checksum + PlainText);
FinalData = Salt_1 + CipherText;
und entschlüsselt dann so:
Salt_1 = EXTRACT(FinalData, 1, 16);
SessionKey = KDF(Salt_1, Passwort);
Temp = DECRYPT(SessonKey, EXTRACT(FinalData, 16, MaxInt));
Salt_2 = EXTRACT(Temp, 1, 16);
Checksum = EXTRACT(Temp, 16, 16);
if Checksum <> MGF(Salt_2, SessionKey) then ShowMessage('Falsches Passwort');
PlainText := EXTRACT(Temp, 32, MaxInt);
Wir erzeugen also aus 128 Bit Zufall + Passwort einen Sessionkey. Aus diesem erzeugen wir mit 128 Bit Zufall eine Prüfsumme. Beide Werte sind geschützt mit einer Hashfunktion und pseudozufällig. Diese beiden Salts stehen dem Angreifer zwar indirekt zur Verfügung aber denoch kann er nicht, bzw. nur mit einem vorrausberechenbaren Aufwand, daraus Nutzen ziehen. Die Schranke dieses Aufwandes liegt bei 2^128 Kombinationen, eben weil wir beide Salt 16 Bytes groß gemacht haben. Bei einem gutem 128 Bit Password ist also im Sessionkey und Prüfsumme 128 Bit Zufall gemischt mit 128 Bit Passwort. Defakto musst du dir das so vorstellen als ob du ein Passwort benutzt das aus 128 Bit festem Teil und 128 Bit zufälligem Teil besteht und bei dem diese beiden Teile mit einander verknüpft worden sind, so das sie nicht durch den Angreifer getrennt werden können.
Da unsere Prüfsumme über den pseudozufälligen Sessionkey gleich zweimal von 2 Zufallssalts abhängig ist kann der Angreifer keine Informationen rausziehen. Den Salt_1 kann er zwar extrahieren muß dann aber 2^128 Passwörter durchprobieren. Hat er eines probiert muß er den Anfang der Daten damit entschlüsseln und den 2. Salt extrahieren. Hat er falsch gewählt so würde der 2. Salt, der ja auch verschlüsselt wurde, eben falsch entschlüsselt. Die Wahrscheinlichkeit das er mit diesem falschen 2. Salt und der falsch entschlüsselten Prüfsumme zum falschen Sessionkey eine denoch gültige Prüfsumme vor sich hat ist dann exakt so groß wie die Wahrscheinlichkeit das er alle Werte korrekt gewählt hat. Und das ist die Essenz des Verfahrens. Somit gewinnt er keinerlei Informationen im Vergleich falsch zu richtig entschlüsselt, und muß immer eine komplette Brute Force Attacke fahren. Bei diesem "Informationsgewinn" geht es primär nur darum ob er seinen Angriff beschleunigen kann, nicht darum ob er eine korrekte Entschlüsselung identifizieren kann.
Zusätzlich schützt diese Methode das Passwort und damit den Benutzer vor optimierten Brute Force Attacken wie zb. Wörterbuchangriffen -> Rainbow Tables.
Gruß Hagen
Ja Mann, Respekt