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