Einzelnen Beitrag anzeigen

TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.853 Beiträge
 
Delphi 12 Athens
 
#8

AW: Hilfe bei Umstellung Unit DEC5.1 zu DEC6.0

  Alt 15. Jan 2024, 21:20
@TurboMagic
Dankeschön...keinen Stress.

Vieleicht hast auch dann mal 5 Minuten Zeit, mir das "Grundprinzip" (Was brauche ich wofür...für die Zukunft) zu erkären.

Danke...

Nachtrag:
Ich stelle die Daten mal zusammen...
Hier mal was ungetestetes, aber es compiliert:

Delphi-Quellcode:
unit Tools.Crypt;

interface

uses
  System.SysUtils,
  DECUtil, DECHash,
  //DECCipher, DECFmt;
  DECHashBase, DECCipherBase, DECCiphers, DECFormatBase, DECFormat,
  DECHashAuthentication, DECRandom;

const
  conKey = 'aYr14iaz8u)xO7Ok';

var
  CipherMode: TCipherMode = cmCBCx;
  HashClass: TDECHashClass = THash_SHA256;
  TextFormat: TDECFormatClass = TFormat_MIME64;
  KDFIndex: LongWord = 1;

type
  TToolsCrypt = class
  public
    class function Decrypt(aHash: string; aKey: string = ''): string;
    class function Encrypt(aText: string; aKey: string = ''): string;
  end;

implementation

{ TToolsCrypt }

class function TToolsCrypt.Decrypt(aHash, aKey: string): string;
var
  Cipher: TCipher_Rijndael;
  Salt: RawByteString; //Binary;
  Data: RawByteString;
  Check: RawByteString;
  Pass: RawByteString;
  PassBytes: TBytes;
  Len: Integer;
begin
  if aKey = 'then
  begin
    aKey := conKey;
  end;

  Cipher := TCipher_Rijndael.Create;
  try
    Salt := ValidFormat(TextFormat).Decode(RawByteString(aHash));
    Len := Length(Salt) - 16 - Cipher.Context.BufferSize;
    Data := Copy(Salt, 17, Len);
    Check := Copy(Salt, Len + 17, Cipher.Context.BufferSize);
    SetLength(Salt, 16);
    PassBytes := TDECHashAuthentication(ValidHash(HashClass)).KDFx(aKey[1],
                                                                   Length(aKey) * 2,
                                                                   Salt[1],
                                                                   Length(Salt),
                                                                   Cipher.Context.KeySize,
                                                                   KDFIndex);
    SetLength(Pass, Length(PassBytes));
    Move(PassBytes[0], Pass[low(Pass)], Length(PassBytes));

    Cipher.Mode := CipherMode;
    Cipher.Init(Pass);
    SetLength(Result, Len div 2);
    Cipher.Decode(Data[1], Result[1], Len);
    if Check <> Cipher.CalcMAC then
    begin
      Result := '';
    end;
  finally
    Cipher.Free;
    //ProtectBinary(Salt);
    ProtectString(Salt);
    ProtectString(Data);
    ProtectString(Check);
    ProtectString(Pass);
  end;
end;

class function TToolsCrypt.Encrypt(aText, aKey: string): string;
var
  Cipher: TCipher_Rijndael;
  SaltBytes : TBytes;
  Salt: RawByteString; //Binary;
  Data: RawByteString; //Binary;
  Pass: RawByteString; //Binary;
  PassBytes: TBytes;
begin
  if aKey = 'then
  begin
    aKey := conKey;
  end;

  Cipher := TCipher_Rijndael.Create;
  try
    SaltBytes := RandomBytes(16); //RandomBinary(16);
    SetLength(Salt, Length(SaltBytes));
    Move(SaltBytes[0], Salt[low(Salt)], Length(SaltBytes));

    PassBytes := TDECHashAuthentication(ValidHash(HashClass)).KDFx(aKey[1],
                                                                   Length(aKey) * 2,
                                                                   Salt[1],
                                                                   Length(Salt),
                                                                   Cipher.Context.KeySize,
                                                                   KDFIndex);
    SetLength(Pass, Length(PassBytes));
    Move(PassBytes[0], Pass[low(Pass)], Length(PassBytes));

    Cipher.Mode := CipherMode;
    Cipher.Init(Pass);
    SetLength(Data, Length(aText) * 2);
    Cipher.Encode(aText[1], Data[1], Length(Data));
    Result := string(ValidFormat(TextFormat).Encode(Salt + Data + Cipher.CalcMAC));
  finally
    Cipher.Free;
    ProtectString(Salt);
    ProtectString(Data);
    ProtectString(Pass);
  end;
end;

end.
  1. Units wurden sprechender benannt
  2. Es wurden Units aufgesplittet, daher sind weitere einzubinden
  3. Der in DEC definierte Datentyp Binary, ein Alias zu AnsiString, wurde entfernt
  4. DEC nutzt heutzutage lieber TBytes oder teilweise RawByteString
  5. Der obige Code basiert auf meiner aktuellen Entwicklungsversion, sollte aber auch mit dem aktuellen Release 6.4.1 kompatibel sein

DU erwänst oben DEC 6.0. Meinst du wirklich 6.0 oder eine neuere? Falls 6.0 warum nutzt du diese und nicht eine neuere?

Grüße
TurboMagic
  Mit Zitat antworten Zitat