Hi David,
hm, was soll ich jetzt antworten ?
Das du als "Laie" dich mit der Materie beschäftigen willst ist immer eine gute Idee, aber um wirklich gute Algorithmen entwickeln zu können solltest du eben auch die Grundlagen beherrschen. Ich meine damit folgende Fragen:
Move(Hash.DigestKey^, Register, SizeOf(Register)); // was bewirkt move hier genau und was macht dieses zeichen "^"?
Das ist eine Derefernezierung eines Pointers, schau in die Delphi Hilfe.
Move() kopiert also den Inhalt des durch den Hash berechneten Wertes über die Daten in das temporäre Register.
Delphi-Quellcode:
SetLength(Result, Length(Value)); //ich vermute mal, dass Value ein wert ist der
//der funktion übergeben wird oder der global ist?
Value ist dein String den du verschlüsseln möchtest und wird meisten als Parameter einer Funktion übergeben. Er könnte aber auch global sein oder lokal in einer nested Funktion oder dynamisch berechnet als Property eines Objektes das obigen Source in einer seiner Methoden enthält.
Delphi-Quellcode:
Hash.Init; // warum muss man init mehrmal aufrufen?
// wird dadurch ein wert wieder zurückgesetzoder so ?
Hash.Calc(Counter, Sizeof(Counter)); //wird hier der hash von counter an den von register angehängt oder
Hash.Calc(Register, SizeOf(Register)); // werden sie erst verbunden und dann gehasht ?
Hash.Done; // wie wird der hash vom passwort in diesen hash mit
.Init und .Done müssen aufgerufen werden um den Hash zu initialisieren und auch zu finalisieren. Das bedeutet das die Daten in Counter und Register bei mehrmaliger sequentieller Anwendung con .Calc() wie ein Datenblock aufgefasst werden. Man kann also damit verschiedene Daten so hashen als wären sie eines. .Done schließt diese Berechnung nun ab und berechnet somit den Digest des Hashs komplett.
Da Register den vorherigen Hash Digest enthält und nun wieder in die Berechnung einfließt entsteht eine Kette von miteinander verknüpften und voneinander abhängigen Daten. Da das erste Glied der Kette unser Password ist werden alle Glieder der voneinander abhängigen Kette auch abhängig vom Passwort sein.
Byte(Result[Counter]) := Byte(Value[Counter]) xor PByte(Hash.DigestKey)^; //was bewirkt byte und pbyte?
Ist ein Char wie in Result[Counter] typkompatibel zu einen einfach dereferenzierten Pointer ??
Result := StrToFormat(PChar(Result), Lenght(Result), fmtHEX); // was macht strtoformat? das finde ich in der hilfe nicht
Dann schau mal in
Unit DECUtils.pas rein.
Tja, das sind alles Fragen die einem daran zweifeln lassen das du mir deinem Werkzeug Delphi +
DEC so richtig umgehen kannst. Das ist weiß Gott nicht persönlich gemeint sondern eher ein Fakt.
Und Sicherheit in der Kryptographie wird nicht durch gute Algorithmen primär erzeugt, sondern EINZIGST das korrekte und fundierte WISSEN schafft die Sicherheit. Also auch das Wissen wie man seine Werkzeuge richtig benutzen muß.
Hoffe das dieser "Dämpfer" nicht falsch bei dir ankommt
Gruß Hagen