Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi MD5 Checksumme und Range Checking (https://www.delphipraxis.net/98285-md5-checksumme-und-range-checking.html)

TSHObject 24. Aug 2007 11:59


MD5 Checksumme und Range Checking
 
Hallo,

ich möchte den MD5-Hash über einen Stream/Datei berechnen.

Zuerst habe ich es mit dieser Variante versucht:

http://www.koders.com/delphi/fid5A4F...DF205615E.aspx

und dann noch mit dieser hier:

http://www.delphipraxis.net/internal...ct.php?p=65767

Beide Versionen funktionieren, solange man das Range-Checking im Projekt ausgeschaltet hat.
Compiliert man das Projekt mit Range-Checking so crasht die Sache wegen einem Integer Overflow
und zwar hier. (code schnippsel aus der Variante 2).

Delphi-Quellcode:
// Write new 'state' back
  State[0] := State[0] + a;
  State[1] := State[1] + b;
  State[2] := State[2] + c;
  State[3] := State[3] + d;
// Zeroize sensitive information.
Frage, hat jemand dies auch schon bemerkt ? Und evtl. eine Lösung.

Vielen Dank.

negaH 24. Aug 2007 12:12

Re: MD5 Checksumme und Range Checking
 
Range Checking deaktivieren. Der Source ist richtig, allerhöchstens sind die Datentypen falsch und sollten Cardinal statt Integer sein. Aber, das hilft nur in neueren Delphi Versionen, in älteren würde das Range Checking beim Typ Cardinal so gemacht wie beim Typ Integer, also vorzeichenbehaftet wo es eigentlich ohne Vorzeichen gehen müsste. Nun dann nütz aber das Range Checking rein garnichts mehr da die meisten Cryptosourcen einen Überlauf

A := A + B

als

A := (A + B) mod 2^32

ausnutzen. Es ist also gewollt das ein Überlauf entsteht. Ansonsten müsste der Programmierer auch A := (A + B) mod 2^32 berechnen was aber beim Datentyp Cardinal unsinnig ist das der nur bis 2^32-1 reicht. Ergo würde der Compiler das erkennen und diese Beerechnung in den nächt höheren Datentyp umrechnen, das wäre Int64. Nun dadurch verlangsamt sich aber der komplette Code gewaltig da die Int64 Routionen RTL Funktionen sind, statt direkte 32 Bit Operationen.

Ergo: der Compiler wirft hier dem Programmier stängig Knüppel durch zwischen die Beine und macht ungewoltes. Also Range Checking deaktivieren. Dieses aktive Compilerfeature ist eh immer unzuverlässiger geworden, mit jeder Delphi Version ein bischen schlechter.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 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