Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#17

Re: Verschlüsselung erkennen

  Alt 10. Aug 2003, 12:32
Ok ich versuche mal einen kurzen Abriß zu geben.

Was benötigen wir:
1.) eine Hashfunktion wie SHA1
2.) einen symmetrischen Cipher wie AES Rijndael
3.) einen Zufallsgenerator wie YARROW
4.) einen Komprimierungsalgo. eventuell

Man will eine Datei verschlüsseln, hat das Passwort und einen Dateisourcestream und Outputstream.

Zuerst erzeugen wir mir dem Randomgenerator YARROW einen Salt. Dieser Salt dient dazu das Password zu sichern und es zufällig zu machen. Desweiteren dient er zu randomisierung des Verschlüsselungsprozesses.
Nachfolgend NUR ein Pseudocode um besser den Algo. zu zeigen.

Delphi-Quellcode:
type
  THeader = packed record
    Ident: Cardinal; // identifiziert das Dateiformat
    Salt: array[0..19] of Byte; // randomisiert das Passwort
    SessionKey: array[0..19] of Byte; // zur überprüfung des Passwortes
  end;

procedure Encrypt(const Source,Dest: TStream; const Password: String);
var
  Header: THeader;
begin
// initialisiere Header
  Header.Ident := $12345678;

// erzeuge Salt, ein "Zufallswert" der NICHT zurückberechnenbar ist
  RunYarrow(Header.Salt, SizeOf(Header.Salt));

// erzeuge Sessionkey
  Header.SessionKey := RunSHA1(Header.Salt + Password);
  
  InitEncrypt(Header.SessionKey);
  EncryptCBC(Header.SessionKey);
  Dest.Write(Header);
  EncryptCBC(Source, Dest);
  EncryptCBCDone(Dest);

{ man erzeugt Zufallsdaten, diese + Password werden durch eine
  Hashfunktion in ein SessionKey umgewandelt mit dem Verschlüsselt wird.
  Der SessionKey wird mit sich selber verschlüsselt.
  Der Header wird in Dest geschrieben.
  Die Source wird nach Dest verschlüsselt.
  WICHTIG! dabei ist das Encrypt(SessionKey) + Encrypt(Source, Dest)
  keine voneinander getrennten Verschlüsselungen sind. Es werden also
  SessionKey + Source als ein zusammengehöriger Datenstrom behandelt.
 
  D.h. Man kann SessionKey nur entschlüsseln wenn man den korrekten
  Sessionkey kennt. Wird entschlüsselt muß aus dem gespeichert Salt +
  Password der gleiche SessionKey erzeugt werden, dann wird
  Header.SessionKey entschlüsselt und mit dem aktuellen Schlüssel
  verglichen. Sollten sie ungleich sein so ist das Entschlüsselungs-
  passwort falsch. Da der Salt aus dem Passwort einen Zufäligen SessionKey
  erzeugt MUSS demzufolge die Verschlüsselung auch zufällig sein.
  Da der Header.SessionKey als erster Block verschlüsselt wird wird
  auch der Schlüsselstrom zufällig.
}

end;
So das ertmal zum Prinizp. Jetzt stellst du erstmal mehr Fragen und dann sehen wir mal ob ich eine kleine Unit baue

Gruß Hagen
  Mit Zitat antworten Zitat