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
 
B3ta

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

MD5 Algorithmus - Wo ist mein Fehler?

  Alt 15. Jan 2015, 15:11
Hallo zusammen,

Für ein Schulprojekt arbeite ich momentan daran, den MD5 Algorithmus in Delphi zu "rekonstruieren" orientiert habe ich mich dabei hauptsächlich an dem Pseudocode der zu dem Algorithmus auf Wikipedia zu finden ist (Link)
Ich habe das jetzt meines erachtens nach ziemlich genau so wie dort im Pseudo Code in Delphi rekonstruiert, und das Programm startet auch ohne mir irgendeinen Fehler auszugeben.

Allerdings ist das Ergebnis, das mein Algorithmus mir ausgibt ein anderes als es eigentlich sein sollte. So bekomme ich zum Bespiel für einen leeren String nicht wie erwartet den hash-Code: "d41d8cd98f00b204e9800998ecf8427e" Sondern bei mir: "ed41a20e3a99f08c0a329113c39ee592"
Ich bin meinen Quelltext jetzt auch schon etliche male durchgegangen und habe nach potentiellen Fehlern gesucht, habe aber bisher keine gefunden. Deshalb frage ich hier um Rat, ob vielleicht von euch irgendjemand den Fehler entdeckt.

Hier mein Code:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var KlarText: AnsiString;
    a0,b0,c0,d0: LongWord;
    K: Array[0..63] of LongWord;
    Form1: TForm1;
const s: Array[0..63] of LongWord = (7,12,17,22, 7,12,17,22, 7,12,17,22, 7,12,17,22,
                                      5,9,14,20, 5,9,14,20, 5,9,14,20, 5,9,14,20,
                                      4,11,16,23, 4,11,16,23, 4,11,16,23, 4,11,16,23,
                                      6,10,15,21, 6,10,15,21, 6,10,15,21, 6,10,15,21);


implementation

{$R *.dfm}

{-----------------------------------------------------------------------------}
function F1(x,y,z:LongWord):LongWord;
begin
  Result:= (x and y) or ((not x) and z);
end;

function F2(x,y,z:LongWord):LongWord;
begin
  Result:= (x and z) or (y and (not z));
end;

function F3(x,y,z:LongWord):LongWord;
begin
  Result:= x xor y xor z;
end;

function F4(x,y,z:LongWord):LongWord;
begin
  Result:= y xor (x or (not z));
end;

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;

  for i:= 0 to 7 do begin
    j:= l;
    //ShowMessage(IntToStr(j));
    j:= j shl (i*8);
    //ShowMessage(IntToStr(j));
    j:= j shr 56;
    KlarText:= KlarText+Chr(j);
  end;

  {for i:=1 to Length(Klartext) do begin
    ShowMessage('Buchstabe an Stelle ' + IntToStr(i) + ':' + Klartext[i]);
  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,i,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 i:=1 to parts do begin
    TempText:= Copy(KlarText, ((i-1)*64+1), 64);
    for j:= 0 to 15 do begin
      M[j]:= ( ((Ord(TempText[1])) shl 24) or ((Ord(TempText[2])) shl 16) or
              ((Ord(TempText[3])) shl 8) or (Ord(TempText[4])) );
      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:= i;
          FWert:= F1(B,C,D);
          temp:= D;
          D:= C;
          C:= B;
          RotWert:= (((A+FWert+K[i]+M[g]) shl s[i])
                      or ((A+FWert+K[i]+M[g]) shr (32-s[i])));
          B:= B+RotWert;
          A:= temp;
        end;

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

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

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


  Hash:= IntToHex(a0,8)+ IntToHex(b0,8)+IntToHex(c0,8)+IntToHex(d0,8);
  Form1.Label1.Caption:= Hash;

end;

{-----------------------------------------------------------------------------}
procedure TForm1.Button1Click(Sender: TObject);
begin
  KlarText:= Edit1.Text;
  HashMD5;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
  for i:=0 to 63 do begin
    K[i]:= floor(abs(sin(i+1))* Power(2,32));
  end;
end;

end.
Vielen Dank im vorraus und ich hoffe jemand kann mir helfen.

Lg B3ta
  Mit Zitat antworten Zitat
 


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 13:34 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