AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MD5 Algorithmus - Wo ist mein Fehler?

Ein Thema von B3ta · begonnen am 15. Jan 2015 · letzter Beitrag vom 21. Jan 2015
Antwort Antwort
Seite 2 von 2     12   
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#11

AW: MD5 Algorithmus - Wo ist mein Fehler?

  Alt 20. Jan 2015, 15:32
Der Rest sind Little-endian-Probleme! Hier eine Version mit meinen Änderungen (//*WE), die die richtigen Hashwerte für '', 'abc' und 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern' liefert:

Delphi-Quellcode:
procedure PrepareText;
var l,j: Int64;
var i: integer;
begin
  l:= Length(KlarText)*8;
  KlarText:= Klartext+ Chr(128);
  repeat
    KlarText:= KlarText+Chr(0);
  until Length(KlarText) mod 64 = 56;
  //*WE: Bitlaene als little-endian
  j := l;
  for i:=0 to 7 do begin
    KlarText:= KlarText+Chr(j and $ff);
    j := j shr 8;
  end;
end;

procedure HashMD5;
var A,B,C,D,temp,RotWert,FWert: LongWord;
var M: array[0..15] of LongWord;
var TempText,Hash: AnsiString;
var parts,p,j,g: integer; //Anzahl der 512 bit Stücke im KlarText
begin

  //Variablen auf Standard setzen:
  a0:= StrToInt('$67452301');
  b0:= StrToInt('$EFCDAB89');
  c0:= StrToInt('$98BADCFE');
  d0:= StrToInt('$10325476');

  PrepareText;

  parts:= Length(KlarText) div 64;

  for p:=1 to parts do begin
    TempText:= Copy(KlarText, ((p-1)*64+1), 64);
    for j:= 0 to 15 do begin
      //*WE: Block als little-endian
      M[j]:= ( ((Ord(TempText[4])) shl 24) or ((Ord(TempText[3])) shl 16) or
              ((Ord(TempText[2])) shl 8) or (Ord(TempText[1])) );
      Delete(TempText, 1, 4);
    end;

    A:=a0;
    B:=b0;
    C:=c0;
    D:=d0;

    for j:=0 to 63 do begin
      Case j of
        0..15: begin
          g:= j;
          FWert:= F1(B,C,D);
          temp:= D;
          D:= C;
          C:= B;
          RotWert:= (((A+FWert+K[j]+M[g]) shl s[j])
                      or ((A+FWert+K[j]+M[g]) shr (32-s[j])));
          B:= B+RotWert;
          A:= temp;
        end;

        16..31: begin
          g:= (5*j +1) mod 16;
          FWert:= F2(B,C,D);
          temp:= D;
          D:= C;
          C:= B;
          RotWert:= (((A+FWert+K[j]+M[g]) shl s[j])
                      or ((A+FWert+K[j]+M[g]) shr (32-s[j])));
          B:= B+RotWert;
          A:= temp;
        end;

        32..47: begin
          g:= (3*j +5) mod 16;
          FWert:= F3(B,C,D);
          temp:= D;
          D:= C;
          C:= B;
          RotWert:= (((A+FWert+K[j]+M[g]) shl s[j])
                      or ((A+FWert+K[j]+M[g]) shr (32-s[j])));
          B:= B+RotWert;
          A:= temp;
        end;

        48..63: begin
          g:= (7*j) mod 16;
          FWert:= F4(B,C,D);
          temp:= D;
          D:= C;
          C:= B;
          RotWert:= (((A+FWert+K[j]+M[g]) shl s[j])
                      or ((A+FWert+K[j]+M[g]) shr (32-s[j])));
          B:= B+RotWert;
          A:= temp;
        end;
      end;
    end;
    a0:= a0+A;
    b0:= b0+B;
    c0:= c0+C;
    d0:= d0+D;
  end;

  //*WE: Hash als little-endian
  Hash := IntToHex(a0 and $ff,2) +
          IntToHex((a0 shr 8) and $ff,2) +
          IntToHex((a0 shr 16) and $ff,2) +
          IntToHex((a0 shr 24) and $ff,2) +
          IntToHex(b0 and $ff,2) +
          IntToHex((b0 shr 8) and $ff,2) +
          IntToHex((b0 shr 16) and $ff,2) +
          IntToHex((b0 shr 24) and $ff,2) +
          IntToHex(c0 and $ff,2) +
          IntToHex((c0 shr 8) and $ff,2) +
          IntToHex((c0 shr 16) and $ff,2) +
          IntToHex((c0 shr 24) and $ff,2) +
          IntToHex(d0 and $ff,2) +
          IntToHex((d0 shr 8) and $ff,2) +
          IntToHex((d0 shr 16) and $ff,2) +
          IntToHex((d0 shr 24) and $ff,2) ;
  Form1.Label1.Caption:= Hash;

end;
  Mit Zitat antworten Zitat
B3ta

Registriert seit: 21. Nov 2014
9 Beiträge
 
Delphi 7 Personal
 
#12

AW: MD5 Algorithmus - Wo ist mein Fehler?

  Alt 20. Jan 2015, 18:02
Hallo gammatester,

Vielen Dank! Jetzt funktioniert alles, so wie es soll!
Dass ich das mit den little-endian Variablen anscheinend genau umgekehrt gemacht habe (oder noch anders?) Ist mir nicht aufgefallen. Ich dachte, das muss so.

Nichtsdestotrotz vielen Dank für deine Hilfe und Geduld

Lg B3ta
  Mit Zitat antworten Zitat
B3ta

Registriert seit: 21. Nov 2014
9 Beiträge
 
Delphi 7 Personal
 
#13

AW: MD5 Algorithmus - Wo ist mein Fehler?

  Alt 21. Jan 2015, 23:22
Da ich das Thema anscheinend selber nicht löschen kann (Oder die Funktion einfach übersehe) möchte ich hiermit darauf aufmerksam machen, dass das Problem gelöst ist und der Thread geschlossen/gelöscht werden kann

Lg B3ta
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz