![]() |
Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
Hallo,
im Zuge der Umstellung eines Projekts auf Delphi 2009 muß ich auch die DEC Library aktualisieren. Bisher wurde die Version 3 verwendet. Nur wie stellt man das korrekt auf die Version 5 um? Teilweise fehlen ja Funktionalitäten (oder ich finde sie nicht mehr):
Bin für jede Hilfe dankbar! :-) Grüße, Uli |
Re: Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
Zumindest für den ersten Punkt bin ich etwas schlauer: CRC Unit (hab die komplett übersehen :oops: )
Aber auch hier hab ich nun das Problem, daß irgendwie nichts so recht zusammenpassen will: Wie muß ich denn den folgenden code übersetzen, daß da identischen Werte rauskommen?:
Delphi-Quellcode:
oder auch nur die einfachere Variante
Hash.THash_CRC32.CalcString(strText, TMAC.Create(strPassword, nil), fmtHEX);
Delphi-Quellcode:
Meine Versuche mit
Hash.THash_CRC32.CalcString(strText, nil, fmtHEX);
Delphi-Quellcode:
liefern immer verschiedene Werte.
strResultV5 := IntToHex(CRC.CRCCalc(CRC_32, buffer, Length(strText)), 4);
Ich bräuchte hier dringend eine Lösung. Alternative: welche Bibliothek ausser DEC kann man sonst verwenden und wie müßte man sie konfigurieren um die gewünschten Werte zu erhalten. Problem ist halt: ich hab nicht wirklich eine Ahnung von Verschlüsselung und muß ein Projekt auf Delphi 2009 umstellen :-( Grüße, Uli |
Re: Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
Hi,
die DEC 3 und DEC 5.x unterscheiden sich in vielen Punkten. Wir hatten kürzlich ziemlich genau das gleiche Thema hier: ![]() Wahrscheinlich stimmen auch die Datentypen nicht mehr, z.B. ein (Ansi)String in D7-D2007 soll das gleiche wie ein UnicodeString in D2009 ergeben. Das kann dann nicht gut gehen. Probier es doch mal mit AnsiStrings aus, dann wirst Du schon beim CRC etc die gleichen Werte erhalten. Für UnicodeStrings mußt Du entsprechend an Binärdaten arbeiten, wobei Length(Text) * SizeOf(Text[1]) dann als Länge übergeben würde. In Deinem Fall also z.B.
Delphi-Quellcode:
Dann geht es erstmal mit Ansi. Aber Du wirst Ansi-Werte niemals = Unicode-Werte bekommen (das hat auch nichts mit DEC 3 <> DEC 5 zu tun).
var
StrPassword, StrResultV5, StrText: AnsiString Gruß Assertor |
Re: Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
Ich hab das Problem auch schon in Delphi2007, da ich nun erst mal auf die DEC5.2 umstellen wollte und dann weiter auf Delphi 2009.
Grüße, Uli |
Re: Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
Hi Uli,
dann sag mal bitte genau, was Du machen möchtest. Möchtest Du etwas verschlüsseln, einen Hash errechnen, Text konvertieren oder eine Prüfsumme berechnen (CRC)? Welches Eingabeformat, welches Ausgabeformat (z.B. Text, Binär, MIME64). Die DEC Funktionen selbst arbeiten einwandfrei, ich habe Testcases gegen alle Encodings, Cipher und Hashes gefahren als ich die DEC 5.1 auf D2009 portiert habe... Also her mit den Vorgaben und etwas mehr Kontext zu dem Problem :) Gruß Assertor |
Re: Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
Hi,
Dann mal los: 1) Hashwerte berechnen für einen Couponcode: (Wert wird dann mit einer Liste von gespeicherten verglichen und wenn dort gefunden, dann ist der Coupon gültig; Problem ist, daß die Coupons schon im Umlauf sind, also nicht einfach neu erstellt werden können) Der bisherige Code mit DEC3 war:
Delphi-Quellcode:
wobei strText und strPassword Ansi-Strings sind. Da ich das Programm selbst zwingen kann, hier weiter mit ANSI Strings für strText und strPassword zu arbeiten, bräuchte ich nun eine Variante von DEC5, die mir für gegebene Wert den gleichen Wert liefert wie die bestehende DEC3 Variante.
strCoupon := Hash.THash_CRC32.CalcString(strText, TMAC.Create(strPassword, nil), fmtHEX);
2) Weiter hab ich das Problem, daß es Daten gibt, die bisher mit BlowFish/Mime64 verschluesselt wurde. Diese Daten muß ich nun wieder mit DEC 5 entschlüsseln können (Erst mal mit Delphi 2007, dann aber auch mit Delphi 2009). Dazu hab ich nun den folgenden DEC 5 code verwendet:
Delphi-Quellcode:
leider liefert dieser nun für einen mit DEC 3 und
with DECCipher.TCipher_Blowfish.Create do
try Init(strPassword); strResultV5 := EncodeBinary(strText, DEC5_DECFmt.TFormat_MIME64); finally Free; end;
Delphi-Quellcode:
verschlüsselten Text nicht wieder den Originaltext. Auch hier das Problem: die verschlüsselten Daten sind im Umlauf und können nicht so einfach durch neue ersetzt werden.
with Cipher.TCipher_Blowfish.Create(strPassword, nil) do
try strResultV3 := DecodeString(CodeString(strText, paDecode, fmtMIME64)); finally Free; end; Danke, Uli |
Re: Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
Hi,
Zitat:
![]() Ich selbst arbeite nicht mit der "alten" DEC 3. Was sich da wo geändert hat, weiß ich nicht und da kann ich Dir leider nicht wirklich weiterhelfen... Gruß Assertor |
Re: Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
Hi,
werd ich morgen früh gleich mal ausprobieren. Aber auf alle Fälle schon mal vielen Dank für deine Hilfe! Grüße, ULi |
Re: Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
Hi Uli,
Zitat:
Gruß Assertor |
Re: Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
So, wieder etwas schlauer geworden: :lol:
Der DEC 3 Variante
Delphi-Quellcode:
entspricht im DEC 5 der folgende Code:
Hash.THash_CRC32.CalcString(FText, TMAC.Create(FPassword, nil), fmtHEX);
Delphi-Quellcode:
Beide DEC Varianten liefern damit den identischen Hashwert. Damit ist der erste meiner Punkte schon mal gelöst! :firejump:
var
// DEC5_xyz entspricht der unit xyz aus DEC 5 (hab sie nur umbenannt) strResultV3: ANSIString; strResultV5: ANSIString; cResult: Cardinal; objCRCDef: DEC5_CRC.TCRCDef; strKey: ANSIString; cVector: Cardinal; begin // DEC 3 Variante: // strResultV3 := Hash.THash_CRC32.CalcString(FText, TMAC.Create(FPassword, nil), fmtHEX); // BEGIN TMAC5.Create(...) Entsprechung // neuen Startwert berechnen cVector := $FFFFFFFF; DEC5_CRC.CRCSetup(objCRCDef, $04C11DB7, 32, $FFFFFFFF, $FFFFFFFF, True); DEC5_CRC.CRCCode(objCRCDef, PAnsiCHar(FPassword)^, Length(FPassword)); cResult := DEC5_CRC.CRCDone(objCRCDef); strKey := DEC5_DECFmt.TFormat_Copy.Encode(cResult, 4); DEC5_DECUtil.XORBuffers(cVector, PAnsiChar(strKey)^, Length(strKey), cVector); // Damit CRC wieder initialisieren FillChar(objCRCDef, SizeOf(objCRCDef), #0); DEC5_CRC.CRCSetup(objCRCDef, $04C11DB7, 32, $FFFFFFFF, $FFFFFFFF, True); objCRCDef.CRC := cVector; // END TMAC5.Create(...) Entsprechung // und damit den Hash-Wert nun entgueltig berechnen cResult := DEC5_CRC.CRCCode(objCRCDef, PAnsiCHar(FText)^, Length(FText)); cResult := DEC5_CRC.CRCDone(objCRCDef); strResultV5 := DEC5_DECFmt.TFormat_HEX.Encode(cResult, 4); // CheckEqualsString(strResultV3, strResultV5); end; Grüße, Uli |
Re: Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
Und der nächste Punkt ist gelöst:
Delphi-Quellcode:
aus DEC 3 kann durch folgenden Code in DEC 5 ersetzt werden:
THash_MD5.CalcString(FText, TMAC.Create(FPassword, nil), fmtHEX);
Delphi-Quellcode:
Grüße,
var
strKey: ANSIString; ... begin ... // erst mal Password Hashen mit MD5 strKey := DEC5_DECHash.THash_MD5.CalcBinary(FPassword, DEC5_DECFmt.TFormat_Copy); with DEC5_DECHash.THash_MD5.Create do try Init; // Digest mit gehashtem Password verknuepfen DEC5_DECUtil.XORBuffers(Digest^, PAnsiChar(strKey)^, Length(strKey), Digest^); Calc(PAnsiChar(FText)^, Length(FText)); Done; strResultV5 := DigestStr(DEC5_DECFmt.TFormat_HEX); finally free; end; ... end; Uli |
Re: Umstellung DEC 3 auf DEC5.2: fehlende Funktionalität?
Hi Uli,
das schaut doch richtig gut aus und ist bestimmt eine Hilfe für Spät-DEC-Wechsler, die jetzt gleichzeitig vor dem Wechsel von DEC 3 zu DEC 5.x und dem Wechsel von Dx zu D2009 stehen. Gruß und Danke, Assertor :dp: |
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