Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DECUtil alt auf DECUtil 5.2 (https://www.delphipraxis.net/165522-decutil-alt-auf-decutil-5-2-a.html)

tsteinmaurer 3. Jan 2012 21:00

DECUtil alt auf DECUtil 5.2
 
Hallo,

ich steh hier irgendwie auf dem Schlauch.

Ich hab einen D2006 Legacy Code, der eine ältere DECUtil Version verwendet. Dieser Legacy-Code zum Entschlüsseln eines Passworts soll nach D2010 portiert werden. Da ich die alte DECUtil Version unter D2010 nicht compiliert bekomme, versuche ich DECUtil 5.2 einzusetzen. Im Wesentlichen kommt beim Encode nicht mehr das Richtige raus, d.h. das entschlüsselte Passwort, das ich für eine Datenbankverbindung benötige, stimmt nicht mehr.

Alter Code mit älterer DecUtil Version:
Delphi-Quellcode:
function Decrypt(APassword: String): String;
begin
  with TCipher_Blowfish.Create(KEYSTR, nil) do begin
    try
      Mode := TCipherMode(0);
      Result := CodeString(APassword, paDecode, fmtDefault);
    finally
      Free;
    end;
  end;
end;
Versuch der Entschlüsselung mit DECUtil 5.2 wie folgt:
Delphi-Quellcode:
const
  C_KEYSTR: AnsiString = 'xyz';
  CipherMode: TCipherMode = cmCTSx;
  TextFormat: TDECFormatClass = TFormat_MIME64;

procedure TForm1.Button1Click(Sender: TObject);
var
  b: Byte;
begin
  with TCipher_Blowfish.Create do
  begin
    try
      Mode := CipherMode;
      Init(C_KEYSTR, SizeOf(C_KEYSTR), b, 0);
      ShowMessage(DecodeBinary(Edit1.Text, TextFormat));
    finally
      Free;
    end;
  end;
end;
Im zweiten Beispiel steht in Edit1.Text das verschlüsselte Passwort drinnen. Der Wert für KEYSTR und C_KEYSTR ist identisch.

Hat da jemand eine Idee? Danke!

ULIK 4. Jan 2012 13:04

AW: DECUtil alt auf DECUtil 5.2
 
Kann das ein Problem sein, daß das Password ein String ist (nun Unicode, vorher Ansi)? Was passiert denn, wenn Du es zuvor auf RawByteString konvertierst? Dann stimmt zumindest die Anzahl der Bytes.

Grüße,
Ulrich

pko 5. Jan 2012 19:19

AW: DECUtil alt auf DECUtil 5.2
 
schau mal

var
ACipherClass: TDECCipherClass = TCipher_Blowfish; //TCipher_1DES;//TCipher_Rijndael;
ACipherMode: TCipherMode = cmCTSx;
AHashClass: TDECHashClass = THash_Whirlpool;
(** oder *******
THash_MD2
THash_MD4
THash_MD5
THash_RipeMD128
THash_RipeMD160
THash_RipeMD256
THash_RipeMD320
THash_SHA
THash_SHA1
THash_SHA256
THash_SHA384
THash_SHA512
THash_Haval128
THash_Haval160
THash_Haval192
THash_Haval224
THash_Haval256
THash_Tiger
THash_Panama
THash_Whirlpool
THash_Whirlpool1
THash_Square
THash_Snefru128
THash_Snefru256
THash_Sapphire
*********)
ATextFormat: TDECFormatClass = TFormat_HEX; //TFormat_Mime64;
AKDFIndex: LongWord = 1;



function TRegisterClass.EncodeCipher( Input, Key: String ): String;
var
ASalt: Binary;
AData: Binary;
APass: Binary;
begin
with ValidCipher(ACipherClass).Create, Context do
try
ASalt := RandomBinary(16);
APass := ValidHash(AHashClass).KDFx(Key[1], Length(Key) * SizeOf(Key[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
Mode := ACipherMode;
Init(APass);
SetLength(AData, Length(Input) * SizeOf(Input[1]));
Encode(Input[1], AData[1], Length(AData));
Result := ValidFormat(ATextFormat).Encode(ASalt + AData + CalcMAC);
finally
Free;
ProtectBinary(ASalt);
ProtectBinary(AData);
ProtectBinary(APass);
end;
ShowMessage('EncodeCipher: '+result);
end;

function TRegisterClass.DecodeCipher( Input, Key: String ): String;
var
ASalt: Binary;
AData: Binary;
ACheck: Binary;
APass: Binary;
ALen: Integer;
begin
with ValidCipher(ACipherClass).Create, Context do
try
ASalt := ValidFormat(ATextFormat).Decode(Input);
ALen := Length(ASalt) - 16 - BufferSize;
AData := System.Copy(ASalt, 17, ALen);
ACheck := System.Copy(ASalt, ALen + 17, BufferSize);
SetLength(ASalt, 16);
APass := ValidHash(AHashClass).KDFx(Key[1], Length(Key) * SizeOf(Key[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
Mode := ACipherMode;
Init(APass);
SetLength(Result, ALen div SizeOf(Input[1]));
Decode(AData[1], Result[1], ALen);
if ACheck <> CalcMAC then
raise Exception.Create('Invalid data');
finally
Free;
ProtectBinary(ASalt);
ProtectBinary(AData);
ProtectBinary(ACheck);
ProtectBinary(APass);
end;
ShowMessage('DecodeCipher: '+result);
end;

tsteinmaurer 12. Jan 2012 12:13

AW: DECUtil alt auf DECUtil 5.2
 
Danke für die Rückmeldungen. Bzgl. dem Unicode-Aspekt hatte ich ein paar Dinge ausprobiert, aber nicht wirklich auf einen grünen Zweig gekommen.

@Klaus: Danke für das Beispiel. Ist das einfach eine Umsetzung decodieren und encodieren oder ist dein Encodiern mit meinem decodierten String dahingehend kompatibel, dass dein Code für DECUtil 5.2 quasi der Ersatz für meine Umsetzung in der älteren DEC-Version ist?

Danke und lg.

Assertor 12. Jan 2012 12:56

AW: DECUtil alt auf DECUtil 5.2
 
Hallo Thomas,

ich habe leider im Moment wenig Zeit, aber schau mal hier:
http://www.delphipraxis.net/124314-u...auf-5-2-a.html

Viele Grüße
Assertor

pko 12. Jan 2012 15:12

AW: DECUtil alt auf DECUtil 5.2
 
such doch mal oben nach DECUtil 5.2


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr.

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