Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

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

Re: Dateien verschlüsseln - aber wie?

  Alt 29. Sep 2003, 17:09
Hi Daniel,

Willst du DEC echt sicher verwenden musst du auch mit Objecten umgehen und programmieren können.
Du bist also nicht zu doof sondern lässt dir von mir nichts sagen. Verwende NICHT diese Komponenten, sondern erlerne wie man die DEC Klassen direkt benutzen kann. Nichts anderes machen diese Komponenten, nur mit dem Unterschied das sie viel zu unfelxibel und auch unsicher sind.

Erstmal: es ist KEIN Sicherheitsrisiko sich von vornherein nur auf einen Cipher und einen Hash Algorithmus zu beschränken. Im Gegenteil, es ist sogar eine zusätzliche Sicherheit und es kann dir im besten Falle 400Kbyte an Code in deiner EXE einsparen. Bedenke, im DEC sind 40 Cipher und 25 Hash Algorithmen implementiert. ALLE diese Klassen werden in die EXE eingelinkt wenn mit den Manager-Komponenten gearbeitet wird !
Das einzigst WICHTIGE ist das wenn der von dir ausgewählte Algorithmus in Zukunft gebrochen wird, und somit unsicher wird, das dein Code mit minimalsten Änderungen auf einen anderen und sicheren Algorithmus ausweichen kann. Dazu ist DEC prädistiniert.

Nun, du willst kurze Strings verschlüsseln und dazu Hashbasierte Passwörter benutzen. Dabei willst du sicherstellen das du später sehr schnell den Algo. wechseln kannst.

Delphi-Quellcode:
const
  DefCipherClass: TCipherClass = TCipher_Blowfish;
  DefHashClass: THashClass = THash_SHA1;
  DefStringFormat: Integer = fmtMIME64;

function RandomString(Len: Integer): String;
// erzeugt Zufallsstring
begin
  SetLength(Result, Len);
  RndSeedBuffer(Result[1], Len);
end;
  
function Encode(const Value, Password: String): String; overload;
// verschlüsselt String in Value mit Password
// dabei wird der PlainText zusätzlich mit Zufallsdaten am Anfang expandiert
// um bestimmte Angriffe zu verhindern
var
  Data: String;
begin
  with DefCipherClass.Create('', nil) do
  try
    Mode := cmCFB;
    HashClass := DefHashClass;
    InitKey(Password, nil);
    Data := RandomString(BufSize) + Value;
    Result := EncodeString(Data, DefStringFormat);
  finally
    Free;
    ProtectString(Data); // Speicher von Data wird überschrieben
  end;
end;

function Decode(const Value, Password: String): String; overload;
begin
  with DefCipherClass.Create('', nil) do
  try
    Mode := cmCFB;
    HashClass := DefHashClass;
    InitKey(Password, nil);
    Result := DecodeString(Value, DefStringFormat);
    Delete(Result, 1, BufSize); // lösche BufSize Bytes Zufallsstring
  finally
    Free;
  end;
end;

begin
// nun alle in der EXE möglichen Algos. registrieren, falls man mehrere dynamisch benutzen will
  RegisterDECClasses([TCipher_Blowfish, TCipher_IDEA, THash_MD5, THash_SHA1]);
// nun unsere globalen Klassentypen setzen
  DefCipherClass := DECClassByName('Blowfish', TCipher) as TCipher;
  DefHashClass := DECClassByName('MD5', THash) as THash;
// oder eben
  DefCipherClass := DECClassByName('IDEA', TCipher) as TCipher;
  DefHashClass := DECClassByName('SHA1', THash) as THash;
// oder hardcoded
  DefCipherClass := TCipher_Rijndael;
  DefHashClass := THash_RipeMD256;
end;
Wie du oben siehst geht alles sehr einfach ohne die Manager Komponenten, und wenn die Unit DECClasses.pas NICHT verwendet wird, würden im obigen Beispiel auch nur die Algorithmen Blowfish,IDEA,Rijndael,MD5,SHA1 und RipeMD256 in die EXE eingelinkt.

Noch einiges zu den Funktionen "Encode" und "Decode".
1.) sie erzeugen die nötigen Hashobjectes und Cipherobjecte selber, initialisieren sie mit dem Passwort, verschlüsseln die Daten und zerstören sofort dabach diese Objecte. D.h. deren Lebenszeit ist die kürzt mögliche Lebenszeit überhaupt. Die Managerkomponenten arbeiten im Gegensatz dazu, und würdem somit Spyprogrammen die die Speicherbereiche deiner Anwendungen ausspionieren viel Freiraum geben um das Passwort des Benutzer's zu finden.
JEDE Komponentenbasierte Verschlüsselung hat das Problem das deren Lebenszeit viel zu lange dauert. Somit kann man während dieser Lebenszeit mit einer Spysoftware deren Speicherbereiche analysieren um somit an das Passwort zu kommen. Grundsätzlich sollte die Lebenszeit kryptographischer Objecte also so kurz wie möglich gehalten werden. Dies geht aber nur wenn man diese Objecte erst wenn man sie benötigt erzeugt, dann benutzt und sofort wieder zerstört.
2.) ich benutze den CipherMode cmCFB. Dieser ist zwar lansgammer als andere Ciphermodes, dafür ist er aber ein vielfaches sicherer mit sehr kurzen Nachrichten.
3.) die eigentliche Nachricht wird am Anfang mit Zufallsbytes vergrößert. D.h. Encode() verschlüsselt als erstes mal paar Bytes Zufallsdaten und erst dann die eigentliche Nachricht. Dies ist enorm wichtig damit man z.B. keine "known Cipher Text" Attacks machen kann.


Gruß Hagen
  Mit Zitat antworten Zitat