Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

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

Re: bitte verschlüsselungsfunktion bewerten/testen

  Alt 29. Nov 2005, 17:44
Gerade eben

Das ist ein MDC = Message Digest Cipher, wenn auch deine Impelemntierung ziemlich unkonvetionell bzw. umständlich ist.

Ein MDC benutzt das Passwort als Seed und erzeugt dann wiederholt durch hashen dieses Seeds einen Schlüsselstrom der mit XOR die Nachricht verschlüsselt. Ansich eine gute Idee da so sichergestellt wird das es keine Zurückrechenbaren Abhängigkeiten vom Passwort zum produzierten Schlüsselstrom gibt.
Auf alle Fälle weit weit besser als Delphi Random zu benutzen.

Aber wie überall gibts ein Problem: Einige MDC sind unsicher und wurden gebrochen, sogar ziemlich viele. Das lag aber meisten daran wir der Seed erneut in den neuen Seed per Hash eingerechnet wurde. MDC sind also in der Verrschlüsselung verpönt, man wendet sie deshalb nicht an weil es Verschlüselungsalgos. gibt die exakt auf die Aufgabe "Verschlüsseln" hin konstruiert und analysiert wurden. MDC mißbrauchen quasi eine Hashfunktion die ganz andere Aufgaben erledigen soll zur Konstruktion einer Verschlüsselung. Der Beweis der Sicherheit einer MDC ist weit schwieriger als bei einer gleichstarken Verschlüsselung.

B.Schneier meint das man sie nicht anwenden sollte.

Auf Grund deiner Art&Weise über String zu arbeiten, mod 31 durchzuführen, immer nur nach X zeichen des MDC zu berechnen würde ich meinen das einiges dadurch unsicherer wird, heist das dadurch Angriffsmöglichkeiten existieren werden die bei einem rein binär arbeitenden MDC nicht existent sind.

Mache folgendes:

Delphi-Quellcode:
var
  Hash: THash;
  Counter: Cardinal;
  Register: array[0..19] of Byte;
begin
  SetLength(Result, Length(Value));
  Hash := THash_SHA1.Create;
  try
    Hash.Init;
    Hash.Calc(Password[1], Length(Password));
    Hash.Done;
    for Counter := 1 to Length(Value) do
    begin
      Move(Hash.DigestKey^, Register, SizeOf(Register));
      Hash.Init;
      Hash.Calc(Counter, Sizeof(Counter));
      Hash.Calc(Register, SizeOf(Register));
      Hash.Done;
      Byte(Result[Counter]) := Byte(Value[Counter]) xor PByte(Hash.DigestKey)^;
    end;
  finally
    Hash.Free;
  end;
  Result := StrToFormat(PChar(Result), Lenght(Result), fmtHEX);
end;
Gruß Hagen
  Mit Zitat antworten Zitat