Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:01 Uhr.
Seite 1 von 2  1 2      

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