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-Funktion versagt bei größeren Strings (https://www.delphipraxis.net/129347-md5-funktion-versagt-bei-groesseren-strings.html)

Ruio 17. Feb 2009 15:11


md5-Funktion versagt bei größeren Strings
 
Delphi-Quellcode:
uses WCrypt2;
...
function md5(const Input: String): String;
var
  hCryptProvider: HCRYPTPROV;
  hHash: HCRYPTHASH;
  bHash: array[0..$7f] of Byte;
  dwHashLen: DWORD;
  pbContent: PByte;
  i: Integer;
begin
  dwHashLen := 16;
  pbContent := Pointer(PChar(Input));

  Result := '';

  if CryptAcquireContext(@hCryptProvider, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT or CRYPT_MACHINE_KEYSET) then
  begin
    if CryptCreateHash(hCryptProvider, CALG_MD5, 0, 0, @hHash) then
    begin
      if CryptHashData(hHash, pbContent, Length(Input), 0) then
      begin
        if CryptGetHashParam(hHash, HP_HASHVAL, @bHash[0], @dwHashLen, 0) then
        begin
          for i := 0 to dwHashLen - 1 do
          begin
            Result := Result + Format('%.2x', [bHash[i]]);
          end;
        end;
      end;
      CryptDestroyHash(hHash);
    end;
    CryptReleaseContext(hCryptProvider, 0);
  end;

  Result := AnsiLowerCase(Result);
end;
Bei kleineren Strings kommt noch der richtige Hash raus, aber bei größeren ist er immer "53ceefef504648ec8063411a1fa3d1c2". Wo liegt denn das Problem?

Sharky 17. Feb 2009 15:27

Re: md5-Funktion versagt bei größeren Strings
 
Zitat:

Zitat von Ruio
... Wo liegt denn das Problem?

Hai Ruio,

woher ist den denn Unit "WCrypt2" ?

Cyberbob 17. Feb 2009 15:31

Re: md5-Funktion versagt bei größeren Strings
 
Ich schließe mich der Frage an. Vielleicht leigt der Fehler gar nicht bei deinem Code! Hast du den Quellcode der Crypt-Lib?
Ab wann tritt der Fehler denn auf?

Ruio 17. Feb 2009 15:33

Re: md5-Funktion versagt bei größeren Strings
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich häng die unit mal an.

ich habe nur gemerkt, dass die Hashs bei größeren Strings immer gleich sind.

nahpets 17. Feb 2009 15:35

Re: md5-Funktion versagt bei größeren Strings
 
Hallo,

wcrypt2 gibt es hier:

http://www.koders.com/delphi/fid9FA8...px?s=algorithm

gammatester 17. Feb 2009 15:55

Re: md5-Funktion versagt bei größeren Strings
 
Enthält input #0-Zeichen (oder Unicode)? Dann sind's vielleicht Probleme mit dem PChar-Typecast.

Gammatester

Ruio 17. Feb 2009 16:01

Re: md5-Funktion versagt bei größeren Strings
 
Och nö, nicht schon wieder :kotz:
Dann muss ich wohl anders überprüfen ob eine Datei noch aktuell ist.

Luckie 17. Feb 2009 16:17

Re: md5-Funktion versagt bei größeren Strings
 
Nimm einfach eine andere MD5 Implementation -- gibt ja genug davon.

Ruio 17. Feb 2009 17:40

Re: md5-Funktion versagt bei größeren Strings
 
So ich hab jetzt das hier gennomen:
http://assarbad.net/stuff/!export/md5.zip
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt ist eine Exception der Klasse EIntOverflow mit der Meldung 'Integerüberlauf' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Zeile 445
Delphi-Quellcode:
// Write new 'state' back
  State[0] := State[0] + a;
Bekommt man das weg?
Oder Soll ich was anderes nehmen?

himitsu 17. Feb 2009 18:10

Re: md5-Funktion versagt bei größeren Strings
 
Eventuell ist der Überlauf geplant ... und man müßte nur die Prüfung abschalten. :gruebel:

Ruio 17. Feb 2009 20:41

Re: md5-Funktion versagt bei größeren Strings
 
Damit gehts:
http://delphi.about.com/od/objectpas...i-md5-hash.htm

Luckie 18. Feb 2009 09:28

Re: md5-Funktion versagt bei größeren Strings
 
Also ich habe mit der Unit von Assarbad keine Probleme gehabt.

himitsu 18. Feb 2009 10:21

Re: md5-Funktion versagt bei größeren Strings
 
Liste der Anhänge anzeigen (Anzahl: 1)
konnte mir auch nicht denken, daß die schon so lange bei ihm rumliegt und sich sonst noch keiner beschwert hat ...

drum hab ich ja die Bereichsüberprüfung im Verdacht, da Jene meistens deaktiviert ist.


@Ruio: ist die Bereichsprüfung bei dir aktiv? (siehe Projektoptionen)

wenn ja, dann schalt diese mal ab, oder (was wohl besser ist), füge folgende Zeile in die md5.pas ein

Code:
[b]unit[/b] MD5;

[color=#ff0000][b]{$OVERFLOWCHECKS OFF}[/b][/color]

[b]interface[/b]

Ruio 18. Feb 2009 17:32

Re: md5-Funktion versagt bei größeren Strings
 
Ich glaub die ist aktiviert, aber ich nehm das jetzt das mit den Indys.


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