Einzelnen Beitrag anzeigen

Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#69

Re: VerschlüsselungsProgramm

  Alt 24. Aug 2005, 07:43
Zitat von Sharky:
Zitat von Luckie:
... Das heißt wiederum, der Seed entspricht dem Passwort oder?
Uff... so genau bin ich da auch nicht eingestiegen

Aber das Passwort zu verwenden macht eigentich keinen Sinn. Denn wenn dieses geknackt wurde wäre ja auch der Seed bekannt.
Bei einer Verschlüsselung verwendest Du ja neben dem Passwort noch einen Salt. Über diesen zusammengesetzten Schlüssel bildest Du dan eine Einweg Hashfunktion und mit Ergebniss verschlüsselst Du die Daten. Der Salt muss dafür [d]natürlich unverschlüsselt[/d] in der Datei mit abgelegt werden. Denn Seed (Startwert) den Du benötigst um einen Salt (Zufallswert) erzeugen zu können legst Du in deinem Programm fest (z.B. eine GUID).
[edit]Das mit dem unverschlüsselt war natürlich unsinn[/edit]
Ich habe hier noch einen Text von Hagen in dem er mir das einal erklärt hat. Ich hoffe er hat nichts dagegen wenn ich ihn hier post
Zitat von negaH:
Du verschlüsselst eine Datei und dabei gibt es wichtige Punkte wie man dies macht
1.) das Passwort muß in einen Sessionkey umgewandelt werden. Dazu wird das Passwort und ein Zufallserzeugter Salt benutzt. Beide Werte werden verbunden, und zwar Salt und dann Passwort. Der Salt sollte mindestens 128 Bit groß sein. Nun wird über diesen binären Wert eine Hashfunktion angewendet. Diese Hashfunktion sollte eine MGF = Mask Generation Funktion sein. Dazu wird eben NICHT einfach nur ein Hash über Salt || Passwort erzeugt, sondern die hashfunktion wird mehrmalig über sich selber angewendet und mit einem Zähler versehen. Also so ähnlich wie beim S/KEY OTP Verfahren.
2.) nun haben wir unseren Sessionkey der nur mit Hilfe des relativ kurzen Passwortes errechenbar ist. Der Salt stellt sicher das ein Angreifer nicht so ohne weiteres eine Dictionary Attacke durchführen kann. Desweiteren Randomisiert der Salt auch den erzeugten Sessionkey, d.h. mit gleichem Passwort wird aber immer ein unterschiedlicher Salt benutzt und somit immer ein unterschiedlicher Sessionkey produziert. Ergo auch die Verschlüsselung der gleichen Inhalte unterscheidet sich, sogar ohne expliziten InitVecter des Ciphers.
3.) nun, es wird nun ein zweiter Salt_2 benötigt, ebenfalls 128 Bit lang. Dieser Salt dient zur Randomisierung der Verschlüsselung. Dazu wird wiederum aus Hash(Salt_2 || Sessionkey) ein Hash produziert. Wie du siehst benutzen wir unseren Sessionkey und einen zweiten Salt dazu. Der erzeugte Hashwert + Salt_2 wird nun VOR die Message gehangen, also Data := Salt_2 || Hash(Salt_2 || Sessionkey) || Message, anschließend wird Data verschlüsselt. Da Salt_2 zufällig ist wird Hash(Salt_2 || Sessionkey) ebenfalls zufällig und die die Message zudem mit Zufallsdaten expandiert.
3.) nachdem so die Nachricht verschlüsselt wurde, muss natürlich noch der 1. Salt davor gehangen werden. Dies benötigen wir damit bei der Entschlüsselung auch der Sessionkey reproduiziert werden kann.

Nochmal als Formel:
Ciphertext = Ck(Key, Plaintext) ist die verschlüsselung.
Digest = MGF(Data, Index) ist eine Mask Generation Funktion mit hilfe eines hashs.
Salt_Key = > 128 Bit Zufallswert für den Sessionkey
Salt_Msg = > 128 Bit Zufallswert für die Nachricht
|| = Konkatenation, Zusammenhängen von binären Daten
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat