Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Big-Endian nach Little-Endian (https://www.delphipraxis.net/15892-big-endian-nach-little-endian.html)

CalganX 5. Feb 2004 21:08


Big-Endian nach Little-Endian
 
Hi,
ich habe mir heute mal den MD5-Algorithmus angesehen, den Assarbad hier gepostet hat (MD5MD5). Nun habe ich das auch soweit mit seiner Hilfe hinbekommen einen String zu verschlüsseln.

Nun nannte er mir gerade noch die Stichwörter Big Endian und Little Endian. Über Google habe ich dann auch soweit herausgefunden, was das ist (wusste es bereits, hatte es aber verdrängt).
Im BDN habe ich auch einen Artikel gefunden, der beschreibt, wie man Double's konvertiert. Allerdings ist das Ergebnis eines MD5-Algorithmus ja nicht gerade Double-Mäßig, sondern eher ein Mix aus Zahlen und Buchstaben.

Google hat mir aber nichts dazu gesagt, wie ich mit Delphi einen MD5-Code hin-und-her-konvertiere.
Darum wende ich mich mal wieder an die DP und hoffe auf Hilfe zu dieser Frage. ;)

Chris

PS: Ich wünsche mir keine Diskussion darüber, ob ich wirklich MD5 verwenden soll, oder nicht. Es geht mir hier nur darum schnellstmöglich mal eben für PHP sowas zu schreiben, weil ich immer wieder diese Werte brauche.

negaH 6. Feb 2004 01:52

Re: Big-Endian nach Little-Endian
 
Per Definition ist der MD5 Digest ein Array[0..15] of Byte. Somit ist eine Konvertierung überhaupt nicht erforderlich, da auf Big Endian und Little Endian Maschinen das Array[0..15] immer identisch im Speicher abgelegt wird. Erst wenn man mit Datentypen wie Word oder Integer oder Int64 arbeitet entstehen die Probleme.

Es gibt einige Big Endian MD5, XYZ Hash Impelemntierung die dummerweise irgendwas in BigEndian konvertieren wollen, aber dies ist grundsätzlich falsch bei Hash Digest's (ausser Haval)
Zb. beim Blowfish Verschlüsselungs Algo. gab es da schlimme Verwirrungen da Bruce Schneier darüber keinerlei Aussagen getroffen hat.

Gruß Hagen

Pseudemys Nelsoni 6. Feb 2004 01:59

Re: Big-Endian nach Little-Endian
 
mal ne dumme frage, was ist denn big/little-endian?

CalganX 6. Feb 2004 06:41

Re: Big-Endian nach Little-Endian
 
Hi,
@PN: Guckst du hier...

@Hagen: hm. Dann frage ich mich folgendes: wenn PHP mir bei einem beliebigen String mit md5() den Wert d41d8cd98f00b204e9800998ecf8427e ausgibt und mein Delphiprogramm, dass nach Assarbad's MD5-Eintrag in der CodeLib folgendermaßen aussieht
Delphi-Quellcode:
function MD5String(s:String): TMD5digest;
begin
  result := MD5_Hash_OverBuffer( @s[1], Length(s) );
end;

function CreateMD5(s: String): string;
begin
  Result := MD5_Hash2String(MD5String(s));
end;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  edtOutput.Text := CreateMD5(edtInput.Text);
end;
dann 47f8a3c383d73373f3830ba72f02aad3 ausgibt, woran das liegen kann!? ... :gruebel:

Chris

negaH 6. Feb 2004 17:59

Re: Big-Endian nach Little-Endian
 
Zitat:

wenn PHP mir bei einem beliebigen String mit md5() den Wert d41d8cd98f00b204e9800998ecf8427e ausgibt
Wenn PHP bei einem BELIEBIGEN String immer das gleiche Resultat ausgibt dann würde ich sagen das entweder PHP Shit ist oder du nicht richtig PHP gecodet hast.

Gruß Hagen

Alexander 6. Feb 2004 18:05

Re: Big-Endian nach Little-Endian
 
Also bei mir funktioniert das in PHP problemlose. Da kommt immer was verschiedenes raus (außer man verschlüsselt den gleichen String...)

CalganX 6. Feb 2004 18:11

Re: Big-Endian nach Little-Endian
 
Hi,
nein, PHP gibt immer was anderes aus. Ich wollte jetzt nur nicht sagen, von welchem Wort das genannte der md5-Schlüssel ist... ;)
Das Problem ist einfach, dass der "Delphi"-MD5-Hash länger ist (und anders), als das PHP-Derivat (sagt man das so? :gruebel:).

Chris

d3g 6. Feb 2004 19:36

Re: Big-Endian nach Little-Endian
 
Zitat:

Zitat von Pseudemys Nelsoni
mal ne dumme frage, was ist denn big/little-endian?

Little Endian ist die Angewohnheit von bestimmten Prozessoren (u.a. x86) die Bytes verkehrt herum im Speicher abzulegen ("Least significant byte first"). Beispiel: Ein Word hat den Wert 48849, was hexadezimal BE:EF wäre. Im Speicher steht jedoch EF:BE.

Zitat:

Zitat von Chakotay1308
Das Problem ist einfach, dass der "Delphi"-MD5-Hash länger ist (und anders), als das PHP-Derivat (sagt man das so? :gruebel:).

Länger? Beides 16 Byte, wenn ich noch richtig zählen kann. Was die Endianess angeht: Assarbad schreibt doch, dass er den Algorihmus in RFC 1321 übersetzt hat. In eben diesem RFC heißt es:

Zitat:

Zitat von RFC 1321
The implementation is portable and should work on many different
plaforms. However, it is not difficult to optimize the implementation
on particular platforms, an exercise left to the reader. For example,
on "little-endian" platforms where the lowest-addressed byte in a 32-
bit word is the least significant and there are no alignment
restrictions, the call to Decode in MD5Transform can be replaced with
a typecast.

An der Endianess kann es also nicht liegen, wenn ich das richtig sehe.

negaH 7. Feb 2004 01:12

Re: Big-Endian nach Little-Endian
 
Zitat:

Little Endian ist die Angewohnheit von bestimmten Prozessoren (u.a. x86) die Bytes verkehrt herum im Speicher abzulegen ("Least significant byte first"). Beispiel: Ein Word hat den Wert 48849, was hexadezimal BE:EF wäre. Im Speicher steht jedoch EF:BE.
Hm :)

Big Endian ist die Angewohnheit von bestimmten Prozessoren (u.a. Motorola) die Bytes verkehrt herum im Speicher abzulegen.

Die Entwicklung ging von 8Bit über 16Bit zu 32Bit Rechnern. Will man Kompatibilität zischen den einzelnen Rechnertypen so wird zwangsläufig ein Little-Endian System herauskommen.

Somit sind es die Big-Endian Maschinen die als erstes die Bytes "vertauscht" haben. Nungut man kann sich darüber aber streiten.

Beispeil:

Der Speicher ist so aufgebaut

Code:
Zelle 0   1   2   3

      $12 $23 $45  $67
Wir wollen in die obige Zahl lesen,

Code:
 8 bit System = Byte =                                    Zelle[0] =         $12
16 Bit System = Word =                        Zelle[1] || Zelle[0] =      $23 12
32 Bit System = Long = Zelle[3] || Zelle[2] || Zelle[1] || Zelle[0] = $67 45 23 12
Die Adresse ist aber jedesmal die gleiche im Speicher ! Somit wären Programme auf solchen 8,16,32 Bit Systemen Speicherkompatibel obwohl sie breitere Datenzugriffe benutzen. Dies trifft auf Big-Endian Machinen nicht zu.


@Chakotay1308, poste mal zwei Beispiele, jeweils PHP und Assarbad's MD5.

Gruß Hagen

CalganX 7. Feb 2004 09:38

Re: Big-Endian nach Little-Endian
 
Hi,
also... hier die jeweiligen Ausgaben des Strings "mirt459":
Code:
Assarbad's MD5: 47f8a3c383d73373f3830ba72f02aad3
PHP:           d41d8cd98f00b204e9800998ecf8427e
Komisch ist jedoch, wenn ich bspw. den String "delphipraxis" codiere gibt es das gleiche Ergebnis... :|

Chris

d3g 7. Feb 2004 14:55

Re: Big-Endian nach Little-Endian
 
Zitat:

Zitat von negaH
Big Endian ist die Angewohnheit von bestimmten Prozessoren (u.a. Motorola) die Bytes verkehrt herum im Speicher abzulegen.

Darüber kann man sich vortrefflich streiten. Es mag sein, dass die Little-Endian-Vorgehensweise historisch gesehen sinnvoller ist, aber für einen Human Reader, der an die g-adische Darstellung gewöhnt ist (und hier handelt es sich nur um eine 256-adische Darstellung), ist es doch viel sinnvoller, das Most Significant Byte zuerst zu schreiben. Daher würde ich die Byte-Order von Big Endian als "richtig herum" bezeichnen.

Zitat:

Zitat von Chakotay1308
Komisch ist jedoch, wenn ich bspw. den String "delphipraxis" codiere gibt es das gleiche Ergebnis...

Weißt du was? Wenn du den String "mirt459" hier umrechnest, kommt dasselbe Ergebnis wie bei Assarbad heraus.

Und auch das Tool aus den GNU Textutils gibt Assarbads Ergebnis aus:
Code:
ben@picard:~$ echo -n "mirt459" | md5sum
47f8a3c383d73373f3830ba72f02aad3  -
Dein PHP-Source ist wohl in irgendeiner Weise falsch.

CalganX 7. Feb 2004 15:07

Re: Big-Endian nach Little-Endian
 
Hi,
okay. Dann werde ich das mal überprüfen...

Danke für die Hilfe,
Chris

negaH 9. Feb 2004 00:24

Re: Big-Endian nach Little-Endian
 
@Chakotay1308:

Chewie sagt's ja schon, Assarbads MD5 ist richtig. Ich habe das mit meinem DEC überprüft und komme auf's gleiche Resultat. Du solltest jetzt überprüfen ob PHP an den String zusätzliche Zeichen wie #0, #13 oder #10 rangehängt hat.

Gruß Hagen

DXler 4. Mär 2004 11:35

Re: Big-Endian nach Little-Endian
 
@alle:

Ich hatte mal die MD5-Routinen von Indy getestet und damit gab es keine Probleme. :P

Als Alternative würde ich das mal antesten. Dann sieht man ja, wo der "Hund begraben" ist.

mgubler 4. Mär 2004 11:53

Re: Big-Endian nach Little-Endian
 
Du möchtest string A ("Hallo Welt") mit md5 verschlüsseln und beispielsweise in der var strMD5 speichern!
Und dann die Variable strMD5 zurückverwandeln in den ursprüngelichen String (also "Hallo Welt"), oder wie muss ich das verstehen?

Wenn es so ist, dann kann ich Dir versichern, dass das NICHT GEHT!!!

Gruss,
mgubler

CalganX 4. Mär 2004 15:02

Re: Big-Endian nach Little-Endian
 
Hi,
mir ist schon klar, dass das nicht geht. Das will ich ja auch gar nicht ausprobieren. ;)

Es ging lediglich darum, dass scheinbar PHP und Delphi verschiedene Ausgaben hatten. ;) Lag allerdings alles an meiner Dummheit... :wall: ;)

Chris

johny 5. Mär 2004 11:49

Re: Big-Endian nach Little-Endian
 
Zitat:

Zitat von Chakotay1308
Hi,
mir ist schon klar, dass das nicht geht. Das will ich ja auch gar nicht ausprobieren. ;)

Es ging lediglich darum, dass scheinbar PHP und Delphi verschiedene Ausgaben hatten. ;) Lag allerdings alles an meiner Dummheit... :wall: ;)

Chris

Nun, verschiedene Werte können auch aufgrund des Salt-Wertes zustande kommen.

http://www.aspheute.com/artikel/20040105.htm

Lag bei dir aber wohl an etwas anderem.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz